Defcon-20 Pwnables 300 Write up (PP300)

PP300:下载得到个二进制文件,对应于运行在远程FreeBSD系统下的一个服务。解决该题分为以下几步:

第一步,由于本地可以完全模拟远程的系统,所以不急于去测试,先IDA看下大概的程序处理流程,发现漏洞函数 sub_8048DB0,函数关键部分如下所示。红色字体处显示了char ptr[1024]的数据变化流程。首先这个数组由表示socket的变量 FILE * v2 读入(红体字所示)且加上终止符;然后经过sub_8048A00处理;最后,将其首地址作为函数指针执行。

第二步,搞清楚sub_8048A00的处理内部处理流程,发现这个函数将根据4个字节组合得到的INT型大小来重新排列这个数组。那么我们要做的事情就是确保输入排列之后是个好的shellcode,呵呵!需要注意的是,上面那个函数sub_8048DB0中有个验证,如蓝体字所示,所以需要输入一个字符串”3c56bc31268ac65f\n”才能触继续下面的处理流程,触发漏洞。

第三步,找一个尽可能短的shellcode,然后插入花指令,其间收获了些经验,得出可靠的花指令是40系列的DEC\INC指令对,50系列的POP\PUSH指令。这里的捷径是写个windows下的小程序,让它去加载shellcode,然后就可以用windows下的调试利器OD去调试shellcode代码,因为OD支持双向修改,修改汇编指令和修改二进制。所以特别方便于我们从语义和语法两个方面来同时构造符合要求的shellcode。经过二个小时左右的调试,其间有个小失误,错把一个会影响执行的花指令(0x37)当成立即数中的一个字节,导致shellcode没有正常执行,花了不少时间排错。

小结:这套题的难点在于根据算法构造相应的shellcode,这个过程中要耐心和细心。在调试方面,OD是个很好的工具,修改起二进制来很是方便。

下面列出原始shellcode和插花之后的:

此条目发表在Uncategorized分类目录。将固定链接加入收藏夹。

评论功能已关闭。