GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析
分析过程
这是我的C源文件:click here
使用
gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器:

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


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

首先,结合display命令和寄存器或pc内部变量,做如下设置:
display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。下面展示每一步时%esp、%ebp和堆栈内容的变化:



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



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



先为传参做准备:



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

f函数的汇编代码:

实参入栈:



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






计算short+int:






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



ret指令将栈顶弹给%eip:



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






主函数汇编代码:





| 指令 | %esp | %ebp | 堆栈 |
|---|---|---|---|
| push $0x8 | 0xffffd068 | 0xffffd068 | 0x0 |
| call 0x80483ef | 0xffffd064 | 0xffffd068 | 0x8 0x0 |
| push %ebp | 0xffffd060 | 0xffffd068 | 0x8048412 0x8 0x0 |
| mov %esp,%ebp | 0xffffd05c | 0xffffd068 | 0xffffd068 0x8048412 0x8 0x0 |
| mov 0x804a01c,%edx | 0xffffd05c | 0xffffd05c | 0xffffd068 0x8048412 0x8 0x0 |
| call 0x80483db | 0xffffd058 | 0xffffd05c | 0xa 0xffffd068 0x8048412 0x8 0x0 |
| push %ebp | 0xffffd054 | 0xffffd05c | 0x8048403 0xa 0xffffd068 0x8048412 0x8 0x0 |
| mov %esp,%ebp | 0xffffd050 | 0xffffd05c | 0xffffd05c 0x8048403 0xa 0xffffd068 0x8048412 0x8 0x0 |
| movzwl 0x804a018,%eax | 0xffffd050 | 0xffffd050 | 0xffffd05c 0x8048403 0xa 0xffffd068 0x8048412 0x8 0x0 |
| ret | 0xffffd054 | 0xffffd05c | 0x8048403 0xa 0xffffd068 0x8048412 0x8 0x0 |
| leave | 0xffffd05c | 0xffffd05c | 0xffffd068 0x8048412 0x8 0x0 |
| ret | 0xffffd060 | 0xffffd068 | 0x8048412 0x8 0x0 |
| add $0x4,%esp | 0xffffd064 | 0xffffd068 | 0x8 0x0 |
| mov $0x3,%edx | 0xffffd068 | 0xffffd068 | 0x0 |
| ret | 0xffffd06c | 0x0 |
遇见的问题
使用-m32指令报错:

这是因为编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令
sudo apt-get install libc6-dev-i386即可
GDB调试汇编堆栈过程分析的更多相关文章
- 20145212——GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...
- 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析
20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...
- 赵文豪 GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 使用gdb调 ...
- 20145337 GDB调试汇编堆栈过程分析
20145337 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
- 20145208 GDB调试汇编堆栈过程分析
20145208 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
- 20145218 GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 虚拟机中分析过程 输入gcc - g example.c -o example -m32指令在64位机器上产生32位汇编,但出现以下错误: 这时需要使用sudo apt-g ...
- 20145236 GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 首先需要输入sudo apt-get install libc6-dev-i386安装一个库才能产生汇编代码,然后输入gcc - g example.c -o exampl ...
- 20145312 GDB调试汇编堆栈过程分析
20145312 GDB调试汇编堆栈过程分析 参考资料 卢肖明同学的博客:<GDB调试汇编堆栈过程分析>: http://www.cnblogs.com/lxm20145215----/p ...
- 20145240 GDB调试汇编堆栈过程分析
20145240 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
随机推荐
- 【无私分享:ASP.NET CORE 项目实战(第七章)】文件操作 FileHelper
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在程序设计中,我们很多情况下,会用到对文件的操作,在 上一个系列 中,我们有很多文件基本操作的示例,在Core中有一些改变,主 ...
- 从Google工程师到创业CTO,他的8项理念也许可以帮到你
Lan Langworth是前Google软件工程师.O'Reily作者,现在他是Artillery的co-founder/CTO,致力于把游戏机质量的游戏带进网页浏览器.下文是他从Google离职到 ...
- Django模型类Meta元数据详解
转自:https://my.oschina.net/liuyuantao/blog/751337 简介 使用内部的class Meta 定义模型的元数据,例如: from django.db impo ...
- Linux安装MySQL
步骤: 1 [qq@localhost Desktop]$ su root //以root身份进入 Password:(默认为空) 2 [root@localhost Desktop]# yum ...
- tornado+sqlalchemy+celery,数据库连接消耗在哪里
随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知. 最近老是发现数据库的连接数如果 ...
- CSS3 border-radius 圆角属性
使用 CSS3 border-radius 属性,你可以给任何元素制作 "圆角". 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号. -webkit- 或 -moz- ...
- View and Data API Tips: Hide elements in viewer completely
By Daniel Du With View and Data API, you can hide some elements in viewer by calling "viewer.hi ...
- Android中使用AsyncTask实现文件下载以及进度更新提示
Android提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单.相对Handler来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和 ...
- emoji哈哈哈哈
Unicode 官网上的FAQ令人发笑,啊哈哈哈 Q: What are the most popular emoji characters? Q: Do emoji characters have ...
- 跳转时候提示Attempt to present on while a presentation is in progress
出现这种情况,例如:我在获取相册图片后,直接present到另一个页面,但是上一个页面可能还未dismiss,所以,要在获取相册图片的dismiss方法的complete的block里面写获取图片及跳 ...