1.定义
ret2csu就是指利用glibc编译出的程序中普遍存在的一个函数__libc_csu_init,来当作万能的gadget控制函数的参数的。
在想要构造rop链但没有pop rdi|rsi|rdx;ret时可以考虑通过ret2csu控制rdi rsi rdx的值。
因为__libc_csu_init会把r15,r14,r13的值mov给rdi,rsi,rdx,以及会 call [r12+rbx*8],所以我们可以通过栈溢出覆盖掉r15,r14,r13,rbx,rbp的值来达到控制寄存器的目的。
2.利用原理

具体构造的payload还是要看__libc_csu_init函数中的汇编指令。
3.案例

def csu(rdi期望的值,rsi期望的值,rdx期望的值,期望执行的函数)
write(1,buf_addr,size)
原理:
- 泄露出程序已存在的
write函数的真实地址,然后可以得到lic_base,得到system_addr - 然后调用
read函数向bss段写入内容,直接elf.bss(0x500)即为写入内容的地址处 - 先写入
system_addr-->elf.bss(0x500),然后写入/bin/sh-->elf.bss(0x500)+8 - 然后通过
ret2csu调用system函数(elf.bss(0x500))执行/bin/sh(elf.bss(0x500)+8)