一、反汇编C程序
1、创建.c文件,然后编辑.c文件
2.编写程序
编写完成后按ESC,然后输入“:+wq”退出。
3.编译完成后,查看编译结果
gcc+文件名.c,生成一个目标文件a.out
4.把.c文件编译成一个汇编代码(.s文件),可以使用如下命令:
5.汇编代码如下:
6.通过输入g/\.s*/d可以删除所有以"."打头的字符串,获得“干净”的汇编代码。
7.分析汇编代码
(1)汇编代码分别对应3个函数:main函数、f函数、g函数。
(2)汇编指令中新出现两个指令:
lever指令:撤销函数堆栈。 enter指令:建立函数堆栈。
(3)代码分析:
1. EIP寄存器是指向代码段中的一条条指令,即20222816.s中的汇编指令,从“main.c”开始,他会自动加一,调用call指令时它会修改EIP寄存器。EBP寄存器指向栈底,ESP寄存器指向栈顶。EAX寄存器用于暂存一些数值,函数的返回值默认使用EAX寄存器存储并返回给上一级调用函数。
2. 程序从main函数开始执行(上述18行):
18行“push%ebp”把EBP寄存器的值压栈,可以理解为0。
19行代码:将EBP寄存器指向标号1的位置。
20:把ESP寄存器-4,实际上ESP向下移动一个标号,指向2的位置。
21:把数8放入ESP寄存器指向的标号2的位置
22:call f执行
10:EBP和ESP指向栈空间4的位置
9.10和18.19语句完全一样,所以函数的头两条指令用于初始化函数自己的函数调用堆栈空间。
11.ESP-4指向下一个位置栈空间的标号5
12.把立即数8放到EAX寄存器中。
13.把EAX寄存器中存储的立即数8放到ESP寄存器现在所指的位置5.
14.call g
4.将函数g的参数取出
5.立即数3加到EAX寄存器里,就是8+3,EAX寄存器为11.
6.7拆除g函数堆栈,并返回到调用函数g的位置。
15.撤销函数堆栈
16.ret把ESP指向3的位置的内容