这次的 PWNHUB 内部赛的两道题目都不是常规题,babyboa 考察的是 Boa Webserver 的 cgi 文件的利用,美好的异或考察的则是通过逆向分析解密函数来构造栈溢出 ROP。两道题目的考点都非常新颖,其中第一道题更是结合了 Web,值得大家复现学习。点击头顶图片!
babyboa
这道题的外表就是一个 Web 页面
但是实际上他的主要内容都在 cgi 文件中
cgi 文件是使用静态编译的,这在线下比赛的题目中是非常常见的,所以学会如何还原静态库的符号信息非常重要,所以这里我们第一步先尝试着还原静态库的符号信息。
1.还原静态库的符号信息
还原静态库的信息一般用的是 IDA 提供的 FLIRT,这是一种函数识别技术,即库文件快速识别与鉴定技术(Fast Library Identification and Recognition Technology)。可以通过 sig 文件来让 IDA 在无符号的二进制文件中识别函数特征,并且恢复函数名称等信息,大大增加了代码的可读性,加快分析速度。
而标准库的 sig 文件也有现成制作好的,在https://github.com/push0ebp/sig-database中下载,并且把文件导入到 IDA/sig/pc 中就能够使用,我这里为了快速找到我们导入的 sig 文件,将该文件夹中原有的文件都放到了 bak 目录下,把我们猜测可能会用到的符号文件放置到目录下
导入后再在 IDA 中按 Shift + F5,打开“List of applied library modules”页面
然后再按 INS 并选择要自动分析特征还原的静态库文件
我这里测试多次后选择的是 Ubuntu 16.04 libc6(2.23-0ubuntu6/amd64),如果你不知道静态编译使用的是哪个版本的库文件,可以尝试多导入几个版本的文件进行测试。
导入之后可以看到识别到了 623 个函数,并且大部分函数都有了名称
2.逻辑分析
在 Web 页面中输入密码可以抓到如下的包
也就是实际上 Web 页面就是用来向后端的 cgi 传递参数,并且在 cgi 中判断密码信息
main 函数中分别判定了 REQUEST_METHOD 和 QUERY_STRING 是否正确,这两个参数分别代表的是访问的模式和传递的参数,在上面例子中应该是 GET 和 password=wjh。
通过初步的判断之后,就把参数的 127 字节复制到 bss 段上的一块内容上,并且通过 handle 函数来处理参数信息。