告诉你什么是挖洞最清奇的脑回路

AirPlan Task1 And Task2

本文由prison翻译整理,原文地址:https://hshrzd.wordpress.com/201 … enge-tasks-1-and-2/

黑客游戏一直备受ctf玩家和新手安全研究员青睐,正如标题所说,玩这个需要猥琐发育和清奇的脑回路。本文将手把手教你如何搞定最基本的两个挑战,附件可下载,读者可以下载程序后和我们一起体验。难度系数:两颗星

废话不多说,直接正题,Airplanechallenge是一个在线挑战平台,URL:

http://10100110110100001100001011000100110000101101011.com/
这里是其中两个任务的writeup

Task1http://10100110110100001100001011000100110000101101011.com/Airplane/1_the_best_researcher.php

密码是:“Challenge

1.png

现在我们运行这个项目,它只是闪退后啥也没发生,留我一人独自懵逼。。。那也没办法啊,出题方这么草率我还是要严谨一点的嘛,所以我把它拖到OllyDbg打开。开始从这一堆东西里分析这个程序,我注意到一些很有意思的东西,

2.png

%PROGRAMFILES%\\meseekerinc

这玩意儿看起来像是代码内部引用的自定义文件,咱来瞅一眼它是怎么用的:

3.png

实际上,程序正在搜索这个文件并且检查它的属性,如果能对得上号就会输出点东西。我这么机智当然猜到这可能是密码啦。

现在我们有两种方法可选—要么创建具有适当属性的文件,要么在执行过程中改变它。这样一来无论如何它都会打印出密码。我选择第二种方法—在每个条件上设置一个断点,当轮到它时,更改标志以模拟出所需要满足的条件。

4.png

你看,密码自己就出来了。。。

完事!下一个,还!有!谁!

5.png

6.png

Task 2http://10100110110100001100001011000100110000101101011.com/Airplane/2_should_work.php

镜像:https://drive.google.com/file/d/0Bzb5kQFOXkiSS3RrNkx4NlV0d0E/view?usp=drive_web

密码还是”Challlenge

7.png

和第一个不一样,这回终于不闪退了。。。这次提示输入密码

8.png

我就随便输点啥吧,看看它能有几幅面孔。。

9.png

蓝后…粗线了“GettingSchwifty.bat”这个文件并且尝试加载它,结果证明这个不是一个有效的PE,所以发生了错误。

10.png

我们输入的密码似乎是用来解密这个PE文件的(名字。bat文件只是一种伪装)。让我们看一下这个文件:

11.png

如你所见它在内部被加密了。这让我觉得它可能是XOR加密的。因此,我试着用一些有效的PE文件来XOR解密,看看它是否显示了密码(我使用了python脚本:https://github.com/hasherezade/crypto_utils/blob/master/dexor.py):

./dexor.py --file GettingSchwifty.bat --keyfile Second.exe

我们从编辑器看这个输出,返现开头这些重复的东东

12.png

这个可能就是我们需要的密码,所以我们继续试试。我复制了一些片段,保存为一个key.bin文件。然后又试了一次

./dexor.py --file GettingSchwifty.bat --keyfile key.bin

这次厉害了,输出了一个有效的PE文件:一个叫做Piper.dll的DLL文件

13.png

因为我已经有了DLL文件,所以我不关心什么可以解密出它的密码。我在调试器中运行了主要的可执行文件(Second.exe) 在gettingschwigett之前设置断点。用我的版本替换已加载的那个bat文件。

14.png

当在LoadLibraryA中出现断点时。我删除掉那些被加载的文件。在它上复制我的解密DLL。

它加载得非常成功,所以现在我们可以进入DLL内部的函数了:

15l.png

然而还没有结束,在我们将flag打印出来之前,还需要再输入一个密码。应用程序在pipe上提出一个” flumbus_channel”问题,而我们需要解决这个问题。

16.png

经过一段简短的分析,我得出结论。蛮干并不是解决之道,所以我们必须用另一种方法来解决它。然后我去Google逛了一圈,发现有人问了一个很有意思的问题:什么比冷更冷?

17.png

(source: http://www.urbandictionary.com/define.php?term=Cooler%20Than%20Being%20Cool)

回答者说:“冰冷!”(这是在玩脑筋急转弯吗。。。)很明显不是吗?(原谅我感受不到哪里明显了..),而且这不就是程序通过让我们输入和检查想要我们说的吗?我想要一个快速的解决方案,而不是编写一个可以在Pipe上进行讨论的客户端,我只需要在内存中编辑缓冲区。让我们在对ReadFile的调用中设置断点,并在转储文件中跟踪缓冲区:

18.png

ReadFile返回后,我们可以编辑这个缓冲区,以模拟正在读取的输入:

19.png

密码被转换成大写,然后它被用来解密输出缓冲区,对解密缓冲区的校验并与硬编码的缓冲区进行了比较:0x55B8B000

20.png

看起来密码”ICE COOL”(就是上文中作者逛Google时看到的一个问答。。然后这货玩成了哲学问题,这清奇的脑回路在下实在佩服。。)是正确的,校验和匹配!输出缓冲区被解密,并在转储中跟踪它,我们已经看到了第二个标志:

21.png

然而,坑还不止这些—有一些调试检查,一不小心就会导致程序异常退出:

22.png

我只是补全了上面的条件,所以不能采取反调试措施:

23.png

然后,喜闻乐见的密码就跳出来啦~~

24.png

25.png

26.png

posted @ 2017-08-21 16:32  i春秋  阅读(725)  评论(0编辑  收藏  举报