[Cyber Jawara 2020 Qualification] – ROP

Pada soal ini, peserta tidak diberikan binary, melainkan hanya informasi mengenai binary yang berjalan di server. Dari informasi yang diberikan pada deskripsi soal, binary yang berjalan memiliki konfigurasi kurang lebih sebagai berikut:

  • RELRO: Partial RELRO
  • Canary: Disabled
  • NX: Enabled
  • PIE: No PIE

Selain itu diberikan informasi dari file elf_info dimana kita dapat mengetahui architecture dari program:

Dari screenshot diatas, diketahui architecture dari program adalah ELF 64-bit. Diketahui juga bahwa buffer pada variable input berjumlah 8. Kurang lebih source code yang dimiliki oleh program adalah sebagai berikut:

Program hanya menggunakan size buffer sejunlah 8 dikarenakan sebelum RIP, terdapat RBP sebanyak 8 bytes. Berikutnya, diberikan informasi juga bahwa binary yang berjalan di server merupakan statically linked binary. Hal cukup buruk yang mungkin muncul dari konfigurasi ini adalah banyaknya gadget yang tersimpan, berikut jumlah baris dari file gadgets:

Dari sini, sepertinya harus dilakukan code execution khususnya untuk shell (/bin/sh). Kami pun mencoba mencari fungsi yang mungkin dapat membantu seperti system misalnya. Namun fungsi itu tidak ditemukan. Setelah itu kami mendapatkan ide untuk melakukan ROPchain ke arah syscall menggunakan sys_execve. Untuk itu, maka attack plan sudah terbentuk:

  • Menulis string /bin/sh ke segment bss atau data
  • Menyediakan argument untuk sys_execve
  • Memanggil syscall

Dari attack plan diatas, kami memerlukan 2 hal:

  • Argument yang diperlukan untuk sys_execve
  • Gadgets untuk menyediakan tempat parameter serta untuk memindahkan value

Dari hal yang diperlukan, yang menurut kami sulit adalah menemukan gadgets yang sesuai. Ada gadget pop yang bisa kami gunakan tapi tidak ada gadget mov yang sesuai untuk proses penulisan string /bin/sh. Setelah pencarian, didapatkanlah gadget yang kami gunakan:

  • pop rdi; ret -> 0x400696
  • pop rax; ret -> 0x4155a4
  • pop rsi; ret -> 0x410183
  • pop rdx; ret -> 0x4497c5
  • mov qword ptr [rax], rdx ; ret -> 0x48d171
  • syscall -> 0x47b52f

Dengan ini, kebutuhan gadgets sudah terpenuhi. Berikutnya, kami mencari argument yang diperlukan oleh sys_execve. Berikut argument yang diperlukan:

%rax%rdi%rsi%rdx
59 or 0x3bconst char __user * filenameconst char __user *const __user * argvconst char __user *const __user * envp

Dari 4 argument yang diperlukan, yang perlu diisi value hanyalah %rax dan %rdi, sehingga untuk %rsi dan %rdx dapat diisi dengan value 0 saja. Berikut script yang digunakan:


Flag = CJ2020{belajar_bikin_ropchain_sendiri_dong}

Leave a Reply

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