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列:寄存器中存的值
  • 877163-20161204153658849-1989009733.jpg

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

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

  • 初始
    • 877163-20161204153707599-1774857656.jpg
  • push $0x8
    • 877163-20161204153716631-827765507.jpg
  • call 0x80483e6
    • 877163-20161204153723693-1468586983.jpg
  • push %ebp
    • 877163-20161204153741646-1941555345.jpg
  • mov %esp,%ebp
    • 877163-20161204153808787-1797842876.jpg
  • pushl 0x8(%ebp)
    • 877163-20161204153816584-241139489.jpg
  • call 0x80483db
    • 877163-20161204153824537-1538065645.jpg
  • push %ebp
    • 877163-20161204153832802-308293239.jpg
  • mov %esp,%ebp
    • 877163-20161204153841084-1360218783.jpg
  • mov 0x8(%ebp),%eax
    • 877163-20161204153848896-516347597.jpg
  • add $0x3,%eax
    • 877163-20161204153855646-380560801.jpg
  • pop %ebp
    • 877163-20161204153902974-1690320304.jpg
  • ret
    • 877163-20161204153913037-878680258.jpg
  • add $0x4,%esp
    • 877163-20161204153920381-1828388706.jpg
  • leave
    • 877163-20161204153926568-575029759.jpg
  • ret
    • 877163-20161204153934709-12599472.jpg
  • `add $0x4,%esp
    • 877163-20161204153941584-1663830068.jpg
  • `add $0x1,%eax
    • 877163-20161204153949474-1971493708.jpg

寄存器分析

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

指令%eip%esp%ebp%eax堆栈(相对初始栈底)
初始0x80483f90xffffcff80xffffcff80xffffd09c
push $0x80x80483fb0xffffcff40xffffcff80xffffd09c0x8
call 0x80483e60x80483e60xffffcff00xffffcff80xffffd09c0x08048400,0x8
push %ebp0x80483e70xffffcfec0xffffcff80xffffd09c0xffffcff8,0x08048400,0x8
mov %esp,%ebp0x80483e90xffffcfec0xffffcfec0xffffd09c0xffffcff8,0x08048400,0x8
pushl 0x8(%ebp)0x80483ec0xffffcfe80xffffcfec0xffffd09c0x8,0xffffcff8,0x08048400,0x8
call 0x80483db0x80483db0xffffcfe40xffffcfec0xffffd09c0x080483f1,0x8,0xffffcff8,0x08048400,0x8
push %ebp0x80483dc0xffffcfe00xffffcfec0xffffd09c0xffffcfec,0x080483f1,0x8,0xffffcff8,0x08048400,0x8
mov %esp,%ebp0x80483de0xffffcfe00xffffcfe00xffffd09c0xffffcfec,0x080483f1,0x8,0xffffcff8,0x08048400,0x8
mov 0x8(%ebp),%eax0x80483e10xffffcfe00xffffcfe00x80xffffcfec,0x080483f1,0x8,0xffffcff8,0x08048400,0x8
add $0x3,%eax0x80483e40xffffcfe00xffffcfe00xb0xffffcfec,0x080483f1,0x8,0xffffcff8,0x08048400,0x8
pop %ebp0x80483e50xffffcfe40xffffcfec0xb0x080483f1,0x8,0xffffcff8,0x08048400,0x8
ret0x80483f10xffffcfe80xffffcfec0xb0x8,0xffffcff8,0x08048400,0x8
add $0x4,%esp0x80483f40xffffcfec0xffffcfec0xb0xffffcff8,0x08048400,0x8
leave0x80483f50xffffcff00xffffcff80xb0x08048400,0x8
ret0x80484000xffffcff40xffffcff80xb0x8
add $0x4,%esp0x80484030xffffcff80xffffcff80xb
add $0x1,%eax0x80483060xffffcff80xffffcff80xc

参考资料

转载于:https://www.cnblogs.com/20145221GQ/p/6130938.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值