-
-
[原创]看雪6月 京东 2018CTF 第三题——misc画风一般的pwn
-
发表于:
2018-6-21 23:33
5117
-
[原创]看雪6月 京东 2018CTF 第三题——misc画风一般的pwn
总之这题很蛋疼。。。做起来很难受,没见过这种题。。可能是我题做得少?
首先进来看到main
,输出完之后有这么一个常见混淆。。。
大概就是短call
然后pop出当前地址,再+7
,加完之后rax
刚好是jmp rax
的下一条指令,不细说,不知道的可以跟一下(nop掉0x400749处的反调试)
接着会先把代码段设为可写然后读6个字节。。。
所以这个单字节是不知道的,我们要猜。随便输的话解密失败明显出来乱七八糟的指令,跑一会就segfault了,所以不觉得这种乱指令能getshell。
那么怎么知道这个值是多少呢,当然要从0-255
跑一遍,然后看哪个是不是乱指令。如何判断?在Pwntool中有个disasm
,可以反汇编。然后如果有无法识别的指令会是(bad)
,所以,就把这些字节先用IDAPython给dump出来,然后解密,然后看谁没有(bad)
(最后用的是这种方法),或者说谁的(bad)
位置比较在后面(前面先用这个测试的),这基本可以过滤一堆了,最后需要人肉再从这十多个里面找到正确的。
是不是一股crypto和misc的破解xor的味道。。。
具体代码如下
然后这个方法其实不是最好的,最好的是这样的。。。(加上break条件限制)
然后就是慢慢撸,最后发现正确的key是0x65
解密之后发现又是一个类似的东西,只不过他会先把前面的代码xor加密掉(没啥意义,不知道干嘛的)
然后后面不是直接拿输入解密的,是把输入xor上前一个的key作为新的key,一共有好几段这样的代码,随便贴其中一个(都长得一样的好像)
然后解密用的是IDAPython,这个网上有教程,不说了。。
最后一段(解密漏洞代码)好像没有0FBh
这个限制了,不知道为啥,好像没区别,不过这个限制有啥用啊。。。不懂。。。希望出题人来解释下。。。
最后解出来6个字节如下
所以这题其实是5分crypto,3分逆向,2分pwn(至少我花的时间差不多是这样,可能是我misc做的不熟)
漏洞其实很简单了。。。
首先"%13$lxAAA%8$sBB\x00" + p64(prog.got["puts"])
可以leak出canary和libc,具体这个位置怎么确定的调一下就知道了。。。
然后栈溢出,可以覆盖到返回地址,具体payload如下
p64(canary)*(0x68/8) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(system_addr) + p64(0)
因为懒得确定canary的位置直接padding全放成canary了,然后ROP,/bin/sh
是在libc里面就有的字符串,pop rdi
是在源程序里面找的,返回地址设成了0,这个倒是无所谓。0x68怎么确定的也是调一下就好了。。
完整exp
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2018-6-22 09:10
被holing编辑
,原因: