Write-ups: ROP Emporium series
Table of contents
Open Table of contents
前言
两月一号了,眼看九号就要打比赛我却还没学过 ret2csu
和 SROP
,所以特此提前开一章 ROP Emporium 的题解,问就是里面有一道 ret2csu
,而且早晚会得这份题库的 LMAO
可惜没有 SROP
,那这个我只能去 Nightmare 找题做了,要不就自己出一题也行。
啊,突然想起来还有 ret2dlresolve
和 ret2vDSO
……一会儿再开一章 tricks 专题好了,就从 ROP 的 tricks 开始写。
Challenge 8
Information
- Category: Pwn
Description
We’re back in ret2win territory, but this time with no useful gadgets.
How will we populate critical registers without them?
Write-up
好啊,ROP Emporium 一共就八道题,而 ret2csu 就是这最后一题,有种上来就 bypass 小怪直奔去 attack BOSS’s ass 的感觉,帅不帅?(bushi)
嗯……有关 ret2csu
这个 trick 的详细信息,可以去读这篇发在 Black Hat Asia 的论文1.
简单来说就是当你找不到可以控制函数参数的 gadgets 时,就可以考虑一下这个 trick.
当一个程序使用某些库(如 libc)时,它有一些内置函数来管理程序不同部分之间的通信。在这些函数中,有一些隐藏的宝石可以作为我们缺失的 gadgets,特别是一个叫
__libc_csu_init
的函数。——Hack Tricks
就以本题的 __libc_csu_init
为例(不同版本的 libc 的这个函数可能略有区别,不过影响不大),看一下里面有什么好东东:
我们发现有两个实用的 gadgets,分别是:
这不就直接控制了函数的前三个参数了?多好。
注意第二个 gadget 也可以是以 ret
结束的,但是需要抵消一些 side effects:
[r12 + rbx * 8]
必须指向一个存储可调用函数的地址(如果没有想法且没有 PIE,可以直接使用_init
函数)。rbp
和rbx
必须具有相同的值以避免跳转。- 有一些被省略的
pop
s 需要考虑。
另外,从 ret2csu gadget 控制 rdi 和 rsi 的另一种方法是通过访问特定的偏移量,可以参考这篇讲 BROP 的论文2.
唯一一个问题可能就是怎么让 call QWORD PTR [r12 + rbx * 8]
调用 _init
了,不解释,直接看操作:
Exploit
Flag
Flag: ROPE{a_placeholder_32byte_flag!}
后记
没有后记,这系列还有七题没打呢写个毛的后记……