bomb拆除

1.实验概述

        此次实验分为六个阶段,每个阶段都需要根据汇编代码找出某一特定的字符串并输入来拆除一个二进制💣,否则炸弹就会爆炸,打印出BOOM!!!(如下图)。

        拆弹前,先通过 objdump -d bomb > disas.txt 将bomb的反汇编代码保存至disas.txt中,方便使用文档的查询功能定位到各个阶段。

        也可创建一个ans.txt文件夹用于输入(具体看下文演示)。

2.实验步骤

1.phase_1:比较

首先定位到phase1的汇编代码

观察汇编代码可得phase1往另一个名为<strings not equal>的函数传递了两个参数(立即数$0x804a1c4和偏移量为0x20的栈位置上的值)

故直接进入gdb调试,在phase1函数处设置断点并输入abc用作测试

在gdb调试过程中通过x/s指令获取上面提到的两个参数,可以发现0x804a1c4处为一个字符串,而存储偏移量为0x20的栈位置上的值的eax寄存器存储了输入的abc。

猜测这个神秘的字符串就是拆弹密码,故在ans.txt中输入这个字符串并将ans.txt作为参数运行

可以看到phase_1炸弹成功拆除。

2.phase_2:循环

定位到phase2的汇编代码

可以看到phase2给<read six number>传入了两个参数,其中一个为地址

再定位到<read_six_numbers>的汇编代码

发现该函数的功能是读取六个数字,若输入数字个数不大于5,则会爆炸。

在重新看phase2的汇编代码,根据<read six number>有一个参数为地址可以猜测,输入的六个数字被存在了一个数组(arr)中。

故剩余代码的功能是:arr[0]与0比较,arr[1]与1比较,arr[2]与arr[0]+arr[1]比较……arr[5]与arr[3]+arr[4]比较。

判断输入应该为0 1 1 2 3 5

验证:将0 1 1 2 3 5 写入ans.txt

phase_2炸弹成功拆除。

3.phase_3:条件

定位到phase_3的代码

根据这行代码猜测是个条件跳转指令,查看*0x804a220发现一个跳转表,猜测正确

根据不同条件计算出了8个答案,不过条件执行完后又加了限制条件,ans7和ans8不能用,在ans.txt中加入ans5并测试:

输出Halfway there,phase_3炸弹拆除。

4.phase_4:递归

查看立即数参数三可知需要输入两个数

查看<func4>

根据fuc4函数可以写出表达式“f(x,n)=f(x,n-1)+x+f(x,n-2)”(phase_4中n=5)。

算出来f(x,5)=12x

又因为phase_4中限制了x只能等于2,3,4。

取3用作测试:

phase_4炸弹拆除。

5.phase_5:指针

同样两个输入

在0x804a240处找到数组

需要循环十五次,以0xf为终点回推,第一次是0xc是数组的第五个数。

从0xc到0xf只有0x5没有循环到,故将除了0x5以外的数相加得到115,为第二个参数。

故输入5 115测试:

6.phase_6:链表

第二部分部分将原链表的node按照我们输入的顺序排序好放入一个数组中

比如我们输入1 3 2 4 6 5

原链表的第1个node就会放在数组的第1个位置

原链表的第2个node就会放在数组的第3个位置

原链表的第3个node就会放在数组的第2个位置

原链表的第4个node就会放在数组的第4个位置

原链表的第5个node就会放在数组的第6个位置

原链表的第6个node就会放在数组的第5个位置

将链表的逻辑按上一部分的数组顺序重构

查看链表:

分析:这里的链表有6个node,储存的值分别为0x360、0x69、0xe8、0x10d、0x152、0x218

要降序,故需输入1 6 5 4 3 2

测试:

7.secret_phase

查看phase_defused函数的汇编代码,发现每次都会调用一个叫secret_phase的函数,找到secret_phase 函数看看是个什么情况。

根据上面的分析在36 3 后面加个DrEvil,这样才算进入了secret_phase。

 根据数据画出了二叉树

fun7的代码为两部分,如果输入的数小于节点值,则执行上半部分,进入左节点,返回值为2*%eax

如果输入的数大于节点值,则执行下半部分,进入右节点,返回值为2*%eax+1

又从secret_phase中得知最后的返回值需要为7,所以二叉树从下往上的返回值应该是:

0

1(2*0+1)

3(2*1+1)

7(2*3+1)

所以从根节点的遍历顺序应该为root->右节点->右节点->右节点。

看图可得应该输入1001。

验证:

secret_phase炸弹拆除成功。

-_-||不容易啊不容易。

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值