首页
社区
课程
招聘
[原创]第三题 PWN_wow WriteUp
发表于: 2018-6-20 15:18 2802

[原创]第三题 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期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//