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. Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境搭建教程

    准备篇 一.环境说明: 操作系统:Windows Server 2012 R2 PHP版本:php 5.5.8 MySQL版本:MySQL5.6.15 二.相关软件下载: 1.PHP下载地址: htt ...

  2. 计算机信息统计.vbs

    temp=0 set wshshell=wscript.createobject("wscript.shell") Set WshNetwork = WScript.Createo ...

  3. Linux LDAP Server--->Clients配置

    Linux Ldap Configuration LDAP Server Base Software & SysTem Info SysTem Info 系统版本:centos 6.4 LDA ...

  4. 仅Firefox中A元素包含Select时点击Select不能选择option

    这是在使用京东的一个日期组件时碰到的bug,重现bug的代码精简如下 <!DOCTYPE HTML> <html> <head> <title> 仅Fi ...

  5. Linux系统之用户、群组和权限

    一.用户管理 创建用户时,系统为用户分配一个唯一的编号UID,同时为用户创建一个同名的组,并为组分配一个编号GID,并把该用户加入该组中. 系统规定: uid: 0       特权用户      u ...

  6. Set a static file on django

    1. In setting file: ROOT_PATH='/home/ronglian/project/taskschedule' STATIC_URL = '/static/' STATICFI ...

  7. Swift 学习笔记 enum 枚举类型

    异端,异端啊,我感觉这是map吧? enum ATMStatus { case Success(Int) case Error(String) } func withdraw(amount: Int) ...

  8. python实现虚拟茶话会

    这个项目目的是编写一个聊天服务器,该聊天服务器的功能有: 服务器能同时接收来自不同用户的连接 允许用户同时操作 能够解释命令,例如,say或者logout命令 服务器容易扩展 这个项目里面我们会使用到 ...

  9. UVALive 6449 IQ Test --高斯消元?

    题意:给你一串数字,问这串数字符合f[n] = a*f[n-1],f[n] = a*f[n-1]+b*f[n-2],f[n] = a*f[n-1]+b*f[n-2]+c*f[n-3]这几个方程中的哪个 ...

  10. HDU 1878 欧拉回路

    并查集水题. 一个图存在欧拉回路的判断条件: 无向图存在欧拉回路的充要条件 一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数且该图是连通图. 有向图存在欧拉回路的充要条件 一个有向图存在欧拉回 ...