二进制炸弹实验bomb-whu 拆弹

 

bomb是一个很有趣的二进制逆向游戏,我们逆向分析的第一周作业

加上secret phase一共有7个关卡,每个关卡输入一个字符串或者多个数字,输入错误会爆炸,通过反汇编来得到正确的答案,推荐使用ida pro进行静态分析和动态调试

ida pro在看雪上有7.0的版本可以下载,贴一个windows ida远程调试linux中elf文件的教程

https://www.52pojie.cn/thread-730499-1-1.html

 

答案:

分析过程:

 

静态分析结合动态调试

 

第一关:

静态分析即可

用ida pro打开bomb-whu程序

找到main函数

进入phase_1

F5生成伪代码之后发现有一个string_not_equal语句,所以这里直接输入答案

With great power comes great responsibility.

就好了

 

 

第二关

静态分析即可

进入phase_2

还是首先利用ida 的F5功能键得到伪C代码

我逆向这个bomb的思路是找到explode_bomb()。分析会触发爆炸函数的条件。

在这里通过函数名 read_six_number()可以得到会读到6个数字,所以得出关卡2是需要输入6个数字。在这个伪c代码中有疑惑,他没有对v3-v6进行赋值,为什么在后面的if中能进行判断,进入read_six_number函数中查看一下。

在这里注意到read_six_number这个他传入的第二个参数a2实际上是一个地址,然后在scanf函数中分别对a2~a2+20这些地址进行了赋值,再看在关卡2一开始变量的定义顺序,利用栈的知识就发现了

看到上述六个字母的索引分别是2,5,12,4,10,7。所以查ascii表,发现beldog的ascii码的2进制后四位是2,5,12,4,10,7。所以最终答案为

beldog(此答案不唯一)

 

 

第六关

静态分析与动态调试结合

第六关比较复杂,f5得到伪C代码后后仔细分析流程

这个流程表明第六关仍然是输入六个整数,并且每个整数要小于等于6大于等于1切不能相等。

所以此处应该是1 2 3 4 5 6的排列组合。

后面的一个while流程是对我们输入的数据进行一个处理,但是太过复杂不去管,结果用动态调试看内存能直接看出来

依据思路看explode_bomb函数前的流程走向

可以看出是从内存的某一个片段(v7是地址)一直在取的两个数比较大小,由伪C代码中的node1(一个常量)可以猜测这里应该是一个链表,(result=**取了两次地址)如果前一个数小于后一个数即可过关,动态调试这个程序,在这个循环中下一个断点。

发现ebx存放的就是地址

在寄存器中查看ebx的值为0804B11C。查看一下这一块内存。

发现这就是一个链表,在程序中我的输入是1 2 3 4 5 6,在链表中也是,而且每个整数对应了一个16进制数,在程序里是对这个16进制数进行比较,找到对应关系 1--1B1    2—69    3—2A6        4—105  5—320  6—178

由前面的分析由小到大分别是

2 4 1 6 3 5。

 

Secret_phase:

在第一关点进那一个字符串的时候发现有个secret phase,在ida的函数表里也有一个secret phase和func7没用

所以还存在一个隐藏关卡。

隐藏关卡也是静态分析和动态调试结合。

 

 

 

在main函数中

Phase_6结束后有一个phase_defused函数。

进入这个函数就能找到secret_phase的入口

需要满足一个条件是在内存某个地方取出来的一个字符串与DrEvil要相同,具体是内存哪一个片段要动态调试才能发现。

在此处下一个断点

运行到此处双击offset unk_804B4D0就能就去看了

发现这就是我们输入的第四关的一个答案(36,3),所以我们只需要在我们第四关的答案后面加一个DrEvil就能进入隐藏关卡。

 

 

 

隐藏关卡就是读入一个整数,首先要求整数要小于等于0x3E9,大于等于1。

然后进入fun7函数。然后fun7会得到一个返回值,如果那个返回值是3,那么就会隐藏关卡通关

 

进入隐藏关卡查看一下

这里看起来还是一个递归的问题,但是注意到a1是一个地址,在fun7的定义中是(*a1,int a2),所以猜测这里应该也是一个节点。由于是a[1]和a[2]两个选项,猜测a[1]应该是二叉节点,每次都是在二叉树中向左子节点或者向右子节点移动,这取决于当前节点的值与我们输入的值的大小,到内存中去看一下这些数值

 

在递归前下一个断点

查看n1的内存,发现这果然是一个二叉树,把这个二叉树画出来

运算规则是这样的,如果输入的值比当前节点值小,那么进入左孩子节点,返回2*递归值,如果输入的值比当前大,进入又孩子节点,返回2*递归值+1,如果相等,返回0,所以3=1*2+1 1=0*2+1 0=0

所以当输入最右边节点的值即可,6Bh=107

所以secret phase结果就是107

 

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值