20145312 GDB调试汇编堆栈过程分析

参考资料

卢肖明同学的博客:《GDB调试汇编堆栈过程分析》: http://www.cnblogs.com/lxm20145215----/p/5982554.html

分析过程

  • 使用vim example.c命令编写C程序

  • 保存退出后使用gcc -S example.c命令生成example.s文件,并使用cat example.s命令查看汇编文件



  • 打开example.s文件进行修改:删去所有.*的语句,并保存,再次使用cat example.s命令查看汇编代码

  • 使用gcc example.c -o example生成example.o文件,并使用objdump -d example命令进行反汇编

  • 这里出现了一个错误:我先是按照书上的步骤输入objdump -d example.o命令进行反汇编,出现错误:objdump:example.o:无此文件,于是我打开目录文件夹,发现 example.o文件的命名为 example,重新修改命令,成功。

  • 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器



  • 进入之后先在main函数处设置一个断点,再run一下,使用disassemble指令获取汇编代码,用i(info) r(registers)指令查看各寄存器的值:



  • 使用display /i $pc命令,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。



  • 执行call指令将下一条指令的地址入栈







分析如下

  • 从main:开始执行,保存%ebp,并设置新的帧指针
 pushl   %ebp
movl %esp,%ebp
  • pushl $8分配4字节的栈空间,并且设置arg1=8,相当于
subl    $4,%esp
movl $8,(%esp)
  • call调用b,b同样初始化帧指针,分配栈空间
pushl   %ebp
movl %esp,%ebp
  • pushl 8(%ebp)将%esp中的8存入栈中,相当于
subl    $4,%esp
movl 8(%ebp),%eax
  • call调用a,a被调用,初始化栈指针,分配栈空间,将 %eax 与立即数 1 相加
addl    $1,%eax

分析如下

  • 从main:开始执行,保存%ebp,并设置新的帧指针
 pushl   %ebp
movl %esp,%ebp
  • pushl $8分配4字节的栈空间,并且设置arg1=8,相当于
subl    $4,%esp
movl $8,(%esp)
  • call调用b,b同样初始化帧指针,分配栈空间
pushl   %ebp
movl %esp,%ebp
  • pushl 8(%ebp)将%esp中的8存入栈中,相当于
subl    $4,%esp
movl 8(%ebp),%eax
  • call调用a,a被调用,初始化栈指针,分配栈空间将 %eax 与立即数 1 相加
addl    $1,%eax
  • 在a结束前弹栈
popl    %ebp
  • ret返回b中call的调用位置
  • b也结束,return返回main中call调用的位置
  • main继续 %eax 加14的操作
addl    $14,%eax
  • leave为返回准备栈,相当于%ebp出栈,最后ret结束
popl    %ebp
  • ret返回b中call的调用位置
  • b也结束,return返回main中call调用的位置
  • main继续 %eax 加14的操作
addl    $14,%eax
  • leave为返回准备栈,相当于%ebp出栈,最后ret结束

执行过程中%ebp、%esp、堆栈值的变化

指令 %esp %ebp 堆栈
push $0x8 0xbffff098 0xbffff098 0x0
call 0x8048401 0xbffff094 0xbffff098 0x8 0x0
push %ebp 0xbffff090 0xbffff098 0x8048412 0x8 0x0
mov %esp,%ebp 0xbffff08c 0xbffff098 0xffffd068 0x8048412 0x8 0x0
mov 0x804a020,%edx 0xbffff08c 0xbffff08c 0xffffd068 0x8048412 0x8 0x0
call 0x80483ed 0xbffff088 0xbffff08c 0xa 0xffffd068 0x8048412 0x8 0x0
push %ebp 0xbffff084 0xbffff08c 0x8048403 0xa 0xffffd068 0x8048412 0x8 0x0
mov %esp,%ebp 0xbffff080 0xbffff08c 0xffffd05c 0x8048403 0xa 0xffffd068 0x8048412 0x8 0x0
Pop %ebp 0xbffff080 0xbffff080 0xffffd05c 0x8048403 0xa 0xffffd068 0x8048412 0x8 0x0
ret 0xbffff084 0xbffff08c 0x8048403 0xa 0xffffd068 0x8048412 0x8 0x0
leave 0xbffff09c 0xbffff08c 0xffffd068 0x8048412 0x8 0x0
ret 0xbffff090 0xbffff098 0x8048412 0x8 0x0
add $0x4,%esp 0xbffff094 0xbffff098 0x8 0x0
mov $0x3,%edx 0xbffff098 0xbffff098 0x0
ret 0xbffff09c 0x0

20145312 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. 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Effective Java 53 Prefer interfaces to reflection

    Disadvantage of reflection You lose all the benefits of compile-time type checking, including except ...

  2. MySQL 存储过程实例 与 ibatis/mybatis/hibernate/jdbc 如何调用存储过程

    虽然MySQL的存储过程,一般情况下,是不会使用到的,但是在一些特殊场景中,还是有需求的.最近遇到一个sql server向mysql迁移的项目,有一些sql server的存储过程需要向mysql迁 ...

  3. emacs下安装pip

    Ubuntu13.10下安装pip的方法   $ sudo apt-get install python-pip python-dev build-essential  $ sudo pip inst ...

  4. Linux下FTP服务(一)—— Ubuntu安装

    参考:http://www.cnblogs.com/likwo/p/3154868.html 实验环境:Ubuntu 14.04 VMware虚拟机1. 安装 apt-get install vsft ...

  5. jQuery 获取页面元素的属性值

    获取浏览器显示区域(可视区域)的高度 :    $(window).height();    获取浏览器显示区域(可视区域)的宽度 : $(window).width();    获取页面的文档高度 ...

  6. git一些常用设置

    用法:git config [选项] 配置文件位置    --global              使用全局配置文件    --system              使用系统级配置文件    -- ...

  7. Hadoop Yarn core concepts

    The fundamental idea of YARN is to split the two major responsibilities of the JobTracker—that is, r ...

  8. 使用nmon监控服务器性能

    1.下载nmon:http://nmon.sourceforge.net/pmwiki.php?n=Site.Download 2.选择适合Linux系统版本的相应nmon版本,Linux查看系统版本 ...

  9. 【读书笔记《Android游戏编程之从零开始》】4.Android 游戏开发常用的系统控件(EditText、CheckBox、Radiobutton)

    3.4 EditText EditText类官方文档地址:http://developer.android.com/reference/android/widget/EditText.html Edi ...

  10. 2014 Super Training #10 C Shadow --SPFA/随便搞/DFS

    原题: FZU 2169 http://acm.fzu.edu.cn/problem.php?pid=2169 这题貌似有两种解法,DFS和SPFA,但是DFS怎么都RE,SPFA也要用邻接表表示边, ...