GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析
环境准备
- linux ubuntu 16.04.1
- 终端编译工具:
- 基于64位Linux版本32位编译调试指令:
sudo apt-get install libc6-dev-i386
- 基于64位Linux版本32位编译调试指令:
- 测试代码准备:
分析过程
思路
-
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 | 空 |