首页 > 代码库 > GDB调试汇编堆栈

GDB调试汇编堆栈

GDB调试汇编堆栈

准备工作

  • 终端编译工具:

    • 编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386
  • 测试代码:

    • test.c

分析过程

  • 1.生成汇编代码:gcc -g gdbtest.c -o gdbtest -m32
  • 2.调试:gdb test
  • 技术分享
  • 3.设置断点,因为目的是分析而不是调试bug,所以我们将断点设置在main函数
  • 4.开始gdb调试:r(un),如若想获取此时的汇编代码,可用指令:disassemble
  • 技术分享
  • 5.此时可以用指令查看寄存器的值:i(nfo) r(egisters),显示的格式为3列:

    • 第1列:寄存器名称
    • 第2列:寄存器的地址
    • 第3列:寄存器中存的值  
  • 6:结合display命令和寄存器或pc内部变量,做如下设置:display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。下面展示每一步时%esp、%ebp和堆栈内容的变化:

    • 技术分享
过程(截图中的指令实际上是待执行指令)
  • 初始

  • 技术分享
  • push $0x7

  • 技术分享
  • call 0x80483e8  call调用f(0x80483e8)

  • 技术分享
  • push %ebp  执行f函数,f初始化帧指针,将上一个函数的基址入栈,将当前%esp作为新基址

  • 技术分享
  •  mov %esp,%ebp  分配栈空间,为传参做准备

  • 技术分享
  • pushl 0x8(%ebp)   将%esp中的8存入栈中

  • 技术分享
  • call 0x80483db  call调用g(0x80483db)

  • 技术分享
  • push %ebp  初始化栈指针

  • 技术分享
  • mov %esp,%ebp  分配栈空间

  • 技术分享
  • mov 0x8(%ebp),%eax  将8存入栈中

  • 技术分享
  • add $0x1336495,%eax   将 %eax 与立即数 20145301 相加

  • 技术分享
  • pop %ebp  %ebp在结束前弹栈

  • 技术分享
  • ret   返回调用位置,结束函数

  • 技术分享
  • add $0x4,%esp    将 %esp 与立即数 4 相加

  • 技术分享
  • leave   返回准备栈

  • 技术分享
  • ret  返回调用位置,结束函数

  • 技术分享
  • add $0x4,%esp  将 %esp 与立即数 4 相加

  • 技术分享
  • add $0x1,%eax  将 %eax 与立即数 1 相加

  • 技术分享

对汇编代码进行分析

技术分享

寄存器分析

main函数的开始到结束
指令 %eip %esp %ebp %eax 堆栈 
初始  0x80483fb 0xffffd068 0xffffd068 0xf7fbaddc
push $0x7  0x80483fd 0xffffd064 0xffffd068 0xf7fbaddc 0x7
call 0x80483e8 0x80483e8 0xffffd060  0xffffd068 0xf7fbaddc 0x8048402 0x7
push %ebp  0x80483e9 0xffffd05c  0xffffd068 0xf7fbaddc 0xffffd068 0x8048402 0x7
mov %esp,%ebp 0x80483eb 0xffffd05c 0xffffd05c 0xf7fbaddc 0xffffd068 0x8048402 0x7
pushl 0x8(%ebp) 0x80483ee 0xffffd058 0xffffd05c 0xf7fbaddc 0x7 0xffffd068 0x8048402 0x7
call 0x80483db 0x80483db 0xffffd054 0xffffd05c 0xf7fbaddc 0x80483f3 0x7 0xffffd068 0x8048402 0x7
push %ebp  0x80483dc 0xffffd050 0xffffd05c 0xf7fbaddc 0xffffd05c 0x80483f3 0x7 0xffffd068 0x8048402 0x7
mov %esp,%ebp 0x80483de 0xffffd050 0xffffd050 0xf7fbaddc 0xffffd05c 0x80483f3 0x7 0xffffd068 0x8048402 0x7
mov 0x8(%ebp),%eax 0x80483e1 0xffffd050 0xffffd050 0x7  0xffffd05c 0x80483f3 0x7 0xffffd068 0x8048402 0x7
add $0x1336495,%eax 0x80483e6 0xffffd050 0xffffd050 0x133649c 0xffffd05c 0x80483f3 0x7 0xffffd068 0x8048402 0x7
pop %ebp  0x80483e7 0xffffd054 0xffffd05c 0x133649c  0x80483f3 0x7 0xffffd068 0x8048402 0x7
ret  0x80483f3 0xffffd058 0xffffd05c 0x133649c 0x7 0xffffd068 0x8048402 0x7
add $0x4,%esp 0x80483f6 0xffffd05c 0xffffd05c 0x133649c 0xffffd068 0x8048402 0x7
leave  0x80483f7 0xffffd060 0xffffd068 0x133649c 0x8048402 0x7
ret  0x8048402  0xffffd064 0xffffd068 0x133649c 0x7
add $0x4,%esp 0x8048405  0xffffd068 0xffffd068 0x133649c
add $0x1,%eax 0x8048408 0xffffd068 0xffffd068 0x133649d
leave  0x8048409 0xffffd06c 0x0  0x133649d  

GDB调试汇编堆栈