记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 (n从0开始)
并且根据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
2、while循环,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&t与intel两种格式的各种汇编指令。
第三天——觉得今天可以开始开始解了,发现我不知道phase1到底要我干什么,发现网上博客说要查地址,我也照着去查了地址,然后第一关就过了,我天真的以为我以后的每一关也是如此快乐。
第四天——解到第二个的时候,才想起来我曾经学过这么个递推。
第五天——听说了一个叫IDA的东西,但是我居然以为它也是一个和objdump差不多的东西,就没在意。
然后我感冒了一周,躺了一周
然后fun4好难噢
突然有一天——朋友说他查了个地址就把第四个解出来了,我很震惊,我抱着电脑就去堵他了。然后我打开了新世界的大门,居然还能这样解!
最后一天——我载了IDA,发现phase5设置了反编译,所以我又硬解了。解到phase6时发现可以用反编译到c语言了,但是我发现那个代码我好像可能不太懂,然后就放弃了。但是ida分析代码特别棒,条理很清晰!
今天——我实验课没事干就开始做隐藏关了,解完了,IDA真是太棒啦!!!
最后!美国人做的程序真的良心,让我痛苦了这么久,从0开始学计组,从0开始学汇编,bomb带我升天,bomb太棒啦!