反汇编测试
GDB调试汇编堆栈过程分析
- 
源代码 
  
- 
用gcc在64位机器上编译一个32位的程序,遇到报错,具体如下图: 
  
错误原因
- 系统中的gcc没有安装multilib 库;使用这个库可以在64位的机器上产生32位的程序
解决办法
sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib
- 安装完成后,使用gcc - g main.c -o main -m32指令在64位的机器上产生32位汇编,然后使用gdb main指令进入gdb调试器:
 在main处设置断点、运行并获取汇编代码查看各寄存器状态
  

可见此时主函数的栈基址为0xffffd108,用x查看其值为0。

使用指令display /i $pc,单步执行并显示%esp和%ebp的值。

call指令将下一条指令的地址入栈:

将上一个函数的基址入栈,从当前%esp开始作为新基址:

为传参做准备:

又一个call指令

传参

返回指令:

实参计算:



又一个call指令:

下一条指令入栈:


又一个call:


ret指令将栈顶弹给%eip:

实参计算:



pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节:



eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况
| 指令 | esp | ebp | eip | eax | |
|---|---|---|---|---|---|
| push %ebp | 0xffffd100 | 0xffffd108 | 0x56555502 | 0x56556fdc | |
| mov %esp,%ebp | 0xffffd0fc | 0xffffd108 | 0x56555503 | 0x56556fdc | |
| sub $0x10,%esp | 0xffffd0fc | 0xffffd0fc | 0x56555505 | 0x56556fdc | |
| call 0x56555549 | 0xffffd0ec | 0x0ffffd0fc | 0x56555508 | 0x56556fdc | |
| add $0x1acf,%eax | 0xffffd0ec | 0xffffd0fc | 0x5655550d | 0x5655550d | |
| movl $0x17,-0x4(%epb) | 0xffffd0ec | 0xffffd0fc | 0x56555512 | 0x56556fdc | |
| pushl 0x8(%ebp) | 0xffffd0ec | 0xffffd0fc | 0x56555519 | 0x56556fdc | |
| call 0x565554ed | 0xffffd0e8 | 0xffffd0fc | 0x5655551c | 0x56556fdc | |
| add $0x4,%esp | 0xffffd0ec | 0xffffd0fc | 0x56555521 | 0xb | |
| mov -0x4(%ebp),%eax | 0xffffd0ec | 0xffffd0fc | 0x56555526 | 0xb | |
| add %edx,%eax | 0xffffd0ec | 0xffffd0fc | 0x56555529 | 0x17 | |
| leave | 0xffffd0ec | 0xffffd0fc | 0x5655552b | 0x22 | |
| ret | 0xffffd100 | 0xffffd108 | 0x5655552c | 0x22 | 

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号