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”
现在我们运行这个项目,它只是闪退后啥也没发生,留我一人独自懵逼。。。那也没办法啊,出题方这么草率我还是要严谨一点的嘛,所以我把它拖到OllyDbg打开。开始从这一堆东西里分析这个程序,我注意到一些很有意思的东西,
%PROGRAMFILES%\\meseekerinc
这玩意儿看起来像是代码内部引用的自定义文件,咱来瞅一眼它是怎么用的:
实际上,程序正在搜索这个文件并且检查它的属性,如果能对得上号就会输出点东西。我这么机智当然猜到这可能是密码啦。
现在我们有两种方法可选—要么创建具有适当属性的文件,要么在执行过程中改变它。这样一来无论如何它都会打印出密码。我选择第二种方法—在每个条件上设置一个断点,当轮到它时,更改标志以模拟出所需要满足的条件。
你看,密码自己就出来了。。。
完事!下一个,还!有!谁!
Task 2http://10100110110100001100001011000100110000101101011.com/Airplane/2_should_work.php
镜像:https://drive.google.com/file/d/0Bzb5kQFOXkiSS3RrNkx4NlV0d0E/view?usp=drive_web
密码还是”Challlenge”
和第一个不一样,这回终于不闪退了。。。这次提示输入密码
我就随便输点啥吧,看看它能有几幅面孔。。
蓝后…粗线了“GettingSchwifty.bat”这个文件并且尝试加载它,结果证明这个不是一个有效的PE,所以发生了错误。
我们输入的密码似乎是用来解密这个PE文件的(名字。bat文件只是一种伪装)。让我们看一下这个文件:
如你所见,它在内部被加密了。这让我觉得它可能是XOR加密的。因此,我试着用一些有效的PE文件来XOR解密,看看它是否显示了密码(我使用了python脚本:https://github.com/hasherezade/crypto_utils/blob/master/dexor.py):
./dexor.py --file GettingSchwifty.bat --keyfile Second.exe
我们从编辑器看这个输出,返现开头这些重复的东东
这个可能就是我们需要的密码,所以我们继续试试。我复制了一些片段,保存为一个key.bin文件。然后又试了一次
./dexor.py --file GettingSchwifty.bat --keyfile key.bin
这次厉害了,输出了一个有效的PE文件:一个叫做Piper.dll的DLL文件
因为我已经有了DLL文件,所以我不关心什么可以解密出它的密码。我在调试器中运行了主要的可执行文件(Second.exe) 在gettingschwigett之前设置断点。用我的版本替换已加载的那个bat文件。
当在LoadLibraryA中出现断点时。我删除掉那些被加载的文件。在它上复制我的解密DLL。
它加载得非常成功,所以现在我们可以进入DLL内部的函数了:
然而还没有结束,在我们将flag打印出来之前,还需要再输入一个密码。应用程序在pipe上提出一个” flumbus_channel”问题,而我们需要解决这个问题。
经过一段简短的分析,我得出结论。蛮干并不是解决之道,所以我们必须用另一种方法来解决它。然后我去Google逛了一圈,发现有人问了一个很有意思的问题:什么比冷更冷?
(source: http://www.urbandictionary.com/define.php?term=Cooler%20Than%20Being%20Cool)
回答者说:“冰冷!”(这是在玩脑筋急转弯吗。。。)很明显不是吗?(原谅我感受不到哪里明显了..),而且这不就是程序通过让我们输入和检查想要我们说的吗?我想要一个快速的解决方案,而不是编写一个可以在Pipe上进行讨论的客户端,我只需要在内存中编辑缓冲区。让我们在对ReadFile的调用中设置断点,并在转储文件中跟踪缓冲区:
ReadFile返回后,我们可以编辑这个缓冲区,以模拟正在读取的输入:
密码被转换成大写,然后它被用来解密输出缓冲区,对解密缓冲区的校验并与硬编码的缓冲区进行了比较:0x55B8B000
看起来密码”ICE COOL”(就是上文中作者逛Google时看到的一个问答。。然后这货玩成了哲学问题,这清奇的脑回路在下实在佩服。。)是正确的,校验和匹配!输出缓冲区被解密,并在转储中跟踪它,我们已经看到了第二个标志:
然而,坑还不止这些—有一些调试检查,一不小心就会导致程序异常退出:
我只是补全了上面的条件,所以不能采取反调试措施:
然后,喜闻乐见的密码就跳出来啦~~