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. 【AdaBoost算法】积分图代码实现

    一.积分图介绍 定义:图像左上方的像素点值的和: 在Adaboost算法中可用于加速计算Haar或MB-LBP特征值,如下图: 二.代码实现 #include <opencv/highgui.h ...

  2. celery 快速入门教程 celery 定时器

    当然首先得安装celery和rabbitmq-server,如果有redis需要安装redis 安装Redis $ yum install redis 启动 Redis $redis-server 检 ...

  3. WebService核心文件【server-config.wsdd】详解及调用示例

    WebService核心文件[server-config.wsdd]详解及调用示例 作者:Vashon 一.准备工作 导入需要的jar包: 二.配置web.xml 在web工程的web.xml中添加如 ...

  4. mysql数据库---同时插入两个表以上的数据

    mysql数据库问题,如何同一个操作添加两个表(a表,b表),并把b表的id添加到a表字段中,b表id自动增长 在数据库中创建存储过程,比如存储过程的名字叫做 test在java中和正常使用sql的方 ...

  5. 2012年 蓝桥杯预赛 java 本科 题目

    2012年 蓝桥杯预赛 java 本科 考生须知: l  考试时间为4小时. l  参赛选手切勿修改机器自动生成的[考生文件夹]的名称或删除任何自动生成的文件或目录,否则会干扰考试系统正确采集您的解答 ...

  6. table边框美化

    在<table>里面加代码就可以了. 效果1: <TABLE style="BORDER-RIGHT: #993333 3px dashed; BORDER-TOP: #9 ...

  7. PAT之我要通过

    题目描述 “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输 出“答案正确”,否则输出“答案错误”. 得到“答案正确”的 ...

  8. 谷歌开源项目Google Preview Image Extractor(PIEX) (附上完整demo代码)

    前天偶然看到谷歌开源项目中有一个近乎无人问津的项目Google Preview Image Extractor(PIEX) . 项目地址: https://github.com/google/piex ...

  9. two sum - leetcode

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  10. 链表面试题Java实现【重要】

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...