首页 > 技术文章 > 反汇编测试

zzjjyy123 2021-10-26 18:04 原文

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

推荐阅读