-
-
[翻译]The Blue Frost安全挑战题解
-
发表于:
2017-9-17 23:07
3715
-
附件为题目以及作者的解题过程。
在平时博客里发的软件动态之外,我这次要聊一聊Blue Frost Security的娱乐挑战题的解题思路。在8月2号,Blue Frost Secucrity发布了一篇关于提供位于阿根廷的Ekoparty安全会议门票的博文。为了获得门票(还有免费的威士忌),你需要完成一系列的exploit挑战题并发送解题思路给他们。他们提供了一个64位,有着简单堆栈缓冲区溢出的二进制PE文件,目标是在Windows7,Windows8.1或Windows10中成功执行calc.exe文件。同时还有额外挑战——在三个系统中都能成功利用函数执行,或是在利用后进一步令服务处于可用状态。
通过我会错过这些消息,不过我的同事Abdul-Aziz Hariri私下激起了我解题的欲望。最终我是第四个成功解题的人,尽管我没有进一步分析,但下面是我解题中的一些思路。
通常做这些东西对我来说是十分有趣的事儿,我之前玩过战争游戏并参加过CTF,但那是一段时间前的事了,因此做的时候能够回忆起不少美好的记忆。当你看到二进制文件时,会感到这是个明显的缓冲溢出题,但需要仔细查看整个代码才能成功的解出它。
在接收到新的连接后,就会读取最大4096字节的数据储存到栈的缓存区中。
尽管调用的 recv函数没有返回错误,但它仍然调用了一个用于接受数字字节和对象缓冲区的函数。
这个函数内置了Hello字符串的比较,然而这里有一个小问题。调用的strncmp长度是Hello加上空白终结符。我们输入的字节长度并没有真正的进行检查,也就是说只要我们在最初调用的recv中发送Hello以及空白符后,还可以在栈中最多存放4090任意字节的数据。
一旦我们通过字符串对比的检查,程序流就会在进入下一个新函数前返回到主函数中。
这个函数先读取客户端发来地四个字节,如果这四个字节有错误或少于四个字节,那么就会给出一个错误路径并提前退出函数。
当我们执行到这里的时候,剩下的两个字节会以无符号的16位整数进行处理,这些整数会分配到一个尽可能读取字节数的缓冲区中。memcpy函数将整个缓冲区储存在栈中,再清空堆缓冲区。
如果我们观察写入的栈缓存区,我们可以发现它的缓存是256字节。
尽管我们可以对栈进行写的操作,但在溢出之前还有一个cookie栈保护,因此我们需要进一步研究如何绕过这一保护机制。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课