-
-
[原创]看雪.京东 2018CTF 第三题 WP
-
发表于: 2018-6-22 11:02 3241
-
此题从反逆向方面来说,运用了SMC和ptrace;从pwn方面来说,考察的是格式化漏洞和栈溢出而进行的ROP。
程序checksec:
静态分析就遇到问题,程序有SMC。先上代码:
程序确实有SMC,以下部分就不能正确解析成指令了,直到0x400a73
,共500字节。
上面正确解析的指令代码流程比较简单:
注意到程序中一直使用call|pop
的方式获取指令的地址。
解码好办,因为如果存在上面的call|pop
或mov
小立即数,那指令代码中必有连续的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直播授课