GDB调试汇编堆栈
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GDB调试汇编堆栈相关的知识,希望对你有一定的参考价值。
GDB调试汇编堆栈
准备工作
-
终端编译工具:
- 编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386
-
测试代码:
分析过程
- 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调试汇编堆栈的主要内容,如果未能解决你的问题,请参考以下文章