反汇编测试
反汇编测试
任务代码
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 week030320191323.c -o week030320191323指令在64位的机器上产生32位汇编并去除<__x86.get_pc_thunk.ax>,然后使用gdb week030320191323指令进入gdb调试:
![]()
-
设置main函数
b main断点并运行,使用disass指令获取汇编代码,用i r指令查看所有寄存器的值:


- 使用
display指令查看各寄存器中的值,以及当前$eip中存储地址所对应的指令
![]()
main函数中
-
main函数将FP压栈
push %ebp,让FP指向保存的FPmov %esp, %ebp,同时将即将调用函数f的参数x = 8推送到堆栈中push $0x8
![]()
-
调用函数f
push eip ; jump 0x8049185
![]()
f函数中
-
获取汇编代码
![]()
-
验证调用函数地址是否为期望函数
endbr32
![]()
-
f函数将FP压栈
push %ebp,让FP指向保存的FPmov %esp, %ebp
![]()
-
向下移动SP为自动局部变量i =13分配空间,同时分配临时工作空间temp
sub $0x10,%esp
![]()
-
将自动局部变量 i = 13存入栈中
movl $0xd,-0x4(%ebp),并将所获得参数x作为下一个调用函数的参数继续传递

- 调用函数g
push eip ; jump 0x8049176
![]()
g函数中
- 获取汇编代码

- 验证调用函数地址是否为期望函数
endbr32

- g函数将FP压栈
push %ebp,让FP指向保存的FPmov %esp, %ebp

- 将参数x = 8放入%eax中
mov 0x8(%ebp),%eax,运算x + 8add $0x3,%eax

- 将FP复制到SP中,弹出堆栈到FP
pop %ebp(因为SP本就指向保存FP,所有没有执行leave),返回调用f
![]()
f函数中
-
清除堆栈参数恢复原始状态
add $0x4, %esp恢复现场
![]()
-
将i = 13赋值到%edx中
mov -0x4(%ebp),%edx,计算11 + 13add %edx,%eax
![]()
-
将FP复制到SP中,弹出堆栈到FP
leave,返回调用mainret
![]()
main函数中
-
清除堆栈参数恢复原始状态
add $0x4, %esp恢复现场
![]()
-
计算24 + 1
add $0x1,%eax
![]()
-
将FP复制到SP中,弹出堆栈到FP
leave,返回调用ctr0ret
![]()
f函数中寄存器和堆栈值的变化情况
| 指令 | eip | ebp | esp | eax | 堆栈(高->低) |
|---|---|---|---|---|---|
| endbr32 | 0x8049185 | 0xffffd3c8 | 0xffffd3c0 | -134551544 | 0x80491b1 |
| push %ebp | 0x8049189 | 0xffffd3c8 | 0xffffd3bc | -134551544 | 0x80491b1,0xffffd3c8 |
| mov %esp,%ebp | 0x804918a | 0xffffd3bc | 0xffffd3bc | -134551544 | 0x80491b1,0xffffd3c8 |
| sub $0x10,%esp | 0x804918c | 0xffffd3bc | 0xffffd3ac | -134551544 | 0x80491b1,0xffffd3c8,0xd |
| movl $0xd,-0x4(%ebp) | 0x804918f | 0xffffd3bc | 0xffffd3ac | -134551544 | 0x80491b1,0xffffd3c8,0xd |
| pushl 0x8(%ebp) | 0x8049196 | 0xffffd3bc | 0xffffd3a8 | -134551544 | 0x80491b1,0xffffd3c8,0xd,0x8 |
| call 0x8049176 | 0x8049199 | 0xffffd3bc | 0xffffd3a4 | -134551544 | 0x80491b1,0xffffd3c8,0xd,0x8,0x804919e |
| add $0x4,%esp | 0x804919e | 0xffffd3bc | 0xffffd3ac | 11 | 0x80491b1,0xffffd3c8,0xd |
| mov -0x4(%ebp),%edx | 0x80491a1 | 0xffffd3bc | 0xffffd3ac | 11 | 0x80491b1,0xffffd3c8,0xd |
| add %edx,%eax | 0x80491a4 | 0xffffd3bc | 0xffffd3ac | 24 | 0x80491b1,0xffffd3c8,0xd |
| leave | 0x80491a6 | 0xffffd3c8 | 0xffffd3c0 | 24 | 0x80491b1 |
| ret | 0x80491a7 | 0xffffd3c8 | 0xffffd3c4 | 24 | NULL |

















浙公网安备 33010602011771号