-
-
[原创]Pwn-WereWolf
-
发表于:
2018-1-16 16:05
7894
-
宣传一下自己的blog:
http://tacxingxing.com/2018/01/10/icq2018christmaspwnwerewolf/
希望大佬们轻喷。
题目地址:WereWolf-250
Binary开启了NX与Canary
题目中没有提供libc,所以不要妄想找到题目的libc,肯定需要用无libc的方式.
首先逆向分析题目:
题目模拟了"狼人杀"-Werewolf这款游戏,其中每个role-角色都建立一个action存储用户的行为。
在heap上建立了一个存储rope的list,分别储存*action与action的length。
共有一下四种操作:
整体来说题目流程是比较清晰的,不难逆向。
漏洞触发在show函数中,是一个比较容易发现的格式化字符串漏洞
原本在2月场中在kill中出现的double-free被修补
利用该format string,因为我们可以无限次地edit一个role,再通过show打印出来触发漏洞
从而我们拥有了无限读写的能力 no limit read or write.
我们不考虑确定libc的地址,因为ichun之前题目的环境也是比较..,从来找不到确定的libc版本,所以考虑ret2syscall,通过泄露的一个libc地址确定syscall的地址,再通过stack pivot到heap中ret2syscall rop,最后spawn shell。
这里需要解决几个问题:
最终的exp基本是按照上述的思路进行:
再次通过Ropgagtes执行execve("/bin/sh",NULL,NULL)
Spawn shell
最后,在写入栈中,我们用show函数中的rbp地址作为跳板,向栈中写入数据。
为了防止通信数据量过大造成阻塞,exp中全部用的%hhn
进行写入。
注意通过rbp跳板向栈中写value要从高地址向低地址写,这是由于程序本身造成的,调试可见端倪,不再赘述。
结果:
➜ workspace file werewolf
werewolf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=017d1e3c242c96d9c9073c650e91c531d53749ec, stripped
➜ workspace checksec werewolf
[*] '/mnt/hgfs/Binary/CTF/Shooting/ichun/Pwn/Were_wolf_250/workspace/workspace/werewolf'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x400000)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-2-1 16:20
被admin编辑
,原因: