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 ...
随机推荐
- 解决eclipse编辑js和html卡的问题
window -> Preference -> General -> Editors -> Text Editors -> HyperLinking -> 取消勾 ...
- [原创]css3简单几步画一个乾坤图
效果如上,鼠标移上去会有动画. 代码如下非常简单: <html> <head> <style> .outer{height:100px;width:200px;bo ...
- 卡特兰数(Catalan)
卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 : 1, 2, ...
- 在Qt Creator 和在 vs2012 里添加信号和槽
原文地址:http://www.cnblogs.com/li-peng/p/3644812.html 作者:李鹏 出处:http://www.cnblogs.com/li-peng/ 本文版权归作者和 ...
- Android插件化框架研究-DroidPlugin
直接贴上我做的ppt.
- 卸载linux Mint自带jdk并安装最新jdk
查看安装的软件包sudo dpkg --list | grep -i jdk 删除jdksudo apt-get purge openjdk* 删除其他的包sudo apt-get purge ice ...
- Iterm2 ssh tab title
vim ~/.bashrc 添加一行 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 13.0px "H ...
- tornado中将cookie值设置为json字符串
不熟悉,找了很久,能FQ的话, https://groups.google.com/forum/#!topic/python-tornado/9Y--NgwjP_w 2楼有解释. tornado.es ...
- Django (2)
一.Django基本 程序编写 a. url.py /index/ -> func b. views.py def func(request): # 包含所有 ...
- ORA-00600: internal error code, arguments: [SKGMFAIL], [2], [4], [4], [1], [], [], [], [], [], [], [
ORA-00600: internal error code, arguments: [SKGMFAIL], [2], [4], [4], [1], [], [], [], [], [], [], [ ...