赵文豪 GDB调试汇编堆栈过程分析

GDB调试汇编堆栈过程分析

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

使用gdb调试代码。

使用break main指令在main函数处设置断点,然后调试,直到mian函数处。
885896-20161206163317147-1415382642.png

885896-20161206163327085-619859517.png

使用diassemble指令获取汇编代码
885896-20161206163536132-1080896319.png

885896-20161206163545288-1292539340.png

885896-20161209235415804-984073621.png

885896-20161209235423147-1407285088.png

查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0
885896-20161209235500007-1682735817.png

使用命令display /i $pc每次程序中断后可以看到即将被执行的下一条汇编指令
885896-20161209235621772-244021152.png

call将下一条指令的所在地址(即当时程序计数器PC的内容)入栈
885896-20161209235705257-1962012603.png

准备传参
885896-20161209235737288-265962187.png
查看f函数的汇编代码
885896-20161209235822351-1696059617.png

g分配栈空间
885896-20161209235853679-1433229121.png

pop %ebp指令将栈顶弹到%ebp中
885896-20161209235922476-522923449.png

ret返回g中call的调用位置
885896-20161210000001272-1462126420.png

ret返回f中call的调用位置,结束f函数
885896-20161210000057819-767114302.png

主函数汇编代码
885896-20161210000153257-1399768069.png

将%edx于%eax相加

885896-20161210000228163-1983281019.png

ret结束main函数
885896-20161210000256007-829668815.png

指令%eip%esp%ebp%eax堆栈
push $0x80x804840b0xffffd0480xffffd0480xf7fb8dbc0x0
call 0x80483ef0x804840d0xffffd0440xffffd0480xf7fb8dbc0x8 0x0
push %ebp0x80483ef0xffffd0400xffffd0480xf7fb8dbc0x8048412 0x8 0x0
mov %esp,%ebp0x80483f00xffffd03c0xffffd0480xf7fb8dbc
mov 0x804a01c,%edx0x80483f20xffffd03c0xffffd03c0xf7fb8dbc0xffffd048 0x8048412 0x8 0x0
mov 0x8(%ebp),%eax0x80483f80xffffd03c0xffffd03c0xf7fb8dbc0xffffd048 0x8048412 0x8 0x0
call 0x80483db0x80483fe0xffffd0380xffffd03c0xa0xa 0xffffd048 0x8048412 0x8 0x0
push %ebp0x80483db0xffffd0340xffffd03c0xa0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0
mov %esp,%ebp0x80483dc0xffffd0300xffffd03c0xa0xffffd03c 0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0
ret0x80483ee0xffffd0340xffffd03c0xb0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0
leave0x80484060xffffd03c0xffffd03c0xb0xffffd048 0x8048412 0x8 0x0
ret0x80484070xffffd0400xffffd0480xb0x8048412 0x8 0x0
add $0x4,%esp0x80484070xffffd0400xffffd0480xb0x8 0x0
leave0x804841c0xffffd0480xffffd0480xe0x0
ret0x804841d0xffffd04c0x00xe

转载于:https://www.cnblogs.com/bestizwh/p/6138188.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值