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 ...
随机推荐
- 自己手写的自动完成js类
在web开发中,为了提高用户体验,会经常用到输入框的自动完成功能,不仅帮助用户进行快速输入,最重要的是帮助那些“记不全要输入什么”的用户进行选择.这个功能有很多插件已经实现了,为了适应项目的特殊需求, ...
- asp.net core 1.1 升级后,操作mysql出错的解决办法。
遇到问题 core的版本从1.0升级到1.1,操作mysql数据库,查询数据时遇到MissingMethodException问题,更新.插入操作没有问题. 如果你也遇到这个问题,请参照以下步骤进行升 ...
- 使用VS Code从零开始开发调试.NET Core 1.0
使用VS Code 从零开始开发调试.NET Core 1.0. .NET Core 是一个开源的.跨平台的 .NET 实现. VS Code 全称是 Visual Studio Code,Visua ...
- C#开发微信门户及应用(12)-使用语音处理
我们知道,微信最开始就是做语音聊天而使得其更加流行的,因此语音的识别处理自然也就成为微信交流的一个重要途径,微信的开发接口,也提供了对语音的消息请求处理.本文主要介绍如何利用语音的识别,对C#开发的微 ...
- 智能指针unique_ptr的用法
unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...
- redis开启远程访问
redis默认只允许本地访问,要使redis可以远程访问可以修改redis.conf 打开redis.conf文件在NETWORK部分有说明 ######################### ...
- SpringMVC的执行流程(二)
文字解析: 1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配 DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交 ...
- angular $http请求
angular使用post.get向后台传参的问题 一.问题的来源 我们都知道向后台传参可以使用get.put,其形式就类似于name=jyy&id=001.但是在ng中我却发现使用$http ...
- vue.js初级入门之最基础的双向绑定操作
首先在页面引入vue.js以及其他需要用到的或者可能要用到的插件(这里我多引用了bootstrap和jquery) 引用的时候需要注意文件的路径,准备工作这样基本就完成了,下面正式开始入门. vue. ...
- [译]为什么我要离开gulp和grunt转投npm脚本的怀抱
原文链接:https://medium.freecodecamp.com/why-i-left-gulp-and-grunt-for-npm-scripts-3d6853dd22b8#.n7m1855 ...