PWNABLE.TW-Printable-WP

Posted on Apr 12, 2021

相当麻烦的格式化字符串和 .fini 数组利用结合的题目,由于是 pwnable 的题,这里只简单记录一下思路

首先,printf 是很裸的,但是执行完后就会直接 exit,这肯定不行,首要的是要做到能够重复利用。exit 在执行时,会遍历 .fini 数组中的所有函数并执行。程序没有开启 PIE,自然会想到修改 .fini 数组,但是该数组不可写,就需要用别的方法。在调用 .fini 数组中的函数的 _dl_fini 中有这样一段代码

其中 rdx 恒为零,而 r12 初始值为 .fini 的地址

在被 call 之前会加上 [rbx]

rbx 则是由 [r13] 赋值的,而 [r13] 的值在栈上也有同样的

所以我们通过格式化字符串修改 0x7ffff7ffe168 这个地址上的值,使 r12 + [rbx] 指向一个我们可控的地址(比如程序末尾的可读写页),在这个地址上布置好返回地址,这样就可以实现重复利用。同时,在这次攻击时,我们可以一并把 stdout 指到 _IO_2_1_stderr_ 上去,就可以 leak。

第二次 printf 的时候,可以把 libc 和 栈地址都 leak 出来,然后在第三次利用 printf 的时候,布置好 getshell 的 gadget,就可以 getshell 了。

这里要注意的是,由于利用涉及到 ld,所以需要一个服务器使用的 ld 才可以完美复现。遗憾的是本人并没有服务器 ld,所以我无法复现环境,更无法真正完成 payload 的布置,所以这题我也不算真正做出来,主要是看着别人的 WP 云 pwn 的。我觉得其实这题到 exit 利用之后就没什么意思了,完全就是体力劳动(格式化字符串是真的难调),就这样吧,之后拿到 ld 了再仔细做一下。又是环境问题,烦死了。