反汇编测试
int g(int x){ return x+3; } int f(int x){ int i = 13; return g(x)+i; } int main(void){ return f(8)+1; }
测试代码如上图
实现过程:
首先使用
gcc -g -no-pie -fno-pic -m32 week20191224 -o week20191224
去除<__x86.get_pc_thunk.ax>,使得不提前获得下一条指令的地址。然后使用gdb week20191224 进行调试。

进行gbd后
设置main函数断点 b main 后运行
使用disassemble指令获取汇编代码,并用i r查看寄存器的值


使用display查看这寄存器中的数值,并查看当前$eip中指令:

main函数:

main 函数将FP压栈:push %ebp,使FP指向
,并将f(8)送到地址为$0x8的堆栈之中。
f函数:

汇编代码:


分析与main函数雷同。

为int i=13分配空间并分配空间temp

将局部变量i存入栈中 movl $0xd,-0x4(%ebp),并将参数传递
g函数:



期望地址为endbr32,将FP压栈后指向

将参数x=5放入 mov 0x8(%ebp),%eax

运算 $0x3,%eax

将FP复制到SP,弹出堆栈到pop %ebp,返回调用f

清除参数,回复现场


将i=13赋值,并计算add11+13


将FP复制到SP,弹出堆栈,返回main

清除参数,恢复现场

计算24+1,add $0x1,%eax

将FP复制到SP,弹出堆栈,返回ctr0.
| 指令 | eip | ebp | esp | eax | 堆栈 |
| endbr32 | 0x8049185 | 0xffffd0e8 | 0xffffd0e8 | -132526968 | |
| push %ebp | 0x8049189 | 0xffffd0e8 | 0xffffd0e0 | -134526968 | |
| mov %esp,%ebp | 0x804918a | 0xffffd0e8 | 0xffffd0dc | -134526968 | |
| sub $0x10,%esp | 0x804918c | 0xffffd0dc | 0xffffd0dc | -134526968 | |
| movl $0xd,-0x4(%ebp) | 0x804918f | 0xffffd0dc | 0xffffd0cc | -134526968 | |
| pushl 0x8(%ebp) | 0x8049196 | 0xffffd0dc | 0xfffffd0cc | -134526968 | |
| call 0x8049176 | 0x8049199 | 0xffffd0dc | 0xffffd0c8 | -134526968 | |
| add $0x4,%esp | 0x804919e | 0xffffd0dc | 0xffffd0c8 | 11 | |
| mov -0x4(%ebp),%edx | 0x80491a1 | 0xffffd0dc | 0xffffd0cc | 11 | |
| add %edx,%eax | 0x80491a4 | 0xffffd0dc | 0xffffd0cc | 11 | |
| leave | 0x80491a6 | 0xffffd0dc | 0xffffd0cc | 24 | |
| ret | 0x80491a7 | 0xffffd0e8 | 0xffffd0e0 | 24 |
浙公网安备 33010602011771号