反汇编测试

GDB调试汇编堆栈过程分析

  • 源代码

  • 用gcc在64位机器上编译一个32位的程序,遇到报错,具体如下图:

错误原因

  • 系统中的gcc没有安装multilib 库;使用这个库可以在64位的机器上产生32位的程序

解决办法

sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib

  • 安装完成后,使用gcc - g main.c -o main -m32指令在64位的机器上产生32位汇编,然后使用gdb main指令进入gdb调试器:
    在main处设置断点、运行并获取汇编代码查看各寄存器状态

可见此时主函数的栈基址为0xffffd108,用x查看其值为0。

使用指令display /i $pc,单步执行并显示%esp和%ebp的值。

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

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

为传参做准备:

又一个call指令

传参

返回指令:

实参计算:

又一个call指令:

下一条指令入栈:

又一个call:

ret指令将栈顶弹给%eip:

实参计算:

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

eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况

指令 esp ebp eip eax
push %ebp 0xffffd100 0xffffd108 0x56555502 0x56556fdc
mov %esp,%ebp 0xffffd0fc 0xffffd108 0x56555503 0x56556fdc
sub $0x10,%esp 0xffffd0fc 0xffffd0fc 0x56555505 0x56556fdc
call 0x56555549 0xffffd0ec 0x0ffffd0fc 0x56555508 0x56556fdc
add $0x1acf,%eax 0xffffd0ec 0xffffd0fc 0x5655550d 0x5655550d
movl $0x17,-0x4(%epb) 0xffffd0ec 0xffffd0fc 0x56555512 0x56556fdc
pushl 0x8(%ebp) 0xffffd0ec 0xffffd0fc 0x56555519 0x56556fdc
call 0x565554ed 0xffffd0e8 0xffffd0fc 0x5655551c 0x56556fdc
add $0x4,%esp 0xffffd0ec 0xffffd0fc 0x56555521 0xb
mov -0x4(%ebp),%eax 0xffffd0ec 0xffffd0fc 0x56555526 0xb
add %edx,%eax 0xffffd0ec 0xffffd0fc 0x56555529 0x17
leave 0xffffd0ec 0xffffd0fc 0x5655552b 0x22
ret 0xffffd100 0xffffd108 0x5655552c 0x22
posted @   20191223张俊怡  阅读(93)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示