GDB调试汇编堆栈过程分析

本文介绍如何使用GDB调试器分析32位汇编语言中的堆栈变化,通过具体实例展示了在调用函数过程中%esp、%ebp寄存器及堆栈内容的变化情况。

GDB调试汇编堆栈过程分析

分析过程

使用gcc -g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器:
885939-20161211165713772-42026533.png

进入之后先在main函数处设置一个断点,再run一下,使用disassemble指令获取汇编代码,用i(info) r(registers)指令查看各寄存器的值:
885939-20161211165802163-1196753059.png

885939-20161211165828694-762493298.png

885939-20161211165917179-1817390434.png

可见此时主函数的栈基址为0xffffd068,用x(examine)指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0
885939-20161211165954038-1318835673.png

首先,结合display命令和寄存器或pc内部变量,做如下设置:display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。下面展示每一步时%esp、%ebp和堆栈内容的变化:
计算short+int:
pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节:
ret指令将栈顶弹给%eip:
因为函数f修改了%esp,所以用leave指令恢复。leave指令先将%esp对其到%ebp,然后把栈顶弹给%ebp:
主函数汇编代码:

885939-20161211170038679-1346076592.png

885939-20161211170047835-5274089.png

885939-20161211170056835-2064935678.png

885939-20161211170105929-804489442.png

885939-20161211170244413-1966257637.png

885939-20161211170304944-243631550.png

885939-20161211170251522-413045934.png

885939-20161211170312413-2060488507.png

885939-20161211170406382-1813741000.png

885939-20161211170422601-848514058.png

885939-20161211170433976-672261512.png

885939-20161211170616179-781872741.png

885939-20161211170624772-1461869910.png

885939-20161211171415460-1757945580.png

885939-20161211171425069-1275400488.png

885939-20161211171435007-1099089461.png

885939-20161211171444194-1695409532.png

885939-20161211171456382-154373511.png

885939-20161211171505179-1243442462.png

885939-20161211172201022-1836044370.png

885939-20161211172211319-666958650.png

885939-20161211172221663-710880509.png

885939-20161211172245679-1650062600.png

885939-20161211172301991-1832896109.png

885939-20161211172315538-2134356110.png

885939-20161211172327913-1234985785.png

885939-20161211172339366-2063107127.png

885939-20161211172355866-1169561668.png

885939-20161211172409476-432202626.png

885939-20161211172420366-1569648342.png

885939-20161211172743272-1753981363.png

885939-20161211172753976-200592743.png

885939-20161211172809804-1493333925.png

885939-20161211172820304-1222729363.png

885939-20161211172830054-1263945339.png

885939-20161211172840444-527117922.png

885939-20161211172939351-5471323.png

885939-20161211172949757-1474197060.png

指令%esp%ebp堆栈
push $0x80xffffd0580xffffd0580x0
call 0x80483ef0xffffd0540xffffd0580x8 0x0
push %ebp0xffffd0500xffffd0580x8048412 0x8 0x0
mov %esp,%ebp0xffffd04c0xffffd0580xffffd058 0x8048412 0x8 0x0
mov 0x804a01c,%edx0xffffd04c0xffffd04c0xffffd058 0x8048412 0x8 0x0
call 0x80483db0xffffd0480xffffd04c0xa 0xffffd058 0x8048412 0x8 0x0
push %ebp0xffffd0440xffffd04c0x8048403 0xa 0xffffd058 0x8048412 0x8 0x0
mov %esp,%ebp0xffffd0400xffffd04c0xffffd04c 0x8048403 0xa 0xffffd058 0x8048412 0x8 0x0
movzwl 0x804a018,%eax0xffffd0400xffffd0400xffffd04c 0x8048403 0xa 0xffffd058 0x8048412 0x8 0x0
ret0xffffd0440xffffd04c0x8048403 0xa 0xffffd058 0x8048412 0x8 0x0
leave0xffffd04c0xffffd04c0xffffd058 0x8048412 0x8 0x0
ret0xffffd0500xffffd0580x8048412 0x8 0x0
add $0x4,%esp0xffffd0540xffffd0580x8 0x0
mov $0x3,%edx0xffffd0580xffffd0580x0
ret

这次实验是在卢肖明同学的博客的帮助下完成的,很感谢卢肖明同学以及菜野同学的帮助

转载于:https://www.cnblogs.com/hxf5220/p/6160049.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值