20145314郑凯杰《信息安全系统设计基础》GDB调试32位汇编堆栈分析
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位汇编堆栈分析的更多相关文章
- GDB调试32位汇编堆栈分析
GDB调试32位汇编堆栈分析 测试源代码 #include <stdio.h> int g(int x){ return x+5; } int f(int x){ return g(x)+ ...
- 20145314郑凯杰《信息安全系统设计基础》第八周复习总结 Part A
20145314郑凯杰<信息安全系统设计基础>第八周复习总结 Part A 学习知识点内容总结 复习线索:http://group.cnblogs.com/topic/73069.html ...
- 20145314郑凯杰《信息安全系统设计基础》第9周学习总结 PART B
20145314郑凯杰<信息安全系统设计基础>第9周学习总结 PART B 明确教材学习目标 注意每个系统调用的参数.返回值,会查帮助文档 阅读教材,完成课后练习(书中有参考答案),考核: ...
- 20145314郑凯杰《信息安全系统设计基础》第7周学习总结 part B
20145314郑凯杰<信息安全系统设计基础>第7周学习总结 part B 上篇博客反思与深入 首先根据本周第一篇博客,娄老师给我的评论,我开始进行局部性的深入研究: 分为两个步骤,一是知 ...
- 20145314郑凯杰《信息安全系统设计基础》第5周学习总结 part B
20145314郑凯杰<信息安全系统设计基础>第5周学习总结 part B 在前四天的学习中,我主要对课本知识进行了总结,在本周后三天的学习过程中,我进行实践并截图. http://www ...
- 20145314郑凯杰《网络对抗技术》PE文件病毒捆绑(插入捆绑)的实现
20145314郑凯杰<网络对抗技术>PE文件病毒捆绑(插入捆绑)的实现 一.本节摘要 简介:每个应用程序内部都有一定的空间(因为文件对齐余留的00字段)可以被利用,这样就可以保证被插入的 ...
- 20145314郑凯杰《网络对抗技术》实验9 web安全基础实践
20145314郑凯杰<网络对抗技术>实验9 web安全基础实践 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET ...
- 20145314郑凯杰《网络对抗技术》实验5 MSF基础应用
20145314郑凯杰<网络对抗技术>实验5 MSF基础应用 1.0 MS08_067安全漏洞 1.1 实验目标 了解掌握metasploit平台的一些基本操作,能学会利用已知信息完成简单 ...
- 20145314郑凯杰《网络对抗技术》可选实验 shellcode注入与Return-to-libc攻击实验
20145314郑凯杰<网络对抗技术>可选实验 shellcode注入与Return-to-libc攻击实验 1.0 实践内容 Return-to-libc攻击是一种特殊的缓冲区溢出攻击, ...
随机推荐
- Asp.Net远程调试
1.在本地找到VS安装目录下的 Visual Studio Tools 文件夹 并进入Remote Debugger Folder文件夹 2.根据服务器的操作系统是32位还是64位,选择下面的文件夹 ...
- JFrame小练习1
1.文本域组件 public class TestJTextArea { public static void main(String[] args) { JFrame jf=new JFrame(& ...
- 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单
我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...
- luluzero的angularJs学习之路_angularJs示例代码
最近开始自学 angularJs这个前端MVC框架,感觉在前端实现MVC很酷有木有.哈哈哈... 先说说我对前端MVC的一个基本的理解吧(刚开始学习接触得还比较浅显,理解可能会有些不到位,还请各位大神 ...
- FOJ 1683 纪念SlingShot(矩阵快速幂)
C - 纪念SlingShot Description 已知 F(n)=3 * F(n-1)+2 * F(n-2)+7 * F(n-3),n>=3,其中F(0)=1,F(1)=3,F(2)=5, ...
- xcode 自定义include路径
- Java zip and unzip demo
目录结构如下: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import ...
- Doctype文档类型、作用及触发方式
Doctype文档类型 1) 该标签可声明三种 DTD 类型,分别表示严格版本.过渡版本以及基于框架的 HTML 文档. 2) HTML 4.01 规定了三种文档类型:Strict.Transit ...
- openfire+asmack搭建的安卓即时通讯(三) 15.4.9
(能用得上话的话求点赞=-=,我表达不好的话跟我说哦) 上一次我们拿到了服务器端的组数据和用户信息,这就可以为我们日后使用好友系统打下基础了! 但是光是拿到了这些东西我们怎么能够满足呢?我们一个即时通 ...
- 利用OpenCV检测图像中的长方形画布或纸张并提取图像内容
基于知乎上的一个答案.问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢 ...