跟踪eip和esp

本文为张银奎老师《代码调试》一书中关于的栈实验,记录下照猫画虎的学习过程。

代码:

汇编如下:

 

bp a!main 设置断点    g执行到这个断点

 

0:000> r eip,esp
eip=00401020 esp=0013ff84

 

0:000> dd esp l1
0013ff84  00401115

 

p单步执行一次

 

0:000> r eip,esp
eip=00401022 esp=0013ff80

 

esp中压入一个int所需空间,向下减去4

 

t进入函数

 

0:000> r eip,esp
eip=00401000 esp=0013ff7c

 

esp又减去4个字节,压入了函数的返回后的地址  可以用dd esp l1显示返回地址的内容

0:000> dd esp l1
0013ff7c  00401027

 

光标定位到ret 4一行,ctrl+F10执行到这一行,观察eip和esp

0:000> r eip,esp
eip=0040101a esp=0013ff7c

 

esp内容和刚进入函数时一样,栈保持平衡。

 

p单步执行,到达c3 ret

 

0:000> r eip,esp
eip=00401027 esp=0013ff84

 

esp增加了8,和刚进入main时一样,参数被被调用函数func清理。

 

0:000> dd esp l1
0013ff84  00401115

 

 

任务描述 分析版本1内核,回答下列问题: 1.在 0 号进程执行 fork 系统调用中的陷入指令(int 0x80)之前,当前指令位置(CS:EIP栈位置(SS:ESP)分别是多少? 2.使用 si 命令执行了该指令后,新指令位置栈位置分别是多少? 3.此时栈中保存的恢复点位置用户栈位置分别是多少? 相关知识 为了完成本关任务,你需要掌握: 1.跟踪到系统调用的陷入指令(int 0x80)执行之前; 2.响应中断/异常时,CPU 做了哪些工作; 3.查看当前寄存器的状态; 4.查看当前栈顶的状态 环境准备 本关卡使用版本 1 内核进行分析,设置方式与以前相同。 启用 gdb 进行调试跟踪到 main 函数入口,方法与前面的实训相同。 跟踪到系统调用的陷入指令(int 0x80)执行之前 一般而言,可以在该系统调用处设置断点,跟踪到该断点,然后使用 si 命令单步执行到陷入指令。但是,对于 main 函数里的 fork 系统调用,不能这样操作(因为 gdb 有时断点设置不够准),可以先跟踪到前一行的 move_to_user_mode 语句,然后使用 n 单步执行,即可到达 fork 系统调用的开始,此时再反汇编,找到陷入指令: 然后再通过 si 单步执行,跟踪到陷入指令 (int 0x80) 。 响应中断/异常时,CPU 做了哪些工作 从中断现场恢复使用用户栈,回到以前的 CPU 状态(一般是用户态),回到恢复点继续运行。是中断发生时 CPU 所做动作的逆过程。此时,核心栈里存放着中断现场,如下图所示: 上图显示了栈中中断现场的结构,(OLD SS:OLD ESP) 描述了用户栈顶的位置,(OLD CS:OLD EIP) 描述了恢复点的位置。 如何查看当前寄存器的状态 使用 gdb 调试命令 info registers 即可,如下所示: 也可以单独查看某一个寄存器: 如何查看当前栈顶的状态 可以使用命令 x 来查看: 上面显示了栈顶的 5 个长字,是某异常发生时的中断现场,其中存储的用户栈顶的位置是 0x17:0x2573c ,存储的恢复点的位置是 0xf:0x7967 。需要注意的是,x86 中栈是从高地址向低地址方向增长的,这里的栈顶位置是 0x1fa0c 。 编程要求 根据相关知识,回答问题:(将答案填写在/data/workspace/myshixun/第四关.txt中) 1.在 0 号进程执行 fork 系统调用中的陷入指令(int 0x80)之前,当前指令位置(CS:EIP栈位置(SS:ESP)分别是多少? 2.使用 si 命令执行了该指令后,新指令位置栈位置分别是多少?此时栈中保存的恢复点位置用户栈位置分别是多少? 测试说明 平台会对你的操作进行检测,同时会对文档的内容进行检测。请完成操作并且填写文档内容之后再点击评测。
最新发布
12-09
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值