GDB调试汇编堆栈过程分析

GDB调试汇编堆栈过程分析

环境准备

  • linux ubuntu 16.04.1
  • 终端编译工具:
    • 基于64位Linux版本32位编译调试指令:sudo apt-get install libc6-dev-i386
  • 测试代码准备:

分析过程

思路

  • Step1:生成汇编代码:gcc -g gdbtest.c -o gdbtest -m32

  • Step2:调试:gdb gdbtest

  • Step3:设置断点,因为目的是分析而不是调试bug,所以我们将断点设置在main函数

  • Step4:开始gdb调试:r(un),如若想获取此时的汇编代码,可用指令:disassemble

  • Step5:此时可以用指令查看寄存器的值:i(nfo) r(egisters),显示的格式为3列:

    • 第1列:寄存器名称
    • 第2列:寄存器的地址
    • 第3列:寄存器中存的值
  • Step6:使用display /i $pc可查看当前执行的汇编代码,通过e(x)amine /nfu可查看寄存器的地址以及栈中的值

  • 综上:有了上述这些功能指令,就足够我们对寄存器的内容进行分析了,每执行一条语句记录相关寄存器中的值(注意:本文分析汇编过程中%eip、%esp、%ebp、%eax、堆栈的情况,针对前3者我们在乎其地址的变化,而后两个情况我们则关心其中存储的值,在此特别说明一下,后文寄存器分析中不再特别说明。

过程(截图中的指令实际上是下一条待执行指令)

  • 初始

  • push $0x8

  • call 0x80483e6

  • push %ebp

  • mov %esp,%ebp

  • pushl 0x8(%ebp)

  • call 0x80483db

  • push %ebp

  • mov %esp,%ebp

  • mov 0x8(%ebp),%eax

  • add $0x3,%eax

  • pop %ebp

  • ret

  • add $0x4,%esp

  • leave

  • ret

  • ```add $0x4,%esp``

  • ```add $0x1,%eax``

寄存器分析

从main函数开始,到main函数结束(根据以上截图填写)

指令 %eip %esp %ebp %eax 堆栈(相对初始栈底)
初始 0x80483f9 0xffffcff8 0xffffcff8 0xffffd09c
push $0x8 0x80483fb 0xffffcff4 0xffffcff8 0xffffd09c 0x8
call 0x80483e6 0x80483e6 0xffffcff0 0xffffcff8 0xffffd09c 0x08048400,0x8
push %ebp 0x80483e7 0xffffcfec 0xffffcff8 0xffffd09c 0xffffcff8,0x08048400,0x8
mov %esp,%ebp 0x80483e9 0xffffcfec 0xffffcfec 0xffffd09c 0xffffcff8,0x08048400,0x8
pushl 0x8(%ebp) 0x80483ec 0xffffcfe8 0xffffcfec 0xffffd09c 0x8,0xffffcff8,0x08048400,0x8
call 0x80483db 0x80483db 0xffffcfe4 0xffffcfec 0xffffd09c 0x080483f1,0x8,0xffffcff8,0x08048400,0x8
push %ebp 0x80483dc 0xffffcfe0 0xffffcfec 0xffffd09c 0xffffcfec,0x080483f1,0x8,0xffffcff8,0x08048400,0x8
mov %esp,%ebp 0x80483de 0xffffcfe0 0xffffcfe0 0xffffd09c 0xffffcfec,0x080483f1,0x8,0xffffcff8,0x08048400,0x8
mov 0x8(%ebp),%eax 0x80483e1 0xffffcfe0 0xffffcfe0 0x8 0xffffcfec,0x080483f1,0x8,0xffffcff8,0x08048400,0x8
add $0x3,%eax 0x80483e4 0xffffcfe0 0xffffcfe0 0xb 0xffffcfec,0x080483f1,0x8,0xffffcff8,0x08048400,0x8
pop %ebp 0x80483e5 0xffffcfe4 0xffffcfec 0xb 0x080483f1,0x8,0xffffcff8,0x08048400,0x8
ret 0x80483f1 0xffffcfe8 0xffffcfec 0xb 0x8,0xffffcff8,0x08048400,0x8
add $0x4,%esp 0x80483f4 0xffffcfec 0xffffcfec 0xb 0xffffcff8,0x08048400,0x8
leave 0x80483f5 0xffffcff0 0xffffcff8 0xb 0x08048400,0x8
ret 0x8048400 0xffffcff4 0xffffcff8 0xb 0x8
add $0x4,%esp 0x8048403 0xffffcff8 0xffffcff8 0xb
add $0x1,%eax 0x8048306 0xffffcff8 0xffffcff8 0xc

参考资料

原文地址:https://www.cnblogs.com/20145221GQ/p/6130938.html