反汇编测试
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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了