一、这节将分析06_01_反汇编一个简单的C程序的汇编代码
- 根据前两节的汇编代码画出堆栈的走向
- 这里需要关注ebp(堆栈基指针),esp(堆栈底指针),eip(指令指针),eax(累加寄存器)
- 为了方便理解,规定eip括号后的数字代表所在行号对应的命令,比如eip(2)表示eip指向行号2这条指令。
- 为了方便理解,规定ebp括号的数字代表堆栈下标对应的内存地址,比如ebp(0)代表下标0的内存地址。
二、分析汇编代码的堆栈走向
int g(int x) |g:
{ | pushl %ebp
return x+3; | movl %esp, %ebp
} | movl 8(%ebp), %eax
| addl $3, %eax
| popl %ebp
| ret
int f(int x) |f:
{ | pushl %ebp
return g(x); | movl %esp, %ebp
} | pushl 8(%ebp)
| call g
| addl $4, %esp
| leave
| ret
|main:
int main(void) | pushl %ebp
{ | movl %esp, %ebp
return f(8) + 1; | pushl $8
} | call f
| addl $4, %esp
| addl $1, %eax
| leave
| ret
0.环境准备
1. pushl %ebp
2. movl %esp, %ebp
3. pushl $8
4. call f
call f 可分解为
- push eip
- movl f, eip
运行call f时,eip指向21行的命令,运行call f后,eip指向9行的命令
5. pushl %ebp
6. movl %esp, %ebp
7. push 8(%esp)
8. call g
9. pushl %ebp
10. movl %esp, %ebp
11. movl 8(%ebp), %eax;add $3, %eax
- 堆栈无变化
- eax = *(uint32_t *)(ebp - 8)
- eax = eax + 3
- eax = 11
12. popl %ebp
13. ret——>popl %eip
14. addl $4, %esp
15. leave
15. ret
16. addl $4, %esp
17. addl $1, %eax
- 堆栈不变化
- eax = eax + 1
- eax = 12
- eip-> 23
18. leave
19. ret
- 返回更上层的堆栈。
学习视频链接:08_03_完整汇编程序执行过程分析