Fork me on GitHub

哈工大 计算机系统 实验三 二进制炸弹

所有实验文件可见github 计算机系统实验整理

实验报告

实 验(三)

题 目 Binary Bomb
二进制炸弹    
专 业 计算学部
学   号
班   级
学 生
指 导 教 师
实 验 地 点  
实 验 日 期

计算机科学与技术学院

目 录

第1章 实验基本信息 - 3 -
1.1 实验目的 - 3 -
1.2 实验环境与工具 - 3 -
1.2.1 硬件环境 - 3 -
1.2.2 软件环境 - 3 -
1.2.3 开发工具 - 3 -
1.3 实验预习 - 3 -
第2章 实验环境建立 - 5 -
2.1 UBUNTU下CODEBLOCKS反汇编(10分) - 5 -
2.2 UBUNTU下EDB运行环境建立(10分) - 5 -
第3章 各阶段炸弹破解与分析 - 6 -
3.1 阶段1的破解与分析 - 6 -
3.2 阶段2的破解与分析 - 7 -
3.3 阶段3的破解与分析 - 8 -
3.4 阶段4的破解与分析 - 9 -
3.5 阶段5的破解与分析 - 11 -
3.6 阶段6的破解与分析 - 12 -
3.7 阶段7的破解与分析(隐藏阶段) - 14 -
第4章 总结 - 17 -
4.1 请总结本次实验的收获 - 17 -
4.2 请给出对本次实验内容的建议 - 17 -
参考文献 - 18 -

第1章 实验基本信息

1.1 实验目的
熟练掌握计算机系统的ISA指令系统与寻址方式
熟练掌握Linux下调试器的反汇编调试跟踪分析机器语言的方法
增强对程序机器级表示、汇编语言、调试器和逆向工程等的理解
1.2 实验环境与工具
1.2.1 硬件环境
X64 CPU;2GHz;2G RAM;512GHD Disk
1.2.2 软件环境
Windows7 64位以上;VirtualBox/Vmware 11以上;Ubuntu 16.04 LTS 64位/优麒麟 64位;
1.2.3 开发工具
GDB/OBJDUMP;EDB;KDD等
1.3 实验预习
上实验课前,必须认真预习实验指导书(PPT或PDF)
了解实验的目的、实验环境与软硬件工具、实验操作步骤,复习与实验有关的理论知识。
请写出C语言下包含字符串比较、循环、分支(含switch)、函数调用、递归、指针、结构、链表等的例子程序sample.c。
生成执行程序sample.out。
用gcc –S或CodeBlocks或GDB或OBJDUMP等,反汇编,比较。
列出每一部分的C语言对应的汇编语言。
修改编译选项-O (缺省2)、Og、O0、O1、O2、O3、Og,-m32/m64。再次查看生成的汇编语言与原来的区别。
堆栈访问[rbp+-n]或[rsp+n]。-fno-omit-frame-pointer。
GDB命令详解 –tui模式 ^XA切换 layout改变等等
有目的地学习: 看VS的功能GDB命令用什么?

第2章 实验环境建立

2.1 Ubuntu下CodeBlocks反汇编(10分)
CodeBlocks运行hellolinux.c。反汇编查看printf函数的实现。
要求:C、ASM、内存(显示hello等内容)、堆栈(call printf前)、寄存器同时在一个窗口。
在这里插入图片描述

图2-1 Ubuntu下CodeBlocks反汇编截图

2.2 Ubuntu下EDB运行环境建立(10分)
用EDB调试hellolinux.c的执行文件,截图,要求同2.1
在这里插入图片描述

图2-2 Ubuntu下EDB截图

第3章 各阶段炸弹破解与分析
每阶段15分(密码10分,分析5分),总分不超过80分

整体破解情况:
在这里插入图片描述

3.1 阶段1的破解与分析
密码如下:I was trying to give Tina Fey more material.
破解过程:
在这里插入图片描述

从上图画红线的位置往下,可以看出在给%esi传了一个值之后调用strings_not_equal函数,之后对寄存器之中的值进行判断,可以大胆猜测需要比较的炸弹的值就存在0x403150中,使用gdb查看一下该地址中的值:

在这里插入图片描述

可以发现其中的值是“I was trying to give Tina Fey more material.”则可以判断这就是这一阶段的炸弹值,经过验证之后确实如此
3.2 阶段2的破解与分析
密码如下:0 1 1 2 3 5
破解过程:阶段2的反汇编代码如下
在这里插入图片描述

从标号①处可以看出,明显这一阶段需要输入的是六个数字,进入该函数可以看到六个数字应该是每两个之间有一个空格的格式输入的。从标号②处可以看出,比较了输入的第一个和第二个数字,可以看出第一个数字是0,第二个数字是1。而从标号③处可以看出这是一个循环,需要一共输入六个数字,这一点也和我们从标号①处看到的相同。最后就是标号④,可以看出标号④进行的操作就是将第n-1与n-2处的数加起来得到第n位的数,也就是一个斐波那契数列,那么容易得到需要输入的炸弹值就是0 1 1 2 3 5。
3.3 阶段3的破解与分析
密码如下:
0 792 or 2 96(其中两个密码,还可能有多种组合)
破解过程:
在这里插入图片描述

通过汇编代码可以看出这是一个类似于switch跳转的跳转的类型,通过对输入类型的查看可以知道输入的应该是两个整型数字,且根据反汇编代码,可以发现第一个数字应该是在0到6之间,而我们发现366行有一个指针,经过对指针内容的查看,可以发现存储的地址是0x4014ac,如下图。
在这里插入图片描述

而根据366行的反汇编可以看出这一代码的目的就是将输入的数字乘以8之后作为地址的偏置量加到0x4014ac上,跳转到该步执行。从而如果输入的第一个数字是0的话,那么第二个数字就应该是792,如果第一个数字是2的话第二个数字就应该是96,其余密码以此类推可得。
3.4 阶段4的破解与分析
密码如下:24 2
破解过程:
根据对第四阶段反汇编代码的分析可以很轻易得出这一阶段的代码实现的是一个递归函数,递归函数如下:
在这里插入图片描述

可以发现在408行与412行都对函数进行了递归调用。而通过对主函数的分析可以发现,输入的还是两个整数(两个整数后输入一个特定字符串可以进入隐藏关卡,这一点最后说),而第二个整数必须是2,相关代码如下,
在这里插入图片描述

确定了这一点之后就可以通过对递归函数的分析来得到输入的第一个数字是多少。由于这个递归函数的递归关系较为复杂,因此直接使用了一个c语言程序来实现这一功能,c语言程序中的递归函数如下,
在这里插入图片描述
在这里插入图片描述

运行此函数可以发现输入的第一个数字应该是24。这一问需要注意的一点是和上面几个阶段不同,这一阶段是根据输入的第二个数字来确定第一个数字是多少,这是需要注意的。
3.5 阶段5的破解与分析
密码如下:ioa`eg
破解过程:
根据对于源码的分析,可以发现这是一个对于指针的考察,而我们发现有两个比较可疑的地址0x4031f0,0x4031a6,通过gdb查看,可以发现这是如下的字符串:
在这里插入图片描述
在这里插入图片描述

可以猜测我们需要用到的是maduiersnfotvbyl,根据后面的句子,显然这两个字符串不是最终的答案,最后的结果应该是根据这两个字符串进行一定的处理之后的一个结果,现在只是完成了第一步。

通过对上面这一部分代码的分析可以发现这是一个循环,则可以分析出输入的应该是一个6个字符组成的字符串,而通过对图中圈起的代码可以发现,这是对于读入的一个字符的处理,目的是得到该字符的ascii码低四位,通过对代码的分析我们可以清楚地发现,我们要以输入的六个字符的ASCII码的低四位作为字符串“maduiersnfotvbyl”的索引去除对应的六个字符,使这六个字符按顺序组成的新的字符串和"flames"相同。
我们发现flames中的字符在maduiersnfotvbyl中的顺序为9,15,1,0,5,7那么我们需要输入的字符就是ascii码低四位分别为9,15,1,0,5,7的字符,通过查找ascii码表我们可以查找到一个符合条件的字符串:ioa`eg
3.6 阶段6的破解与分析
密码如下:1 5 3 2 4 6
破解过程:
通过对第六阶段的反汇编代码的分析可以发现这一阶段需要输入的是六个整型数。由于这一阶段的反汇编代码很长,因此很难一步到位把握住这一阶段需要进行的任务是什么,那么可以先寻找是否有如上几问一样的地址存储的信息,可以先通过这一信息分析出一部分题解。可以发现有一个可疑的地址:0x4052d0,通过gdb查看这个地址中的信息,可以发现这是一个如下链表:
在这里插入图片描述

那么我们就可以大胆猜测这是对于这个链表进行的操作,那么我们再回头看上面的代码,可以发现一个如下的循环,根据这个循环我们就可以大致得出这一段代码完成的任务是什么了。
在这里插入图片描述

我们可以发现,这一段代码的对链表中的值进行了比较,最后达到炸弹不爆炸的要求应该是经过处理后的链表中存储的值应该是从小到大的,那么就可以大致猜测出这一段代码是对链表进行了重排之后希望使得链表中的值是从小到大排列的,那么如果真的是这样的话,我们可以得到一个数字列表:1 5 3 2 4 6,经过测试,确实是这样的。这一段代码实现的就是根据输入的数字与链表的节点的标号比较对链表进行重排后这一链表内存储的值应该是从小到大的。
3.7 阶段7的破解与分析(隐藏阶段)
密码如下:35
破解过程:
通过对第六阶段下面的代码进行分析,可以发现这个炸弹应该是存在第七阶段的,而第七阶段的入口应该是在前面的某一关中的,首先我们找到phase_defused函数,这一函数进行的就是判断是否进入隐藏阶段,对于这一函数中出现的每一个地址查看内容,我们可以发现三个有效的地址内容,如下:
在这里插入图片描述

24与2就是我们在第四问的时候输入的内容,而上面一个地址表明进入隐藏阶段的入口处输入的应该是两个整型数与一个字符串,那么可以大胆猜测就是在第四阶段的时候多输入一个字符串就可以进入隐藏阶段,而字符串信息如下:
在这里插入图片描述

经过求证,确实进入了隐藏阶段,那么接下来我们就对隐藏阶段的代码进行分析。可以发现这个同样是一个递归的函数,根据如下反汇编我们得知我们应该输入一个1~1001之间的数,
在这里插入图片描述

而根据如下代码我们又得出fun7的返回值必须为6,

那么我们就可以对fun7进行一个分析,很显然这是一个递归函数,而fun7的代码大致可以用如下c语言代码模拟:
在这里插入图片描述

经过分析我们可以发现返回值应该为6 = ((0 * 2 + 1) * 2 + 1) * 2,共4次递归,那么我们就可以直接使用gdb查看对应地址中的数值即可,具体过程如下:
第一次时%rsi的值<36,并读取0x4050f8的中存的地址值供递归调用:
在这里插入图片描述

第二次时%rsi的值>8,并读取0x405120中存的地址值供递归调用:
在这里插入图片描述

第三次时%rsi的值>22,并读取0x405160中存的地址值供递归调用:
在这里插入图片描述

最后读取0x405230中的内容,这时这里的内容就应该是我们要输入的答案了。
在这里插入图片描述

第4章 总结
4.1 请总结本次实验的收获
本次实验主要使我加深了对反汇编代码的理解,同时对于在gdb中的调试有了更加深入的了解。

4.2 请给出对本次实验内容的建议
可以增加更多具有趣味性的阶段。

注:本章为酌情加分项。

参考文献

为完成本次实验你翻阅的书籍与网站等

posted @   zsh1234  阅读(1006)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示