计算机系统(2) 实验三 逆向工程实验

简介: 计算机系统(2) 实验三 逆向工程实验

一、 实验目标与要求:


理解程序(控制语句、函数、返回值、堆栈结构)是如何运行的

掌握GDB调试工具和objdump反汇编工具


二、实验环境:


计算机(Intel CPU)

Linux64位操作系统(Ubuntu 17)

GDB调试工具

objdump反汇编工具


三、实验方法与步骤:


本实验设计为一个黑客拆解二进制炸弹的游戏。我们仅给黑客(同学)提供一个二进制可执行文件bomb_64和主函数所在的源程序bomb_64.c,不提供每个关卡的源代码。程序运行中有6个关卡(6个phase),每个关卡需要用户输入正确的字符串或数字才能通关,否则会引爆炸弹(打印出一条错误信息,并导致评分下降)!


要求同学运用GDB调试工具和objdump反汇编工具,通过分析汇编代码,找到在每个phase程序段中,引导程序跳转到“explode_bomb”程序段的地方,并分析其成功跳转的条件,以此为突破口寻找应该在命令行输入何种字符串来通关。


本实验需解决Phase_1(15分)、Phase_2(15分)、Phase_3(15分)、Phase_4(15分)、Phase_5(15分)、Phase_6(10分)。通过截图+文字的形式把实验过程写在实验报告上,最后并撰写实验结论与心得(15分)。


917cad6f39fa420c97ae16f52c7427fb.png


四、实验过程及内容:


  1. 进行反汇编:

首先需要对二进制文件进行反汇编。在terminal中输入如下代码:


objdump -d bomb_64 > 1.txt


将事先编译好的二进制文件进行反汇编,并将汇编代码重定向到1.txt文件中。

此时只需对反汇编出来的代码进行分析,并完成六个关卡即可。


对六个关卡进行一一破解:

(1)phase1:(string,函数调用,栈)

①获取汇编代码:

5c5679d32be048e3ba194da15f3d5d60.png

②分析代码逻辑:

首先,第340行为函数调用进行开栈。第341行将0x401af8地址中的内容复制到%esi寄存器。第342行调用函数,判断字符串是否相等,若返回值为零,则跳转到400e87地址处;若不为零,则跳转到explode_bomb函数。


因此可以此处即为,判断输入是否与0x401af8中的字符串相等,相等则成功,不相等则炸弹爆炸,因此只需找到即可。


接下来,使用gdb进行获取0x401af8地址中的字符串。在gdb中输入如下代码:p(char *) 0x401af8

f44e04ae4be1428d94f9123b04995ce6.png

因此,只要输入Science isn’ t about why,it’ s about why not?即可

③进行测试:

输入Science isn’ t about why,it’ s about why not?

433059eeb53e4f399871f3b201d4f939.png

答案正确!

(2)phase2:(循环语句,数组)

①获取汇编代码:

eb6c53b6b60e4b8d8805ec9416960a5c.png

814eee53fa5a4742903f141e6aed97d9.png

②分析代码逻辑:


从代码的第356行,可以看到该函数首先调用了函数读入了6个数字,因此该关卡的答案由6个数组构成。并且可以看到,该读入6个数字的函数存放在内存地址为401743的地方,可以进入该地址查看read_six_numbers函数。


在主调函数phase_2中,可以发现,读入的6个数字将被存放在从%rsp指向的地址开始向上的位置。

70c67350f0904eeeb2cf4eff8331820b.png


如上的代码中用mov将0xc(%rbp)存入%eax中,并通过cmp比较两个值,如果两个值相等得到结果0,跳转到0x400eca,否则将执行函数引爆炸弹。


9a3ee1dbabd842769078756accdd6ae3.png

然后使用rbp作为迭代指针,rbp+12为迭代终点,一共迭代三次,而每次我们都将M[rbp] 和 M[rbp+12] 处的数据比对,如果不等则bomb。而对于int型,刚好是4字节,三个即为12字节。因此,这段函数正在判断读入的6个数字中前三个数字是否与后三个数字对应相等。


73c61d6dfbf7473a98abecb9ac5f96a3.png

r12寄存器在运行前被之前清零,每次运行又 += M[rbx],即在计算累加和。又根据后文test $r12d $r12d,可得,输入的6个数要满足累加和不等于0,否则将引爆炸弹。


综上,本题不引爆炸弹安全拆弹的条件是输入6个累加和不为零的数字,并满足前三个数字与后三个数字对应相等。

③进行测试:

根据上面的分析,可知1 1 1 1 1 1为一种合法的情况,进行输出并测试。


d20893c81c2d42d29f127a274ff90bc1.png


答案正确!

(3)phase3:(switch语句)

①获取汇编代码:

e907e331493941b4ace80d03c5a67aeb.png

②分析代码逻辑:


首先,在scanf调用前,传入第三第四个参数了,并存在rsp+8和rsp+12位置,从间距来看应该是int,然后又向esi传入常量,推测是scanf格式确定的字符串。因此可以利用gdb查看0x401ebe内存下的值。

这说明,本任务的输入为两个整数。


第11行中判断输入的第一个整数是否比7小,否则直接bomb。


第14行进行跳转,目的地址是M[0x401b60 + rax*8],其中rax是输入的第一个整数。当跳转到对应的地址后,将eax赋对应值,并跳转到第33行判断是否与第二个输入整数相等,如果不等则bomb。因此,程序大致为一switch型程序。现在我们只需找出switch对应的8个值即可。


利用gdb分别查看对应第一个输入为0~7时跳转的目的地址值


19dbae5beb334c10ba2760c0c1a1072e.png


因此,本题即为一个switch型函数,只要输入满足switch对应的8组数值即可。因此,合法输入如下:

0d9a642a3855430393c0460305689290.png

③进行测试: 根据分析,测试输入0 535

7bd6e4b768664c6e9950226805d5084a.png

答案正确!

(4)phase4:(递归)

①获取汇编代码:


04aff3014c884603b18353fd25bf3806.png

786bf1b8fafb4cf2b6f3c96baeefc592.png

②分析代码逻辑:


同样首先观察参数,发现这次scanf只读了一个参数,根据前面的经验不难看出,0x401ec1存储的是scanf的常字符串,使用gdb查看0x401ec1中的值。这说明,本题的输入仅有一个整数。

fe108b79fe654d95b6923340840397d8.png

主调函数的第14行判断fun_4的返回值是否为55,如果不是则bomb;


接下来观察被调函数fun_4。首先是压栈保存数据,再将传入的参数与1对比,小于等于1则跳转到0x400fb2,退出函数并返回。否则将传入的参数减一后再次调用func4函数,再将返回值存放在%ebp里,然后将原始参数减二后再次递归调用func4函数,将返回值与上一次递归得到的返回值%ebp相加存在%eax中。结合数学分析,该函数是求斐波那契数列第n项的值。


因此,只需找出斐波那契数列第几项的值为55即可,通过数学计算,是第9项。因此答案为9.

③进行测试:

通过上面的分析,输入9即可

303c1dacbf9a43c4999557b5f978b2a0.png

答案正确!

(5)phase5:(字串变换,ascii转换,寻址)

①获取汇编代码:

e0fc59ca3b3349278f55a3f0536fa11a.png

②分析代码逻辑:


首先观察scanf的输入,两个lea语句将scanf的第三第四个参数确定,采用与前面相同的方法,使用gdb对scanf的参数进行查看如下:

dee98fb188c646048f00bd5eb92a0bd9.png

即,本题输入为两个整数。

第14行对输入进行了截断,将第一个输出截断到0~15的,因此如果第一个输出被截断后等于15,将直接爆炸。


通过阅读后面的语句,可以发现存在一个循环,edx每次++,eax每次指向内存中的一个地址,又因为eax和rax是同一个,则相当于 k = next[k]这种数组跳转语句,并且偏移的单位是4字节,刚好是一个int,这更加确定了这里出现的是数组跳转语句。我们通过gdb查看这个数组。


使用gdb查看连续数组,结果如下:

3949a27b1419423395c69311b274b47c.png

可绘制表格如下:

1e8a70e2a0f8475e9280cbae599df1d1.png


c3d1f3f747af4e7caa631e27efd2971a.png

因此,继续对代码进行分析可知总跳转次数为12。并且,第二个输入值必须等于每次跳转的目标的累加和,而且最后一次跳转的结果是15。因此可以从15进行逆推12次并累加。


因此有11+13+9+4+8+0+10+1+2+14+6+15 = 93。因此最终答案为7 93

③进行测试:

输入7 93

849027e7a5494fe69af636b23f091887.png

答案正确!我们现在只剩下最后一题需要解决了!


(6)phase6:(寻址)

①获取汇编代码:

97993f86f7dc43ecb22d68188b231300.png

00817d0d7c024e408cab5ecde84c8e5c.png

②分析代码逻辑:


通过观察代码,可以知道,如果程序执行401112语句将会引爆炸弹,所以需要满足跳转条件,即,当edx==rax时跳转。


上面的代码将edx赋值为0xa,而esi为0。然后调用strtol函数。该函数的功能为把string转化为long,然后,存储到0x602780中。


于是猜测phase 6的功能是,将输入的字符串转化为数字后,经过func 6的处理,使其与某个值相等。func 6函数异常复杂,太多映射令人头疼。故而考虑利用gdb调试来测试rax和edx之间的关系。


在cmp %edx,(%rax)处(0x40110e)添加断点,查看%rax的值:


d21576f992c446e0a6663e46404f3c2f.png


任意输入一个数字,例如123456:

8ebd7d0dbd08417cb2eb318c36412bd1.png

输入rax与edx进行查看,可以发现,edx等于我们所输入的值123456,而rax等于673。因此 ,需要让二者相等,可以直接输入673进行尝试。

428f2cbf637a4ea5a6d570dc2f4b4186.png

③进行测试:


c73b7a6e7fe24fe2a974ce3bd501d146.png


答案正确!我们解决了所有的问题!


五、实验结论:


经过上面的六次拆弹,将6个炸弹全部成功拆除如下:


a8ff62a9557a4146997e121273b5f574.png

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
编解码 移动开发 视频直播
一文详解 m3u8 视频格式与分析视频秒开优化
秒开指的是,一秒内成功加载的播放数/播放总数。本意是想对比一下m3u8与mp4视频格式,并了解m3u8格式优缺点,以确定一个大概优化方向。但对m3u8做简单了解后,觉的m3u8可能是一个优化方向。
14014 4
一文详解 m3u8 视频格式与分析视频秒开优化
IEEE 754规格化浮点数所能表示的最大值和最小值
IEEE 754规格化浮点数所能表示的最大值和最小值
5154 1
IEEE 754规格化浮点数所能表示的最大值和最小值
|
监控 负载均衡 网络协议
TCP重传与超时机制:解锁网络性能之秘
TCP重传与超时机制:解锁网络性能之秘
4195 0
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
1380 1
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
机器学习/深度学习 PyTorch API
ONNX 与实时应用:延迟敏感场景下的部署策略
【8月更文第27天】在实时应用中,如自动驾驶汽车、视频分析系统等,快速响应和高吞吐量是至关重要的。Open Neural Network Exchange (ONNX) 提供了一种标准化的方法来部署机器学习模型,使其能够在不同的硬件和平台上高效运行。本文将探讨如何利用 ONNX 在延迟敏感的应用场景中部署模型,并提供一些策略和示例代码来确保低延迟和高吞吐量。
1809 4
|
监控 安全 数据安全/隐私保护
|
存储 NoSQL Linux
逆向工程【二进制炸弹】
逆向工程【二进制炸弹】
|
安全 PHP
文件上传--Upload-labs--Pass13&&14&&15--图片马
文件上传--Upload-labs--Pass13&&14&&15--图片马
1073 0
|
存储
【头歌·计组·自己动手画CPU】四、控制器设计(理论版) 【计算机硬件系统设计】
【头歌·计组·自己动手画CPU】四、控制器设计(理论版) 【计算机硬件系统设计】
1262 0