20145208 GDB调试汇编堆栈过程分析
20145208 GDB调试汇编堆栈过程分析
测试代码
#include<stdio.h>
short addend1 = 1;
static int addend2 = 2;
const static long addend3 = 3;
static int g(int x)
{
return x + addend1;
}
static const int f(int x)
{
return g(x + addend2);
}
int main(void)
{
return f(8) + addend3;
}
分析过程
使用
gcc -g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器进入之后先在main函数处设置一个断点,再run一下,使用
disassemble指令获取汇编代码,用i(info) r(registers)指令查看各寄存器的值:


- 可见此时主函数的栈基址为 0xffffcf98,用
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 | %eip | %eax | 堆栈 |
|---|---|---|---|---|---|
| push $0x8 | 0xffffcf98 | 0xffffcf98 | 0x804840b | -134500932 | 0x0 |
| call 0x80483ef | 0xffffcf94 | 0xffffcf98 | 0x804840b | -134500932 | 0x8 0x0 |
| push %ebp | 0xffffcf90 | 0xffffcf98 | 0x80483ef | -134500932 | 0x8048412 0x8 0x0 |
| mov %esp,%ebp | 0xffffcf8c | 0xffffcf98 | 0x80483f0 | -134500932 | 0xffffcf98 0x8048412 0x8 0x0 |
| mov 0x804a01c,%edx | 0xffffcf8c | 0xffffcf8c | 0x80483f2 | -134500932 | 0xffffcf98 0x8048412 0x8 0x0 |
| mov 0x8(%ebp),%eax | 0xffffcf8c | 0xffffcf8c | 0x80483f8 | -134500932 | 0xffffcf98 0x8048412 0x8 0x0 |
| add %edx,%eax | 0xffffcf8c | 0xffffcf8c | 0x80483fb | 8 | 0xffffcf98 0x8048412 0x8 0x0 |
| push %eax | 0xffffcf8c | 0xffffcf8c | 0x80483fd | 10 | 0xffffcf98 0x8048412 0x8 0x0 |
| call 0x80483db | 0xffffcf88 | 0xffffcf8c | 0x80483fe | 10 | 0xa 0xffffcf98 0x8048412 0x8 0x0 |
| push %ebp | 0xffffcf84 | 0xffffcf8c | 0x80483db | 10 | 0x8048403 0xa 0xffffcf98 0x8048412 0x8 0x0 |
| mov %esp,%ebp | 0xffffcf80 | 0xffffcf8c | 0x80483dc | 10 | 0xffffcf8c 0x8048403 0xa 0xffffcf98 0x8048412 0x8 0x0 |
| movzwl 0x804a018,%eax | 0xffffcf80 | 0xffffcf80 | 0x80483de | 10 | 0xffffcf8c 0x8048403 0xa 0xffffcf98 0x8048412 0x8 0x0 |
| movswl %ax,%edx | 0xffffcf80 | 0xffffcf80 | 0x80483e5 | 1 | 0xffffcf8c 0x8048403 0xa 0xffffcf98 0x8048412 0x8 0x0 |
| mov 0x8(%ebp),%eax | 0xffffcf80 | 0xffffcf80 | 0x80483e8 | 1 | 0xffffcf8c 0x8048403 0xa 0xffffcf98 0x8048412 0x8 0x0 |
| add %edx,%eax | 0xffffcf80 | 0xffffcf80 | 0x80483eb | 10 | 0xffffcf8c 0x8048403 0xa 0xffffcf98 0x8048412 0x8 0x0 |
| pop %ebp | 0xffffcf80 | 0xffffcf80 | 0x80483ed | 11 | 0xffffcf8c 0x8048403 0xa 0xffffcf98 0x8048412 0x8 0x0 |
| ret | 0xffffcf84 | 0xffffcf8c | 0x80483ee | 11 | 0x8048403 0xa 0xffffcf98 0x8048412 0x8 0x0 |
| add $0x4,%esp | 0xffffcf88 | 0xffffcf8c | 0x8048403 | 11 | 0x8048403 0xa 0xffffcf98 0x8048412 0x8 0x0 |
| leave | 0xffffcf8c | 0xffffcf8c | 0x8048406 | 11 | 0xffffcf98 0x8048412 0x8 0x0 |
| ret | 0xffffcf90 | 0xffffcf98 | 0x8048407 | 11 | 0x8048412 0x8 0x0 |
| add $0x4,%esp | 0xffffcf94 | 0xffffcf98 | 0x8048412 | 11 | 0x8 0x0 |
| mov $0x3,%edx | 0xffffcf98 | 0xffffcf98 | 0x8048415 | 11 | 0x0 |
| add %edx,%eax | 0xffffcf98 | 0xffffcf98 | 0x804841a | 11 | 0x0 |
| leave | 0xffffcf98 | 0xffffcf98 | 0x804841c | 14 | 0x0 |
| ret | 0xffffcf9c | 0x0 | 0x804841d | 14 |
20145208 GDB调试汇编堆栈过程分析的更多相关文章
- GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用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 ...
- 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 ...
随机推荐
- 足球宝贝来了,任你旋转(CSS3)
点击这里体验效果:http://keleyi.com/a/bjad/tfxpf3p5.htm 请使用支持CSS3的浏览器查看.请把光标放到图片上,然后再移到图片外,注意效果. 原图 大图 以下是源代码 ...
- ["1", "2", "3"].map(parseInt)?
["1", "2", "3"].map(parseInt)得到什么? 答案是:[1, NaN, NaN]. 原因:parseInt接收的是两 ...
- angularJs
学了差不多一个礼拜,感觉这个库还是很不错的,在应用中一些小笔记,其实这些笔记现在来看确实很基础,但是把这个博客当成我自己的一个记录历程,所以我也把这点笔记拿上来: 1.是一个js框架,是一个以js语言 ...
- Volley框架设置sessionid
(偷懒,写简略点) 自定义一个Request类 public class MyRequest extends Request<JSONObject> 存储上一次连接的sessionid ...
- # iOS 10 适配 # 适配刷新控件 以MJRefresh 为例
在iOS10中ScrollView 添加了一个refreshControl的东西 - - 不知道水果公司做了什么 导致原有的刷新控件类刷新后frame.y 向下偏移了20 起初以为是水果调整了sta ...
- MVC MODEL Attribute 操纵速记
目的: 扩充Attribute 任意读取并Render 需要的Attribute 用法: @Html.ParaLabelFor(x=>x.ServiceName):@Html.ParaN ...
- [Java编程思想-学习笔记]第1章 对象导论
1.1 抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, ...
- ORACLE会话连接进程三者总结
概念介绍 通俗来讲,会话(Session) 是通信双方从开始通信到通信结束期间的一个上下文(Context).这个上下文是一段位于服务器端的内存:记录了本次连接的客户端机器.通过哪个应用程序.哪个用户 ...
- YourSQLDba 配置——修改备份路径
公司一直使用YourSQLDba做本地备份,磁带机将本地备份文件上带做异地容灾备份.近期整理.验证备份时发现本地备份目录命名五花八门 其中有历史原因,也有无规划化的缘故,看着这些五花八门的目录,越看越 ...
- 问题解决——MFC Ribbon 添加图标
=================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载 请通过右 ...