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调试汇编堆栈的更多相关文章

  1. GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...

  2. 20145212——GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...

  3. gdb调试汇编堆栈过程的学习

    gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...

  4. 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析

    20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...

  5. 赵文豪 GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 使用gdb调 ...

  6. 20145337 GDB调试汇编堆栈过程分析

    20145337 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...

  7. 20145208 GDB调试汇编堆栈过程分析

    20145208 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...

  8. 20145218 GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 虚拟机中分析过程 输入gcc - g example.c -o example -m32指令在64位机器上产生32位汇编,但出现以下错误: 这时需要使用sudo apt-g ...

  9. 20145236 GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 首先需要输入sudo apt-get install libc6-dev-i386安装一个库才能产生汇编代码,然后输入gcc - g example.c -o exampl ...

随机推荐

  1. MarkdownPad 2 在win10下出错:HTML 渲染错误(This view has crashed) 的解决办法 + MarkdownPad2.5 注册码

    首先附上MarkdownPad2.5的注册码. 邮箱:Soar360@live.com 授权密钥: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImD ...

  2. Android控制ScrollView滚动

    有两种办法,第一种,使用scrollTo(),这个方法不需要handler,直接调用就行 第二种方式,使用fullScrol() 下面我们看一下这个函数: scrollView.fullScroll( ...

  3. python之路二十一

    URL        - 两个    Views        - 请求的其他信息        from django.core.handlers.wsgi import WSGIRequest   ...

  4. PHP 查看安装信息

    1.运行PHP脚本,查看phpinfo函数的输出. 2.在系统环境变量Path中配好php.exe可执行文件的路径,命令管理器CMD中,执行`php.exe -i`查看. 3.在phpinfo()的输 ...

  5. highcharts使用笔记

    1.legend取消点击事件: 饼图:plotOptions.pie.point.events.legendItemClick = function() {return false;} 其他,如:pl ...

  6. 我的bootstrapTable的应用

    $(function () { //$('#table').attr("data-url", "/conference/" + location.href.sp ...

  7. 设计模式--适配器模式Adapter(结构型)

    一.适配器模式 适配器模式的主要作用是在新接口和老接口之间进行适配.将一个类的接口转换成客户端期望的另外一个接口.其实适配器模式有点无赖之举,在前期设计的时候,我们就不应该考虑适配器模式,而应该通过重 ...

  8. win10进入安全模式的方法(F8不管用/开不开机)

    win10默认不能进入安全模式,这时候开机黑屏怎么办?下面介绍强制进入安全模式的方法 1. 关机情况下,按开机键开机,等到出现徽标(下图),这时候长按开机键强制关机. 2. 再次开机,出现徽标,再次强 ...

  9. Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...

  10. 【原创】node+express+socket搭建一个实时推送应用

    技术背景 Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新. 应用场景: 监控系统:后台硬件热插拔.LED.温度.电压发生变化 即 ...