GDB调试汇编堆栈

GDB调试汇编堆栈

分析过程

  • C语言源代码
int g(int x)
{
    return x+6;
}
int f(int x)
{
    return g(x+1);
}
int main(void)
{
    return f(5)+1;
}
  • 使用gcc -g exp1.c -o exp1 -m32指令在64位机器上产生32位汇编。
    885278-20161204184408193-857708388.png

  • 进入gdb调试器。
    885278-20161204184419865-1626007932.png

  • 在main函数处设置一个断点。
    885278-20161204184429021-900521269.png

  • 使用run指令开始运行程序,返回main函数运行的结果。
    885278-20161204184437896-2047966104.png

  • 使用disassemble指令获取汇编代码。
    885278-20161204184450240-277083405.png

  • 使用info registers命令查看各寄存器的值。
    885278-20161204184459474-2113594946.png

  • 由上图可以看出,帧指针%ebp在0xbffff2e8,栈指针%esp在0xbffff2e4。
  • x+地址来查看%esp和%ebp的值,此时都为0。
    885278-20161204184508474-1537866163.png

  • display,设置程序中断后欲显示的数据及其格式。例如,如果希望每次程序中断后可以看到即将被执行的下一条汇编指令,可以使用命令
    display /i $pc
    将5压入栈中,传递参数
    885278-20161204184527037-810958912.png

885278-20161204184537693-942965592.png

  • call指令将返回地址压入栈中。
    885278-20161204184546584-320695663.png

885278-20161204184602693-1211200964.png

  • f函数汇编代码。
    885278-20161204184613709-1758280812.png

  • 将栈指针的值压入栈中。
    885278-20161204184627271-1281773904.png

  • 帧指针指向栈指针所在位置,以此为基址。
    885278-20161204184636709-449906433.png

  • 在%eax中计算
    885278-20161204184647287-1463958202.png

  • 将g函数返回值放入%esp所指地址中
    885278-20161204184658490-1223805591.png

  • 将6压入栈中,传递参数
    885278-20161204184708115-1507398435.png

  • 调用g函数,调用call指令将f函数的返回地址压入栈中
    885278-20161204184718224-913520141.png

885278-20161204184731849-1971025466.png

  • g函数汇编代码
    885278-20161204184742552-789031633.png

  • 将栈指针的值压入栈中。
    885278-20161204184755584-1419056624.png

  • 在%eax中计算
    885278-20161204184807365-1049315484.png

  • pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节
    885278-20161204184825818-11776348.png

885278-20161204184840490-1701779600.png

  • ret将栈顶给%eip
    885278-20161204184853881-105743672.png

885278-20161204184908896-170467794.png

  • leave使栈做好返回的准备,等价于
movl %ebp,%esp //将%ebp的值给%esp
popl %ebp //将栈顶弹到%ebp中
  • ret指令,返回主函数
    885278-20161204184924474-1386046459.png

  • 主函数汇编代码
    885278-20161204184948490-82148504.png

  • 执行leave后,各寄存器值
    885278-20161204185000693-1148723826.png

序号指令%eip%ebp%esp%eax栈顶->栈底
001movl $0x5,(%esp)0x80483e20xbffff2e80xbffff2e40x10x5 0x0
002call 0x80483bf0x80483bf0xbffff2e80xbffff2e00x10x80483e7 0x5 0x0
003push %ebp0x80483c00xbffff2e80xbffff2dc0x10xbffff2e8 0x80483e7 0x5 0x0
004mov %esp,%ebp0x80483c20xbffff2dc0xbffff2dc0x10xbffff2e8 0x80483e7 0x5 0x0
005sub $0x4,%esp0x80483c50xbffff2dc0xbffff2d80x10xbffff2e8 0x80483e7 0x5 0x0
006mov 0x8(%ebp),%eax0x80483c80xbffff2dc0xbffff2d80x50xbffff2e8 0x80483e7 0x5 0x0
007add $0x1,%eax0x80483cb0xbffff2dc0xbffff2d80x60xbffff2e8 0x80483e7 0x5 0x0
008mov %eax,(%esp)0x80483ce0xbffff2dc0xbffff2d80x60x6 0xbffff2e8 0x80483e7 0x5 0x0
009Call 0x80483b40x80483b40xbffff2dc0xbffff2d40x60x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0
010push %ebp0x80483b50xbffff2dc0xbffff2d00x60xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0
011Mov %esp,%ebp0x80483b70xbffff2d0Oxbffff2d00x60xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0
012mov 0x8(%ebp),%eax0x80483ba0xbffff2d00xbffff2d00x60xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0
013add $0x6,%eax0x80483bd0xbffff2d00xbffff2d00xc0xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0
014Pop %ebp0x80483be0xbffff2dc0xbffff2d40xc0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0
015Ret0x80483d30xbffff2dc0xbffff2d80xc0x6 0xbffff2e8 0x80483e7 0x5 0x0
016leave0x80483d40xbffff2e80xbffff2e00xc0x80483e7 0x5 0x0
017Ret0x80483e70xbffff2e80xbffff2e40xc0x5 0x0
018add $0x1,%eax0x80483ea0xbffff2e80xbffff2e40xd0x5 0x0
019leave0x80483eb0x00xbffff2ec0xd0x0
020ret0xb7e3a5330x00xbffff2f00xd

转载于:https://www.cnblogs.com/LLLLLLQL/p/6131426.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值