gdb汇编调试

GDB调试汇编堆栈分析

代码:

 


sudo apt-get install libc6-dev-i386命令安装所需库

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



    • 可见此时主函数的栈基址为0xffffd098,用x(examine)指令查看内存地址中的值,目前%esp所指为0,%ebp为0

    • 下面展示每一步时%esp、%ebp和堆栈内容的变化:

    • i

    • call指令将下一条指令的地址入栈,此时%esp,%ebp和堆栈的值为:

    •  

       

       

    • 将上一个函数的基址入栈,从当前%esp开始作为新基址:

    •  

    • 先为传参做准备:

    •  



    • 实参的计算在%eax中进行:

    •  

    • 实参入栈06

    • call指令将下一条指令的地址入栈

               

               

               计算short+int

               

                

                

               

               

              

 

                 

                  

                

                pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节:

                

               

               

              pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节:

              

                

 

               

              ret指令将栈顶弹给%eip:

              

              

             

             因为函数f修改了%esp所以用leave指令恢复。leave指令先将%esp对其到%ebp,然后把栈顶弹给%ebp:

              

 

             

             

 

              

              

              

             

  • 主函数汇编代码,并结束栈帧的调用。

指令espebp堆栈
push $0x8
0xffffd098 
0xffffd0980x0
call 0x80483ef
0xffffd094 
0xffffd0980x8 0x0
push %ebp
0xffffd090 
0xffffd0980x8048412 0x8 0x0
mov %esp,%ebp0xffffd08c0xffffd0980xffffd098 0x8048412 0x8 0x0
mov 0x804a01c,%edx0xffffd08c0xffffd08c0xffffd098 0x8048412 0x8 0x0
 mov 0x8(%ebp),%eax 0xffffd08c 0xffffd08c

 0xffffd098 0x8048412 

0x8 0x0

 add %edx ,%eax 0xffffd08c0xffffd08c 0xffffd098 0x8048412 0x8 0x0
 push %eax 0xffffd08c 0xffffd08c 0xffffd098 0x8048412 0x8 0x0
 call 0x80483db<g> 0xffffd088 0xffffd08c 0xa 0xffffd098 0x8048412 0x8 0x0
 push %ebp     0xffffd084 0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
 move %esp %ebp 0xffffd080 0xffffd08c 0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
 movzwl0xffffd080      0xffffd080 0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
 movswl %ax %edx 0xffffd0080 0xffffd080 0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
 mov 0x8(%ebp),%eax 0xffffd080 0xffffd080 0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
 add %edx %eax 0xffffd080 0xffffd080 
0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
pop %ebp0xffffd0800xffffd0800xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
ret0xffffd0840xffffd08c0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0
add $0x4 ,%esp0xffffd080xffffd08c0xa 0xffffd098 0x8048412 0x8 0x0
leave 0xffffd08c0xffffd08c0xffffd098 0x8048412 0x8 0x0
ret0xffffd090 0xffffd0980x8048412 0x8 0x0
add $0x4 ,%esp0xffffd090xffffd0980x8 0x0
leave0xffffd0980xffffd0980x0
ret0xffffd09c0x0 
posted on 2016-12-21 16:39  20145306张文锦 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/besti145306/p/6208224.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值