GDB调试汇编堆栈过程分析

  • 源代码:
    886473-20161204170302693-1824782430.png

  • 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器,在main函数设置断点,run一下:
    886473-20161207070520460-739255197.png

  • 使用disassemble指令获取汇编代码:
    886473-20161207070541835-762872827.png

  • 用i(info) r(registers)指令查看各寄存器的值, 此时主函数的栈基址为0xbffff344,用x(examine)指令查看内存地址中的值
    886473-20161207070553288-339797137.png

  • 设置:display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。用x(examine)指令查看内存地址中的值
    886473-20161207070607460-1671414010.png

  • call指令将下一条指令的地址入栈:
    886473-20161207070630116-1679728992.png

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

  • 为传参做准备:
    886473-20161207070701288-74826677.png
    886473-20161207070713929-265113358.png

  • 实参计算在%eax中进行:
    886473-20161207070729538-1112591562.png

  • f函数汇编代码:
    886473-20161207070747163-711285805.png

  • 传参:
    886473-20161207070801913-476484438.png

  • 实参入栈:
    886473-20161207070816101-1670682505.png

  • call指令将下一条指令的地址入栈:
    886473-20161207070834429-968796359.png
    886473-20161207070848538-2083526778.png
    886473-20161207070902851-1967927262.png

  • 计算short+int:
    886473-20161207070925101-1268016038.png
    886473-20161207070938976-1178859733.png
    886473-20161207070951241-1852389672.png
    886473-20161207071002429-1408787822.png

  • pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节:
    886473-20161207071025710-861328650.png
    886473-20161207071042163-623258066.png

  • ret指令将栈顶弹给%eip:
    886473-20161207071104726-1707959434.png

  • 因为函数f修改了%esp,所以用leave指令恢复。leave指令先将%esp对其到%ebp,然后把栈顶弹给%ebp:
    886473-20161207071118335-1983144452.png
    886473-20161207071131116-542550579.png
    886473-20161207071147116-1423286876.png

  • leave指令恢复
    886473-20161207071209366-1422461250.png
    886473-20161207071228429-1254095855.png

指令%eip%esp%ebp%eax
movl $0x8,(%esp)0x80483e20xbffff3440xbffff3480x1
call 0x80483c40x80483e90xbffff3440xbffff3480x1
push %ebp0x80483c40xbffff3400xbffff3480x1
mov %esp,%ebp0x80483c50xbffff33c0xbffff3480x1
sub $0x4,%esp0x80483c70xbffff33c0xbffff33c0x1
mov 0x804a014,%eax0x80483ca0xbffff3380xbffff33c0x1
add $0x8(%ebp),%eax0x80483c50xbffff33c0xbffff3480x2
mov %eax,(%esp)0x80483d20xbffff3380xbffff33c0xa
call 0x80483b40x80483d50xbffff3380xbffff33c0xa
push %ebp0x80483b40xbffff3340xbffff33c0xa
mov %esp,%ebp0x80483b50xbffff3300xbffff33c0xa
movzwl 0x804a010,%eax0x80483b70xbffff3300xbffff3300xa
cwtl0x80483be0xbffff3300xbffff3300x1
add 0x8(%ebx),%eax0x80483bf0xbffff3300xbffff3300x1
pop %ebx0x80483c20xbffff3300xbffff3300xb
ret0x80483c30xbffff3340xbffff33c0xb
leave0x80483da0xbffff3380xbffff33c0xb
ret0x80483db0xbffff3400xbffff3480xb
mov 0x80484d0,%edx0x80483ee0xbffff3440xbffff3480xb
add %edx,%eax0x80483f40xbffff3440xbffff3480xb
leave0x80483f60xbffff3440xbffff3480xe
ret0x80483f70xbffff34c0x00xe
指令栈帧
movl $0x8,(%esp)0x0
call 0x80483c40x8 0x0
push %ebp0x80483ee 0x8 0x0
mov %esp,%ebp0xbffff348 0x80483ee 0x8 0x0
sub $0x4,%esp0xbffff348 0x80483ee 0x8 0x0
mov 0x804a014,%eax0xbffff348 0x80483ee 0x8 0x0
add $0x8(%ebp),%eax0xbffff348 0x80483ee 0x8 0x0
mov %eax,(%esp)0xbffff348 0x80483ee 0x8 0x0
call 0x80483b40xa 0xbffff348 0x80483ee 0x8 0x0
push %ebp0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
mov %esp,%ebp0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
movzwl 0x804a010,%eax0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
cwtl0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
add 0x8(%ebx),%eax0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
pop %ebx0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
ret0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
leave0xa 0xbffff348 0x80483ee 0x8 0x0
ret0xa 0x80483ee 0x8 0x0
mov 0x80484d0,%edx0x8 0x0
add %edx,%eax0x8 0x0
leave0x8 0x0
ret

转载于:https://www.cnblogs.com/jdy1453/p/6130961.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断
GDB是一款常用的调试工具,用于在程序运行过程中进行调试和分析。它可以帮助开发人员定位和修复程序中的错误。 GDB的主要功能包括: 1. 设置断点:可以在程序的指定位置设置断点,当程序执行到该位置时会暂停执行,方便进行调试。 2. 单步执行:可以逐行或逐语句地执行程序,观察程序的执行过程。 3. 查看变量:可以查看程序中的变量的值,帮助分析程序的状态。 4. 修改变量:可以在调试过程中修改变量的值,以验证不同情况下的程序行为。 5. 回溯调用:可以查看函数调用的顺序和参数值,帮助分析函数调用过程。 6. 内存查看:可以查看程序运行时的内存状态,包括堆栈、全局变量等。 7. 多线程调试:支持对多线程程序进行调试,可以查看和控制各个线程的执行。 IDA Pro是一款强大的反汇编和逆向工程工具,主要用于分析和理解二进制文件。它可以将二进制文件转换为汇编代码,并提供丰富的功能来分析代码结构、函数调用关系、数据引用等。 IDA Pro的主要功能包括: 1. 反汇编:将二进制文件转换为汇编代码,方便分析和理解程序的执行流程。 2. 逆向工程:通过分析代码结构和函数调用关系,还原程序的高级语言结构,帮助理解程序的逻辑。 3. 数据引用分析:可以查找和分析程序中的数据引用关系,帮助理解数据的使用和修改过程。 4. 寻找漏洞:通过分析程序的代码和数据,可以发现潜在的漏洞和安全问题。 5. 插件扩展:IDA Pro支持插件扩展,可以根据需要添加自定义功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值