首页
社区
课程
招聘
[原创]看雪.京东 2018CTF 第三题 WP
发表于: 2018-6-22 11:02 3241

[原创]看雪.京东 2018CTF 第三题 WP

2018-6-22 11:02
3241

此题从反逆向方面来说,运用了SMC和ptrace;从pwn方面来说,考察的是格式化漏洞和栈溢出而进行的ROP。

程序checksec:

静态分析就遇到问题,程序有SMC。先上代码:

程序确实有SMC,以下部分就不能正确解析成指令了,直到0x400a73,共500字节。
上面正确解析的指令代码流程比较简单:

注意到程序中一直使用call|pop的方式获取指令的地址。

解码好办,因为如果存在上面的call|popmov小立即数,那指令代码中必有连续的00,直接寻找连续(2-3字节以上)的相同字节,此极有可能就是异或key。然后ida解码。发现
异或值是0x65,异或解码500字节后,发现中间有nop指令,其后指令解析不对,看来是解码字节多了。

原来是要一步步解码,上面贩代码功能是解码下一部分代码,并编码前面一部分代码。编解码方式依然是异或,异或key为上次一异或值与下一个输入(上面代码是第二次输入)的异或结果。如此反复,用完第6个输入字节。
一共异或解码6次:

所以解码的输入就是:

实际上有作用的代码只有如下:

还原下就是:

welcome函数除了打印logo及一首诗外,还调用了test函数,里面有ptrace系统调用,代码还原为:

漏洞点很明显,有两个:

格式化漏洞完全可以泄露libc地址,canary和栈地址。这样就可以直接ROP到one gadget获取shell。
需要注意下,因为代码解码后又有编码,且后来的编码并不是还原,所以代码只能执行一次。

但是在利用过程中,发现shell似乎是暂停了,去掉ptrace就正常,怀疑是ptrace的事。
于是乎想直接shellcode,读flag。先mprotect修改栈区可执行,然后ROP到栈区执行cat文件的shellcode。

这个文件名让我一度怀疑没有成功,因为没有输出,浪费比较多的时间,最后才发现是成功的,只是文件名错了,flag的文件名是flag.txt而不是flag

附上exp:

得到的flag为:572416a82fa298b09b87f733d5483ba51

 
 
 
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-6-23 00:50 被poyoten编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//