ret2csu


1.定义

ret2csu就是指利用glibc编译出的程序中普遍存在的一个函数__libc_csu_init,来当作万能的gadget控制函数的参数的。

在想要构造rop链但没有pop rdi|rsi|rdx;ret时可以考虑通过ret2csu控制rdi rsi rdx的值。

因为__libc_csu_init会把r15,r14,r13的值movrdi,rsi,rdx,以及会 call [r12+rbx*8],所以我们可以通过栈溢出覆盖掉r15,r14,r13,rbx,rbp的值来达到控制寄存器的目的。

2.利用原理

image-20240903102226839

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

3.案例

image-20240903111626964

def csu(rdi期望的值,rsi期望的值,rdx期望的值,期望执行的函数)

write(1,buf_addr,size)

原理:

  1. 泄露出程序已存在的write函数的真实地址,然后可以得到lic_base,得到system_addr
  2. 然后调用read函数向bss段写入内容,直接elf.bss(0x500)即为写入内容的地址处
  3. 先写入system_addr-->elf.bss(0x500),然后写入/bin/sh-->elf.bss(0x500)+8
  4. 然后通过ret2csu调用system函数(elf.bss(0x500))执行/bin/sh(elf.bss(0x500)+8)

文章作者: 0x00dream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0x00dream !
  目录