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 ...
随机推荐
- int与CString互相转化
int num; CString str; //int转CString num=; str.Format(_T("%d"),num); //CString转int str=L&qu ...
- 创伤后应激障碍(PTSD)
创伤后应激障碍(Post Traumatic Stress Disorder,PTSD)又称延迟性心因性反应(Delayed Psychogenic Reaction),是由应激性事件或处境而引起的延 ...
- 复习(1)【Maven】
终于开始复习旧知识了,有输入必然要有输出.输入和输出之间的内化过程尤为重要,在复习的同时,真正把学到的东西积淀下来,加深理解. Maven项目概念与配置 Maven是一个项目管理和综合工具.Maven ...
- HashMap和 Hashtable的比较
Hashtable 和 HashMap的比较 1. HashMap可以接受null(HashMap可以接受为null的键值(key)和值(value), HashTable不可以接受为null的键( ...
- linux 下Qt WebEngine 程序打包简单记录
本次记录仅作参考. 程序说明: 程序是一个编解码器控制管理的工具,使用到的库有:Qt的WebEngine.OpenGL模块.poco库.libmicrohttpd.libcurl.libvlc.同时程 ...
- Xcode工作区间xxxx.xcworkspace不包含xxxx.xcodeproj
一.问题描述 项目用到cocoapods管理第三方框架,所以需要打开xxxx.xcworkspace,Pods正常显示,但xxxx.xcodeproj显示红色,不包含xxxx.xcodeproj并且无 ...
- USB_HID读写上位机VC++
在工程属性-->链接器-->添加以下库 open 打开,close 关闭,打开后将获得reader 与writer 的handle,分别进行读写即可 #pragma once #ifdef ...
- 为WAMP中的mysql设置密码(默认为空)
为WAMP中的mysql设置密码 WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 1.首先,通过WAMP打开mysql控制台. 提示 ...
- MongoDB 效率
写入: 插入100万条数据:用InsertMany,耗时16s左右. 读取: 读取300万条数据,耗时3600毫秒.
- SqlServer 2008登录时报错
登录SQLServer2008R2时提示如下错误: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server ...