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. 抓包工具charles使用教程指南

    0x01 前言: Charles是一款抓包修改工具,相比起burp,charles具有界面简单直观,易于上手,数据请求控制容易,修改简单,抓取数据的开始暂停方便等等优势!下面来详细介绍下这款强大好用的 ...

  2. TCP/IP包格式详解

    文章参考地址:http://blog.chinaunix.net/uid-20698826-id-4700710.html http://blog.csdn.net/mrwangwang/articl ...

  3. MyCat 学习笔记 第九篇.数据分片 之 数值分布

    1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值分片也是比较简单,其实这个和数据取摸是类似的实现. 优.缺点同上一篇 2 环境说明 参考  <MyCat 学习笔记>第六篇. ...

  4. 烂泥:【解决】ubuntu提示ilanni不在sudoers文件中错误

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 今天在Ubuntu系统中新建一个用户ilanni,添加完毕后.在执行有关sudo的命令时,提示如下的错误信息:ilanni 不在 sudoers 文件中 ...

  5. 烂泥:KVM快照的创建与恢复

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 因为要做有关KVM虚拟机的实验,所以需要虚拟机生成快照.查询相关资料,说KVM可以使用两种方法生成虚拟机的快照. 方法一.使用qemu-img snap ...

  6. 10_放置街灯(Placing Lampposts,UVa 10859)

    问题来源:刘汝佳<算法竞赛入门经典--训练指南> P70 例题30: 问题描述:有给你一个n个点m条边(m<n<=1000)的无向无环图,在尽量少的节点上放灯,使得所有边都被照 ...

  7. python lambda表达式简单用法

    习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: 1 2 3 4 5 6 7 8 # 普通条件语句 if 1 == 1:     name = 'wupeiqi' else ...

  8. jQuery 获取页面元素的属性值

    获取浏览器显示区域(可视区域)的高度 :    $(window).height();    获取浏览器显示区域(可视区域)的宽度 : $(window).width();    获取页面的文档高度 ...

  9. Learning C Struct

    为什么需要结构体类型? 一种语言本身往往会提供一些最基本的数据类型,比如数字型(int,bigint,float,double等),字符型,日期型,布尔型等.但现实世界中,我们面对的对象总是非常复常, ...

  10. [转]NPOI TestFunctionRegistry.cs

    本文转自:https://github.com/tonyqus/npoi/blob/master/testcases/main/SS/Formula/TestFunctionRegistry.cs   ...