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. Geoserver+Tomcat+GeoWebCache搭建地图服务

    依赖TomcatGeoserverGeoWebCache环境部署JDKTomcat服务器Geoserver配置GeoWebCache配置环境启动使用使用geowebcache进行切片 依赖 Tomca ...

  2. web.xml添加编码过滤器

    解决前后台交互汉字乱码 在项目中的web.xml中添加如下代码: <filter> <filter-name>CharacterEncodingFilter</filte ...

  3. ArrayList和HashSet的Contains()方法(转)

    来源: ArrayList和HashSet的Contains()方法 笔试题: package com.champion.test.exam; import java.util.ArrayList; ...

  4. Ajax深入解析

    AJAX:Asynchronous JavaScript And Xml(异步的JS和XML) 同步:客户端发起请求>服务端的处理和响应>客户端重新载入页面(循环) 异步:客户端实时请求& ...

  5. UEFI模式下Win10和Linux双系统

    一.准备 用Win自带的磁盘管理或者进PE分出一块空间来. 你必须要有一个U盘,然后使用软碟通或者ImageWriter把iso系统镜像文件烧录进去,这是比较传统的方法,但既然我们UEFI启动,那就根 ...

  6. URAL 1827 Indigenous Wars(排序、乱搞)

    题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...

  7. 本周psp个人作业

    计划--用一天的时间来做这个项目 需求分析--作为一个观众,我想要知道每局的比分,以便我更了解比赛情况. 生成设计文档--用类图来进行说明. 设计复审---无 代码规范--3H 具体设计--建立数据库 ...

  8. 更改WAS Profiles的概要文件的server1的SDK版本

    WebSphere只能使用IBM JDK 哦,不能使用sun的JDK哦.不过如果只是改jdk的版本的话可以参考如下步骤:(以集群为例,假设具有管理节点Dmgr01,应用概要AppSrv01) 1. 确 ...

  9. Delphi XE 10 DataSnap TCP 与 HTTP 比较

    在网络程序开发过程中,面临TCP  HTTP 的选择上往往让人陷入犹豫不决中,http的灵活和较强的穿透能力是TCP无法与之相提并论的,然而在响应速度和处理能力上却能看出后者比前者足够强大的地方.因此 ...

  10. 如何下架app

    因赶数日工期成,偷得浮生半日闲.遂登录iTunes Connect,发现之前做过的小程序,想将其下架,故而有此篇随想.(温馨提示:项目被下架后再次上架该版本,不需要再次经过审核)下面是详情步骤: 1. ...