BombLab for 5.20

今天是神奇的5月20号,风和日丽万里无云。
我本不想掀起一场腥风血雨,但是为了免受几万点暴击伤害我选择了与bomblab作伴。
bomblab原是CMU计算机组成原理(#15213)课程的实验,任务是拆掉7个二进制炸弹(phase1~6,secret_phase)
由于当了半个学期咸鱼干,汇编什么的基本不记得了,投机一下用了神器ida。


bomblab由两部分组成,一部分用于记录成绩,一部分是炸弹。
附带的bomb.c如下



grade

phase1()执行之前会调用initialize_bomb().data节中有host_table

然后在submitr中看到有:
GET /%s/submitr.pl/?userid=%s&lab=%s&result=%s&submit=submit,由此推测扫雷过程被炸次数等指标会被记录并上传到服务器,万幸的是这明显就不是我们自己学校的评分服务器,所以就别管了,反正对应的网址打不开,有无数条命就对了。



bomb

phase_1()

一堆提示之后进入phase1_()

答案很明显就是He is evil and fits easily into most overhead storage bins.

phase_2()



2333ida出来的变量名就是那么风骚,懒得改了。抽出重点:

跑一下就是答案了0 1 3 6 10 15

phase_3()

一堆跳转,只要最后v10<6&&result==v9即可,那就选case 3:好了
得到答案3 -351

phase_4()

里有个func4()就是个不知道干什么的递归,扫了一下第二个输入参数明显是37,懒得想了,整理成如下代码直接跑:

phase_5()

发现有个数组array_2850(),输入两个数对数组运算,稍加整理穷举一下:

运行得答案5 115

phase_6()

[email protected]!$#$^此处一堆粗话,怎么那么多循环,一开始就发现有node1~6的东西:

可以看出是结点结构如下的链表

node1->data=0x76
node2->data=0x35f
node3->data=0x24e
node4->data=0x39
node5->data=0xfa
node6->data=0x19d

这里搞了半天…那些循环就是对结点降序排列得到2 3 6 5 1 4,注意到有个和7的异或操作,得到输入应该为5 4 1 2 6 3

secret_phase()

发现函数phase_defused()中有:

要求输入三个东西,格式为%d %d %s且显然%sDrEvil,绞尽脑汁想了想前两个输入,n次尝试失败,发现每一个phase_*()之后都之后都会接上phase_defused(),就索性全部数字输入后都加上DrEvil
但是到最后也没弄明白为什么前面有readline()之后有scanf()的情况下两个后面的函数仍然能正常工作。(此处做个小标记)
然后就无敌了…

发现其中的n1是一颗存为链表的树,fun7()是对树中结点的简单运算,把n1存到堆里,根据要求第二个输入参数应该满足v2<1001,所以又修改fun7()整理成如下代码

第二个输入从0到1001穷举,得到满足条件的结果有

均满足条件


2 thoughts on “BombLab for 5.20

  1. 我计算机基础实验的bomblab也是靠ida

Leave a Comment

电子邮件地址不会被公开。 必填项已用*标注