反汇编测试
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 |