GDB调试32位汇编堆栈分析

测试源代码

#include <stdio.h>

int g(int x){
return x+5;
} int f(int x){
return g(x)+3;
} int main(ing argv,char *argc[]){
return f(7)+19;
}
  • main函数汇编代码

  • g函数汇编代码

  • f函数汇编代码

调试过程

  • 在汇编调试中单步执行使用si,而display /i $pc该语句可以使得我们每一次单步执行时输出正在执行的语句,i r $xxx则可以输出对应的寄存器中的值,方便我们跟踪调试

  • 根据代码,我们可以知道主函数只有return f(7)+19,在主函数中设下断点,可见当时%eip,%ebp,%esp,%eax的值(%eip为当前执行的指令的地址,%eax用于实参存储,计算,%ebp、%esp用于存储栈指针地址)

  • 调用f函数,call指令将会将下一条指令的地址入栈,且此时esp将会减4

  • 将eip中的值入栈,且此时esp已经发生了变化

  • 将上一个函数的基址入栈,当前%esp作为新基址

  • %esp的值减4,将值传入%eax中,并不是太懂这几步到底有什么具体的作用,只知道最后的值实在%eax中进行计算的,大概这几步是为了最后计算做准备





  • call指令将下一条指令地址入栈,开始调用函数g()

  • 地址入栈

  • 这几步和之前调用函数f()那几步作用应该是一样的,可能是传参用途(图值9、10)



  • 实参在%eax中进行计算

  • 出栈,将地址弹到%ebp中

  • ret指令将之前入栈的代码地址弹回%eip中,继续执行函数f()

  • 回到f函数中,进行实参的计算,然后出站,ret将代码地址弹回%eip,继续执行主函数main





  • 在主函数中完成计算,之后代码结束





堆栈分析

指令 %esp %ebp %eip %eax 堆栈
movl $0x7,(%esp) 0xbffff074 0xbffff078 0x8048414 0x1 0x0
call 0x80483f8 0xbffff074 0xbffff078 0x804841b 0x1 0x0
push %ebp 0xbffff070 0xbffff078 0x80483f8 0x1 0x8048420 0x0
mov %esp,%ebp 0xbffff06c 0xbffff078 0x80483f9 0x1 0xbffff078 0x8048420 0x0
sub $0x4,%esp 0xbffff06c 0xbffff06c 0x80483fb 0x1 0xbffff078 0x8048420 0x0
mov 0x8(%ebp),%eax 0xbffff068 0xbffff06c 0x80483fe 0x1 0xbffff078 0x8048420 0x0
mov %eax,(%esp) 0xbffff068 0xbffff06c 0x8048401 0x7 0xbffff078 0x8048420 0x0
call 0x80483ed 0xbffff068 0xbffff06c 0x8048404 0x7 0xbffff078 0x8048420 0x0
push %ebp 0xbffff064 0xbffff06c 0x8048404 0x7 0x8048409 0xbffff078 0x8048420 0x0
mov %esp,%ebp 0xbffff060 0xbffff06c 0x80483ee 0x7 0xbffff06c 0x8048409 0xbffff078 0x8048420 0x0
mov 0x8(%ebp),%eax 0xbffff060 0xbffff060 0x80483f0 0x7 0xbffff06c 0x8048409 0xbffff078 0x8048420 0x0
add $0x5,%eax 0xbffff060 0xbffff060 0x80483f3 0x7 0xbffff06c 0x8048409 0xbffff078 0x8048420 0x0
pop %ebp 0xbffff060 0xbffff060 0x80483f6 0x12 0xbffff06c 0x8048409 0xbffff078 0x8048420 0x0
ret 0xbffff064 0xbffff06c 0x80483f7 0x12 0x8048409 0xbffff078 0x8048420 0x0
add $0x3,%eax 0xbffff068 0xbffff06c 0x8048409 0x12 0xbffff078 0x8048420 0x0
leave 0xbffff068 0xbffff06c 0x804840c 0x15 0xbffff078 0x8048420 0x0
ret 0xbffff070 0xbffff078 0x804840d 0x15 0x8048420 0x0
add $0x13,%eax 0xbffff074 0xbffff078 0x8048420 0x15 0x0
leave 0xbffff074 0xbffff078 0x8048423 0x22 0x0
ret 0xbffff07c 0x0 0x8048424 0x22 0x0

GDB调试32位汇编堆栈分析的更多相关文章

  1. 20145314郑凯杰《信息安全系统设计基础》GDB调试32位汇编堆栈分析

    20145314郑凯杰<信息安全系统设计基础>GDB调试32位汇编堆栈分析 本篇博客将对第五周博客中的GDB调试32位汇编堆栈进行分析 首先放上以前环境配置的图: 图1: 测试代码: #i ...

  2. gdb运行时结合汇编堆栈分析

    一.从源代码文件到可执行文件         从C文件到可执行文件,一般来说需要两步,先将每个C文件编译成.o文件,再把多个.o文件和链接库一起链接成可执行文件.但具体来说,其实是分为四步,下面以ex ...

  3. 20145318 GDB调试汇编堆栈分析

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

  4. 20145219 gdb调试汇编堆栈分析

    20145219 gdb调试汇编堆栈分析 代码gdbdemo.c int g(int x) { return x+19; } int f(int x) { return g(x); } int mai ...

  5. gdb调试汇编堆栈分析

    代码(src/05/gdb.c) int g(int x) { return x + 4; } int f(int x) { return g(x); } int main(void) { retur ...

  6. 20145310 GDB调试汇编堆栈分析

    GDB调试汇编堆栈分析 由于老师说要逐条分析汇编代码,所以我学习卢肖明同学的方法,重新写了一篇博客. 代码: #include<stdio.h> short addend1 = 1; st ...

  7. 32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用

    32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用 一丶32位(x86也称为80386)与8086(16位)汇编的区别 1.寄存器的改变 AX 变为 EAX  可以这样想,16位通 ...

  8. 32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式

    32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各 ...

  9. 32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)

    32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议 ...

随机推荐

  1. servlet 访问流程

  2. gcc 使用

    参数 -E                只进行预处理-S                预处理和编译,生成汇编文件-c                预处理,编译和汇编,生成目标文件-g       ...

  3. Android -- 案例学习积累

    Theme ActionBar / ToolBar android.support.design.widget.CollapsingToolbarLayout android.support.desi ...

  4. 【Java EE 学习 47】【Hibernate学习第四天】【sesion】【一级缓存】【懒加载】

    一.Session概述 1.Session 接口是 Hibernate 向应用程序提供的操纵对数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载Java 对象的方法. 2.理解Sessi ...

  5. 在IntelliJ IDEA中添加框架支持时找不到Hibernate的解决办法

    问题描述 第一次在Add Frameworks support界面中添加hibernate支持的时候,异常中断,导致没有成功添加. 第二次进入Add Frameworks support窗口时,发现找 ...

  6. NewBluePill源码学习

    NewBluePill的源码也看的差不多了,一直说等有时间了再写学习的一些心得,拖来拖去弄到现在了,时间不是等来的,慢慢开始吧. 0x00     初识硬件虚拟化 硬件虚拟化对大数人来讲还是比较陌生. ...

  7. 【JavaScript兼容】关于IE8及以下无法通过getElementsByClassName()方法获得元素的解决方法

    try{ var a = document.getElementsByClassName("cla"); console.log(a); }catch(ex){ var array ...

  8. 《DSP using MATLAB》示例Example5.10

    代码: n = 0:10; x = 10*(0.8) .^ n; [xec, xoc] = circevod(x); %% -------------------------------------- ...

  9. VR的世界里没有雾霾!暴风魔镜发布Matrix一体机

         在2016年接近尾声的时候,暴风魔镜给VR行业带来一波暖流.12月20日,暴风魔镜宣布推出最新VR一体机--暴风魔镜"3K屏概念机"MATrix及VR眼镜S1两大产品. ...

  10. Excel转Json,Json转CSharp

    一份给策划最好的礼物!就是:Excel2Json2CSharp 策划配置Excel,动不动就要改数值啊,增加字段啊. 程序这边对应的解析类就得改动啊.整一个麻烦了得! 所以我就整理了这个Excel2J ...