[Cyber Apocalypse CTF 2021] – System dROP

Check file

Reversing

Ada function yang menarik yaitu _syscall yang diberikan didalam codenya.

Exploit

Pikiran pertama kali muncul yaitu melakukan ret2csu dan srop.

Ret2csu digunakan untuk menuliskan frame srop dan “/bin/sh” di dalam segment .bss .

Srop digunakan untuk memanggil “/bin/sh”.

Pada main function ada vulnerability buffer overflow. Dimana setelah return dapat melakukan rop chain dengan sisa 224(0x100 – 24 – 8(rbp)) bytes.

Setelah return main, penulis memasukan payload read(0, bss + 0x100, 0x500) + leave

Ret2csu dapat dilakukan dengan function __libc_csu_init

Pada gadget diatas dapat memanggil read(0, bss + 0x100, 0x500)
Dengan syarat

  • r13 = edi = 0
  • r14 = rsi = bss + 0x100
  • r15 = rdx = 0x500
  • r12 = address GOT Read
  • rbx = 0

Setelah memanggil read, ada pemeriksaan untuk jump ke __libc_csu_init+64. penulis akan menghindarinya dengan set rbp == rbx.
sebelumnya nilai rbx = 0 ditambah 1 menjadi rbx = 1, jadi rbp harus 1.

Bagaimana cara agar dapat mengisi register(r13, r14, r15, r12, rbx, rbp) diatas yaitu dengan gadget dibawah:

Return ke 0x4005b0 untuk call read(0, bss + 0x100, 0x500)

Masukan payload ret2csu + syscall + srop frame ke (bss + 0x100)

Stack pivot dengan gadget leave agar dapat melakukan rop chain dengan payload yang sudah dimasukan sebelumnya
Leave :

Sebelumnya set rbp menjadi bss + 0x100 – 8 .

Ret2csu digunakan untuk memanggil read(0, bss+0x500, 15) dan masukan /bin/sh padding sampai 15 bytes dengan \x00 digunakan untuk membuat rax menjadi 15 dan nanti ketika return ke syscall dapat memanggil sigreturn.
Sebelum memanggil sigreturn, pastikan membuat frame untuk call execve(“/bin/sh”,0,0)
Tambahan rsp harus diatas bss+0x800, kalau dibawah akan error.

Script solvernya ada disini

Hasil akhir payload

Leave a comment

Your email address will not be published. Required fields are marked *