记ICS的lab2--bomb实验

(我真的是瞎tm投机取巧解开的bomb,我并不能保证帮上你什么忙,兄弟!)

 

实验总结

首先这个实验真的是花了很多很多的时间了,逻辑硬伤,解得很慢。如果不是等到全部解完已经过去一周之后才写报告,我想我是不能心平气和的回顾这个过程,真是太痛苦了,我明明什么都不会,就要开始做实验。不过真的学到很多,可以说我的汇编都是因为这个实验才学会的吧。虽然很难,但是美国人真棒!

实验结果:

 

 

实验内容:6个phase加隐藏关都已经解开了

1、逆向工程拆除“二进制炸弹”程序

2、增强对程序机器级表示、汇编语言、调试器和逆向工程等理解

3、Binary Bombs 是一个Linux可执行c程序,包含phase1~phase6

4、炸弹运行各阶段要求输入一个字符串,若输入符合程序预期,该阶段炸 弹被“拆除”,否则“爆炸”

5、

   

实验过程:

1先载一个gdb,百度到的一个指令,输入后就会下载gdb,下载过程大概有十几分钟。我已经载好了。

 

看看gdb的版本信息,确定已经成功下载

 

 

Gdb下Bomb试运行:

 

 

Phase_1

通过gdb查看入栈的地址,得到一句话为:“There are rumors on the internets.

第一个通过。

 

Phase_2

汇编代码见下图注释:

 

 

根据分析得到公式:a[n+1]-a[n]=n+1 (n0开始)

并且根据gdb分析8048adf read six numbers得,只需要六个数

结果为a[n]的值。

所以这几个数为1 2 4 7 11 16

 

Phase_3

代码解释见行后注释

 

 

 

1、根据GDB查看可知需要输入两个整数 %d %d

2、两个整数会压栈,注意压栈和参数顺序的关系,这个地方我弄错了顺序,卡了很久

跳转表:

 

3、我用了一个例子去尝试计算,输入第一个数为0的情况,然后就可以通过了,所以我就没继续看别的情况了

根据进制转换计算十六进制立即数,再根据一系列运算,得第二个数为637

 

故结果为0  637

震惊!在这个过程中我偶然发现了一个秘密:

 

 

 

这好像也不是什么秘密。。。

 

 

Phase_4:

 

Phase4代码分析见注释

 

1、在地址8048c35处可见输入的数减去2之后还要小于等于2,又因为这个数是正数,所以我假设第二个数为3

 

 

Fun4太麻烦了,我尝试着去写c代码,但是一晚上过去了我头发都要掉光了都没有搞懂。

所以我不干了,在知道第二个数的范围的情况下,我查了phase4里的fun4返回值,见call fun4后的cmp语句,用gdb查询8048c26地址处的eax的值,得到162

所以得到的结果是162 3

 

 

phase_5

 

如下图注释可知,

1、先获取字符串长度,检查是否长度为6,接着用gdb查看地址,得到一句话。

2、又由0x8049ea6的值可知 配对的字母是flyers

 

记录下flyers在一句话里的位置。见注释

 

***输入的六个数分为两组

前一组两个数:是固定的

后一组四个数,只要该字母的ascii码的末尾数和yers的位置分别对应就可以了。

 

 

 

结果有很多组,一组符合就可以了

 

 

phase_6

先读6个数,然后mov来mov去我也不知道它到底想干嘛,跳来跳去就跳不出去了,还炸了,然后查了地址,嗯然后,魔鬼链表。

我最后载了ida去看的代码,因为实在是太乱了。

 

1、读入六个数,且都不大于6

 

 

2while循环,r12d和ebx是一个循环计数器。该循环用于判断这6个数是否存在等于0的。可以推测得到每个数字都不为0.

 

 

 

3、还好实验介绍里说了这是个链表不然我真的要看不懂了,地址一般都挺有用的,我查看了这个地址,发现是一个链表的内容,有值和序号

 

 

4、排序,其实我没有搞清楚之间是什么联系,但是根据要求,6个数就是前六个链表的序号,所以猜测会重新排序。

 

 

5、分析之后发现是升序

 

 

Secret phase

1、首先要找到<secret_phase>的入口,搜索发现入口是在<phase_defused>里面.

2、发现一个计数器,每当调用一次<read_line>每自增1,因此只有6关全通才能打开隐藏关卡

3、gdb查看前几关输入字串的指针,发现Phase 4只需输入一个数字,因此只需在第4关的输入中多输入一个"austinpowers"就可以进入<secret_phase>.

以下是fun4和secret_phase的c代码

 

 

IDA真是我的快乐源泉!!

 

Fun4函数的第一个参数为n1的值,也就是0x804c088地址附近处的值。

其实这个c程序很容易就能看出是个二叉树,还好之前学过一些数据结构。

左子树的值<父节点的值, 右子树的值>父节点的值

又因为返回值要等于7,所以就考虑奇数的情况。

 

 

最后用gdb查看,得到1001

 

实验心得

先说说在这个过程中学到的吧,这个实验前前后后总共花了我大概有几十个小时了,可能我傻吧,第四关的递归实在是写不出来c程序,心累到想退学。(这个实验一定要坚持布置给学弟学妹!一定要让他们得到充分的锻炼!)

在开始做这个实验之前,我真的不会什么汇编,我一开始连反汇编回来的代码都不知道从哪里入手,搁置了一周的时间才开始做。

我的拆弹过程大概是这样吧:

第一天——不知道从哪里入手,百度了一篇,说要载gdb,所以学到了gdb是什么东西,怎么下载,简单的一些调试指令

第二天——看了phase1,发现汇编指令有好多,看不太懂,所以去图书馆借了一本华章的汇编语言,自习了两个晚上。懂了at&tintel两种格式的各种汇编指令。

第三天——觉得今天可以开始开始解了,发现我不知道phase1到底要我干什么,发现网上博客说要查地址,我也照着去查了地址,然后第一关就过了,我天真的以为我以后的每一关也是如此快乐。

第四天——解到第二个的时候,才想起来我曾经学过这么个递推。

第五天——听说了一个叫IDA的东西,但是我居然以为它也是一个和objdump差不多的东西,就没在意。

然后我感冒了一周,躺了一周

然后fun4好难噢

突然有一天——朋友说他查了个地址就把第四个解出来了,我很震惊,我抱着电脑就去堵他了。然后我打开了新世界的大门,居然还能这样解!

最后一天——我载了IDA,发现phase5设置了反编译,所以我又硬解了。解到phase6时发现可以用反编译到c语言了,但是我发现那个代码我好像可能不太懂,然后就放弃了。但是ida分析代码特别棒,条理很清晰!

今天——我实验课没事干就开始做隐藏关了,解完了,IDA真是太棒啦!!!

 

最后!美国人做的程序真的良心,让我痛苦了这么久,从0开始学计组,从0开始学汇编,bomb带我升天,bomb太棒啦!

posted @ 2019-03-18 13:50  喵喵喵喵?  阅读(1963)  评论(0编辑  收藏  举报