GDB调试汇编堆栈
GDB调试汇编堆栈
分析过程
- C语言源代码
int g(int x)
{
return x+6;
}
int f(int x)
{
return g(x+1);
}
int main(void)
{
return f(5)+1;
}
使用
gcc -g exp1.c -o exp1 -m32指令在64位机器上产生32位汇编。

进入gdb调试器。

在main函数处设置一个断点。

使用run指令开始运行程序,返回main函数运行的结果。

使用
disassemble指令获取汇编代码。

使用
info registers命令查看各寄存器的值。

由上图可以看出,帧指针%ebp在0xbffff2e8,栈指针%esp在0xbffff2e4。
用
x+地址来查看%esp和%ebp的值,此时都为0。

display,设置程序中断后欲显示的数据及其格式。例如,如果希望每次程序中断后可以看到即将被执行的下一条汇编指令,可以使用命令
display /i $pc
将5压入栈中,传递参数


- call指令将返回地址压入栈中。


f函数汇编代码。

将栈指针的值压入栈中。

帧指针指向栈指针所在位置,以此为基址。

在%eax中计算

将g函数返回值放入%esp所指地址中

将6压入栈中,传递参数

调用g函数,调用call指令将f函数的返回地址压入栈中


g函数汇编代码

将栈指针的值压入栈中。

在%eax中计算

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


- ret将栈顶给%eip


- leave使栈做好返回的准备,等价于
movl %ebp,%esp //将%ebp的值给%esp
popl %ebp //将栈顶弹到%ebp中
ret指令,返回主函数

主函数汇编代码

执行leave后,各寄存器值

| 序号 | 指令 | %eip | %ebp | %esp | %eax | 栈顶->栈底 |
|---|---|---|---|---|---|---|
| 001 | movl $0x5,(%esp) | 0x80483e2 | 0xbffff2e8 | 0xbffff2e4 | 0x1 | 0x5 0x0 |
| 002 | call 0x80483bf | 0x80483bf | 0xbffff2e8 | 0xbffff2e0 | 0x1 | 0x80483e7 0x5 0x0 |
| 003 | push %ebp | 0x80483c0 | 0xbffff2e8 | 0xbffff2dc | 0x1 | 0xbffff2e8 0x80483e7 0x5 0x0 |
| 004 | mov %esp,%ebp | 0x80483c2 | 0xbffff2dc | 0xbffff2dc | 0x1 | 0xbffff2e8 0x80483e7 0x5 0x0 |
| 005 | sub $0x4,%esp | 0x80483c5 | 0xbffff2dc | 0xbffff2d8 | 0x1 | 0xbffff2e8 0x80483e7 0x5 0x0 |
| 006 | mov 0x8(%ebp),%eax | 0x80483c8 | 0xbffff2dc | 0xbffff2d8 | 0x5 | 0xbffff2e8 0x80483e7 0x5 0x0 |
| 007 | add $0x1,%eax | 0x80483cb | 0xbffff2dc | 0xbffff2d8 | 0x6 | 0xbffff2e8 0x80483e7 0x5 0x0 |
| 008 | mov %eax,(%esp) | 0x80483ce | 0xbffff2dc | 0xbffff2d8 | 0x6 | 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 009 | Call 0x80483b4 | 0x80483b4 | 0xbffff2dc | 0xbffff2d4 | 0x6 | 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 010 | push %ebp | 0x80483b5 | 0xbffff2dc | 0xbffff2d0 | 0x6 | 0xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 011 | Mov %esp,%ebp | 0x80483b7 | 0xbffff2d0 | Oxbffff2d0 | 0x6 | 0xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 012 | mov 0x8(%ebp),%eax | 0x80483ba | 0xbffff2d0 | 0xbffff2d0 | 0x6 | 0xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 013 | add $0x6,%eax | 0x80483bd | 0xbffff2d0 | 0xbffff2d0 | 0xc | 0xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 014 | Pop %ebp | 0x80483be | 0xbffff2dc | 0xbffff2d4 | 0xc | 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 015 | Ret | 0x80483d3 | 0xbffff2dc | 0xbffff2d8 | 0xc | 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 016 | leave | 0x80483d4 | 0xbffff2e8 | 0xbffff2e0 | 0xc | 0x80483e7 0x5 0x0 |
| 017 | Ret | 0x80483e7 | 0xbffff2e8 | 0xbffff2e4 | 0xc | 0x5 0x0 |
| 018 | add $0x1,%eax | 0x80483ea | 0xbffff2e8 | 0xbffff2e4 | 0xd | 0x5 0x0 |
| 019 | leave | 0x80483eb | 0x0 | 0xbffff2ec | 0xd | 0x0 |
| 020 | ret | 0xb7e3a533 | 0x0 | 0xbffff2f0 | 0xd |
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 + ...
- gdb调试汇编堆栈过程的学习
gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...
- 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 ...
随机推荐
- svn sync主从同步学习
svn备份的方式有三种: 1svnadmin dump 2)svnadmin hotcopy 3)svnsync. 优缺点分析============== 第一种svnadmin dump是官方推荐 ...
- Makefile的编写
makefile介绍 makefile的功能是管理源文件的编译链接,在makefile我们可以定义一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能 ...
- 手机站使图片高度统一jq代码
<script> function showImg(){ $(".honor_i_c img").each(function(index, element) { var ...
- 数据结构 浙大MOOC 笔记二 线性结构
线性表及其表现 第二章的内容是关于三种最基本的数据结构 结合<DDSA>第三章 表.栈和队列做一个总结 首先简单说明一下各个数据结构的特点: 数组:连续存储,遍历快且方便,长度固定,缺点是 ...
- HTTP Status 400 - Required String parameter 'userName' is not present 错误
HTTP Status 400 - Required String parameter 'userName' is not present 错误 先mark 有时间详细写 参考链接: https:/ ...
- CFURLCreateStringByAddingPercentEscapes与CFURLCreateStringByReplacingPercentEscapesUsingEncoding
iOS中访问HTTP资源需要对URL进行Encode才能正确访问. OC中有方法: - (NSString *)stringByAddingPercentEscapesUsingEncoding:(N ...
- 搭建Android开发环境附图详解+模拟器安装(JDK+Eclipse+SDK+ADT)
——搭建android开发环境的方式有多种,比如:JDK+Eclipse+SDK+ADT或者JDK+Eclipse+捆绑好的AndroidSDK或者Android Studio. Google 决定将 ...
- 自定义注解之运行时注解(RetentionPolicy.RUNTIME)
对注解概念不了解的可以先看这个:Java注解基础概念总结 前面有提到注解按生命周期来划分可分为3类: 1.RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成clas ...
- iOS10 远程推送服务器所需证书以及应用授权文件配置
推送证书制作步骤(目的:导出服务器需要的p12证书) 第一步: 打开Mac系统的"钥匙串访问"-"证书助理"-"从证书颁发机构请求证书" 取 ...
- seo优化urlrewrite伪静态技术
1.下载urlrewrite-3.2.0.jar 2.在WEB-INF下增加urlrewrite.xml <?xml version="1.0" encoding=" ...