-
-
[原创]第三题 PWN_wow WriteUp
-
发表于: 2018-6-20 15:18 2802
-
这道Pwn题……应该是分两个阶段,逆向和Pwn
首先可以发现test函数将自己ptrace了,从而无法挂上调试器。Patch掉之后可以调试。
分析main函数可以发现大量的意义不明指令,调试上去跑一下,发现程序首先mprotect了代码段,改成可读可写可执行,然后读入6个字符,在第i个阶段将第i个字符和指令字异或,阶段完后将第i+1个字符与之前的字符异或作为新的被异或字符(有点绕),一共6个阶段。
我一开始的想法是爆破字节,寻找合法的指令。
爆破脚本:(第一阶段)
得到一大堆的汇编,拿头怼了一会儿,发现i = 101的指令似乎是合法的:
101对应的字符是e,输入e过了第一阶段。
逆了一会儿,觉得这个方法效率太低,就寻找其他的方法,发现待异或数据中有这样的数据:
0x48, 0xE5, 0x65, 0x65, 0x65, 0x2D, 0x54, 0xAC, ……, 0xE6, 0x9C, 0x45, 0x19, 0x8A, 0x2D, 0x60, 0xE5, 0x65, 0x65, 0x65, 0x2D, 0x54, 0xAC, ……
汇编指令中最常出现的字节是0x00,而且经常作为立即数出现,不满4字节的数字中必然出现多个0x00,任何数字异或本身都是0,所以这个0x65就是要找的字符。
同理去寻找下面5段,找到需要的数是0x13, 0x4b, 0x25, 0x44, 0x0f, 两两异或得到需要的字符是v X n a K,所以输入的六个字符是evXanK。
过掉这一阶段以后进入pwn的阶段。
过了前面会输出一个wow,然后允许用户输入。
第一次的输入会直接作为printf的参数来输出,存在格式化字符串漏洞。第二次可以输入0x200个字符,存在栈溢出。
这里的打法还是比较常规的,格式化字符串泄露Canary,栈溢出ROP拿shell。不过有一个坑点,就是程序在解密了代码之后又加密了回去,导致再调一次main函数去获得输入点的方法不可行。解决方案是在格式化字符串漏洞利用的时候获取一个栈地址,手动调好rbp,然后直接返回到main函数最后输入的地方。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)