反汇编一个简单C程序
(一)反汇编执行过程及分析
1.使用命令:gcc –S –o main.s main.c -m32,对以下程序进行反汇编。
// main.c
int g(int x)
{
return x + 3;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8) + 1;
}
命令执行过程如下:
生成的main.s程序如下:
我们在分析汇编代码时,可以把main.s简化一下,所有以".“打头的字符串(都是编译器在链接阶段所需辅助信息)不会实际执行,可以都删掉。
在VIM中通过"g/.s*/d"命令即可删除所有以”."打头的字符串,这样代码就会更加精简:
(二)问题总结
在打开反汇编出的main.s程序时,会发现这个文件是main.c生成的,但main.s汇编文件还有一些".cfi_"打头的字符以及其他以 “.” 打头的字符串,其实这些都是编译器在链接阶段所需的辅助信息。
EIP寄存器是指向代码段中的一条条指令,即main.s中的汇编指令,从"main:"开始,它会自动加一,调用call指令它会修改EIP寄存器。EBP寄存器和ESP寄存器也特别重要,两个寄存器总是指向一个堆栈,EBP指向栈底,而ESP指向栈顶。
以下是堆栈空间示意图,右侧数字表示内存地址,EBP和ESP寄存器都指向栈底,即指向一个4字节存储单元的下边缘2000的位置,指2000-2003这4个字节,也就是标号为0的存储单元,依此类推,标号1的存储单元为 1996-1999这4个字节。在代码执行过程中,堆栈空间和相应的EBP/ESP寄存器会不断变化。