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

本篇博客将对第五周博客中的GDB调试32位汇编堆栈进行分析

首先放上以前环境配置的图:

图1:

测试代码:

#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)+14;
}

汇编堆栈分析过程:

预热

首先,进行最简单的helloworld的测试,用以熟悉步骤

图2:

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

b 位置 语句先在main函数处设置一个断点,r一下,使用disassemble指令获取汇编代码

图3:

图4:

完成预热,开始执行我的代码wk5run.c

正式汇编栈堆分析

图5:

按上面的步骤跑wk5run.c,并用gdb 进入gdb调试器,并查看汇编代码

图6:

设置断点在main函数处,并查看寄存器的值。

图7:

接下来改设断点至g函数,同样的步骤

图8:

图9:

调试过程

元知识:

  • 单步执行使用si
  • 单步执行时输出正在执行的语句display /i $pc
  • 输出对应的寄存器中的值,方便我们跟踪调试 i r $xxx

对于断点设在main的情况,我们进行 跟踪调试

图10:

%eip为当前执行的指令的地址,%eax用于实参存储,计算,%ebp%esp用于存储栈指针地址

接下来使用si进行单步执行,然后继续观察

图11:

通过观察,我们可以看到,main的值上涨2,而此时esp的值会-4.

分析:这是因为call指令使

图12:

再次进行单步执行,我们发现esp值已经发生变化,说明程序按照流程正在进行。

分析:此时eip中的值入栈了,明显的看到了esp值改变

图13:

程序进动,上一个函数的基址入栈,当前%esp作为新基址

图14:

分析:%esp的值减4,然后eax中增加了6,是为了后面的计算作准备,根据后面来分析。

我知道最终输出的值是在%eax中输出的,因此我直接不断进行si指令并在每一次调出“i r $eip $ebp $esp $eax”来查看各寄存器中的值。

直到出现以下界面:

图15:

从图中可以看到ebp、esp的值首先变化,然后带动最终的eax寄存器中的值也从原来的空到现在有值的变化。

还可以看到,现在已经开始地址入栈了,调用了g函数

图16:

接下来继续执行,g函数中的步骤在一步一步进行,%eax中的值也随着步骤在增长

图17:

此后出现了ret语句,所以对此前的所有语句进行一次分析:

  • 在调用f函数时,call指令将会将下一条指令的地址入栈
  • 在push语句时,标明该步骤需要数值出栈。
  • call语句将吓一跳指令地址入栈

接下来遇到其他语句:

图18:

pop语句:出栈,将地址弹到%ebp中。

ret指令:将之前入栈的代码地址弹回%eip中,此后开始执行f函数

add指令:简单的将寄存器中的值相加

图19:

程序如上执行,这里我们遇到了一个leave指令

不是很懂leave指令是做啥的,参考了卢肖明的博客之后,我发现他这么说的

图20:

也就是说,leave指令起到的是恢复功能,其原理是先进行寄存器对齐对位,然后再进行弹栈操作。

另一方面,在寄存器中的值也是按照步骤而上涨

图21:

最终,完成执行,分析也到此结束。

指令 %esp %ebp %eip %eax 堆栈
push $0x7 0xffffd098 0xffffd098 0x80483fc 0xf7fbadbc 0x0
call 0x80483e6 0xffffd094 0xffffd098 0x80483fe 0xf7fbadbc 0x7 0x0
push 0xffffd098 0xffffd094 0xffffd098 0x80483fe 0xf7fbadbc 0x08048403 0x7 0x0
mov %esp %ebp 0xffffd08c 0xffffd098 0x80483e7 0xf7fbadbc 0x08048403 0x7 0x0
pushl 0x8(%ebp) 0xffffd08c 0xffffd08c 0x80483e9 0xf7fbadbc 0xffffd08c 0x08048403 0x7 0x0
call 0x80483db(g) 0xffffd088 0xffffd08c 0x80483ec 0xf7fbadbc 0x80483ec 0xffffd08c 0x08048403 0x7 0x0
push %ebp 0xffffd084 0xffffd08c 0x80483db 0xf7fbadbc 0xffffd08c 0x80483ec 0xffffd08c 0x08048403 0x7 0x0
mov %esp %ebp 0xffffd080 0xffffd08c 0x80483dc 0xf7fbadbc 0xffffd08c 0x80483ec 0xffffd08c 0x08048403 0x7 0x0
mov (0x8)%ebp %eax 0xffffd080 0xffffd080 0x80483de 0xf7fbadbc 0xffffd08c 0x80483ec 0xffffd08c 0x08048403 0x7 0x0
add $ox5 %eax 0xffffd080 0xffffd080 0x80483e1 0x7 0xffffd08c 0x80483ec 0xffffd08c 0x08048403 0x7 0x0
pop %ebp 0xffffd080 0xffffd080 0x80483e4 0xc 0x80483ec 0xffffd08c 0x08048403 0x7 0x0
ret 0xffffd084 0xffffd08c 0x80483e5 0xc 0xffffd08c 0x08048403 0x7 0x0
add $0x4 $esp 0xffffd088 0xffffd08c 0x80483f1 0xc 0xffffd08c 0x08048403 0x7 0x0
add $0x3 $eax 0xffffd08c 0xffffd08c 0x80483f4 0xc 0xffffd08c 0x08048403 0x7 0x0
leave 0xffffd08c 0xffffd08c 0x80483f7 0xf 0x08048403 0x7 0x0
ret 0xffffd090 0xffffd0898 0x80483f8 0xf 0x7 0x0
add $0x4 $esp 0xffffd094 0xffffd0898 0x8048403 0xf 0x7 0x0
add $0x13 $eax 0xffffd098 0xffffd0898 0x8048406 0xf 0x7 0x0
leave 0xffffd098 0xffffd0898 0x8048409 0x22 0x0
ret 0xffffd09c 0x0 0x804840a 0x22
add $0x10 $esp 0xffffd0a0 0x0 0x7e21637 0x22
sub 0xc %esp 0xffffd0b0 0x0 0x7e2163a 0x22
push %eax 0xffffd0a4 0x0 0x7e2163d 0x22
call 0xf7e377b0 0xffffd0a0 0x0 0x7e2163e 0x22
call 0xf7f260d9 0xffffd09c 0x0 0x7e377b0 0x22

20145314郑凯杰《信息安全系统设计基础》GDB调试32位汇编堆栈分析的更多相关文章

  1. GDB调试32位汇编堆栈分析

    GDB调试32位汇编堆栈分析 测试源代码 #include <stdio.h> int g(int x){ return x+5; } int f(int x){ return g(x)+ ...

  2. 20145314郑凯杰《信息安全系统设计基础》第八周复习总结 Part A

    20145314郑凯杰<信息安全系统设计基础>第八周复习总结 Part A 学习知识点内容总结 复习线索:http://group.cnblogs.com/topic/73069.html ...

  3. 20145314郑凯杰《信息安全系统设计基础》第9周学习总结 PART B

    20145314郑凯杰<信息安全系统设计基础>第9周学习总结 PART B 明确教材学习目标 注意每个系统调用的参数.返回值,会查帮助文档 阅读教材,完成课后练习(书中有参考答案),考核: ...

  4. 20145314郑凯杰《信息安全系统设计基础》第7周学习总结 part B

    20145314郑凯杰<信息安全系统设计基础>第7周学习总结 part B 上篇博客反思与深入 首先根据本周第一篇博客,娄老师给我的评论,我开始进行局部性的深入研究: 分为两个步骤,一是知 ...

  5. 20145314郑凯杰《信息安全系统设计基础》第5周学习总结 part B

    20145314郑凯杰<信息安全系统设计基础>第5周学习总结 part B 在前四天的学习中,我主要对课本知识进行了总结,在本周后三天的学习过程中,我进行实践并截图. http://www ...

  6. 20145314郑凯杰《网络对抗技术》PE文件病毒捆绑(插入捆绑)的实现

    20145314郑凯杰<网络对抗技术>PE文件病毒捆绑(插入捆绑)的实现 一.本节摘要 简介:每个应用程序内部都有一定的空间(因为文件对齐余留的00字段)可以被利用,这样就可以保证被插入的 ...

  7. 20145314郑凯杰《网络对抗技术》实验9 web安全基础实践

    20145314郑凯杰<网络对抗技术>实验9 web安全基础实践 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET ...

  8. 20145314郑凯杰《网络对抗技术》实验5 MSF基础应用

    20145314郑凯杰<网络对抗技术>实验5 MSF基础应用 1.0 MS08_067安全漏洞 1.1 实验目标 了解掌握metasploit平台的一些基本操作,能学会利用已知信息完成简单 ...

  9. 20145314郑凯杰《网络对抗技术》可选实验 shellcode注入与Return-to-libc攻击实验

    20145314郑凯杰<网络对抗技术>可选实验 shellcode注入与Return-to-libc攻击实验 1.0 实践内容 Return-to-libc攻击是一种特殊的缓冲区溢出攻击, ...

随机推荐

  1. 手把手集成web端手写公式功能

    何为手写公式,很简单,就是在网页上可以写出数学公式,并能够生成Latex格式的字符串.废话不多说,直接走正题. 一.首先大家可以先去官网了解一下myscript这个插件 官方网站:https://de ...

  2. 每日Scrum--No.5

    Yesterday:学习并编写代码 Today:组织小组开一次阶段性的总结会议:讨论需求分析中存在的问题:继续学习和编写代码:总结前阶段代码出现的问题 Problem:编程要注意很多的特殊情况,程序成 ...

  3. Effective Java 68 Prefer executors and tasks to threads

    Principle The general mechanism for executing tasks is the executor service. If you think in terms o ...

  4. C/S架构程序多种类服务器之间实现单点登录(转)

    (一) 在项目开发的过程中,经常会出现这样的情况:我们的产品包括很多,以QQ举例,如登陆.好友下载.群下载.网络硬盘.QQ游戏.QQ音乐等,总不能要求用户每次输入用户名.密码吧,为解决这个问题,高手提 ...

  5. 烂泥:KVM虚拟机windows系统增加硬盘

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 前一篇文章介绍了有关linux系统添加硬盘的方法,这次我们来介绍有关windows系统添加的相关步骤. 其实linux和windows添加的硬盘的方法都 ...

  6. Git 升级与基础适用

    Git 升级 老方法 yum install git 目前centos6安装的 git 版本为1.7相对于 github 以及自己安装的 git 服务器都相对比较老,所以一般不适用此方法安装) 编译安 ...

  7. Legendre polynomials

    In mathematics, Legendre functions are solutions to Legendre's differential equation: In particular, ...

  8. 如何用dos命令运行testng

    写好的自动化程序怎么让它运行呢,总不能每次都启动eclipse吧,下面就先介绍一种用dos命令运行testNG的方法. 1.把项目打成jar吧,我用的是Fat jar工具. 2.在电脑的某个盘建一个文 ...

  9. 【Android UI设计与开发】8.顶部标题栏(一)ActionBar 奥义·详解

    一.ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和men ...

  10. 分享一个解决MySQL写入中文乱码的方法

    分享一个解决MySQL写入中文乱码的方法 之前有发帖请教过如何解决MySQL写入中文乱码的问题.但没人会,或者是会的人不想回答.搜索网上的答案并尝试很多次无效,所以当时就因为这个乱码问题搁浅了一个软件 ...