[34c3]:Giftwrapper 2

Challenge ini dapat didownload dari sini.

Karena remote dari challenge sudah mati, kita diberikan server untuk menjalankannya secara local dan kita dapat seperti biasa melakukan checksec pada file server.

Hanya non executable stack yang dinyalakan dan program dibuat dengan arch 64 little endian.

Dan ketika kita menjalankan programnya, kira-kira yang dirun oleh program adalah seperti yang ada di gambar 

Terdapat 3 command :

  • help => menunjukkan command apa saja yang dapat diinput
  • modinfo => memberikan informasi tentang module yang digunakan
  • wrap => meminta inputan size gift dan isi giftnya.

Dari command tersebut, yang menerima input hanyalah yang wrap, untuk lebih jelasnya nanti akan dilihat dari IDA (disassembler). Namun saya akan mencoba bug yang mungkin terjadi dari inputan pada function wrap.

Saya melakukan beberapa percobaan:

  1. Saya mencoba untuk memasukkan size sebesar 1000 dan hasilnya adalah “Sorry! This gift is too large” yang artinya terdapat limitasi terhadap size dari gift yang akan dibuat.
  2. Saya mencoba menginput string yang lebih panjang dari size. pada size 2, yang dimuat dalam gift hanyalah ABC, sehingga menurut saya pada saat program mengolah inputan hanya sebanyak size yang diinput sebelumnya [index array dimulai dari 0. sehingga 0,1,2 dan ABC yang dimunculkan bukan AB].
  3. Ketika saya coba memasukkan -1 kedalam size, sizenya diterima dan ketika inputan string dimasukkan tidak ada yang dimunculkan oleh program.

Dari keanehan pada input size -1 yang berhasil diterima, maka kita melihat apa yang sebenarnya terjadi dalam program melalui IDA.

Dari disassembler, kita mengetahui beberapa hal :

  1. stack frame untuk function wrap adalah rsp-0x70 hex yang berarti 112 dalam desimal.
  2. read digunakan untuk membaca inputan dari user.
  3. program menggunakan strtol untuk melakukan convert dari string ke long int.
  4. program menggunkan jg (jump greater) apabila rax lebih besar dari 0x63 maka akan dijump kepada error message. (compare yang dilakukan oleh jg adalah compare terhadap signed int).

Namun, apa yang membuat -1 diterima oleh program?

Ketika input dibaca dan diconvert ke long int, prefix – akan tetap terbawa namun angka 1 tersebut menjadi unsigned int, sehingga ketika terjadi compare oleh jg yang terbawa adalah hex dari unsigned int -1 (0xffffffff) yang akan lebih kecil dari 0x63. Itulah mengapa -1 dianggap valid oleh program.

Dari hal tersebut, kita coba melakukan buffer overflow agar terjadi segmentation fault pada input string gift dengan size -1.

Saya membuat pattern pada gdb peda sebesar 145 dan menginput nya ke dalam program dan terjadi segfault. Ketika dicek dengan dmesg, maka terjadi segfault pada 0x41754141. Untuk mengetahui offset dari 0x41754141 saya menggunakan ragg2

Tadi, ketika kita mengecek security program, kita dapat melihat bahwa arch yang digunakan adalah little endian sehingga offsetnya 136. Lalu saya mengira bahwa akan ada hubungannya dengan Global Offset Table karena saya akan memanggil system(bin/sh) dengan menggunakan bantuan dari GOT dan libc base. Saya akan mengecek GOT dari puts karena puts sering muncul pada program.

Cara kerja puts dalam program adalah sebagai berikut: ketika puts dipanggil, puts akan melakukan print terhadap sesuatu yang ditunjuk oleh rdi. puts akan tau siapa rdi ketika program melakukan instruksi pop rdi. setiap kali puts dipanggil, akan ada pop rdi dan pop rdi adalah salah satu ROP gadget

Saya mencari gadget tersebut dengan Radare2.

Setelah kita tahu letak pop rdi, kita dapat melakukan leak terhadap address address yang dibutuhkan untuk nantinya melakukan GOT overwrite atas puts dan menggantinya dengan system(bin/sh).

Saya membuat exploit code dengan python.

Ketika dijalankan akan muncul seperti ini

Kita mendapatkan leak address dari puts dan kita dapat melakukan check offset puts terhadap libc yang diberikan dengan r2.

Setelah mengetahui posisi puts pada libc, kita dapat menghitung libc base dengan cara mengurangkan address puts yang kita dapat terhadap offset dari puts.

Setelah mengetahui libc base, kita tinggal mencari offset dari system dan bin/sh pada libc dengan cara yang sama seperti mencari offset pada puts. setelah mendapatkan offsetnya kita dapat mengetahui posisi pasti dari system dan bin/sh dan kita dapat melakukan return ke system(bin/sh) .

Lalu kita dapat melengkapi script exploit dan melakukan exploit tersebut dan jalanlah function system(bin/sh).

 

Leave a Reply

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