Binary file nya :
https://github.com/isislab/CSAW-CTF-2017-Finals/raw/master/Reversing/rabbithole/rabbithole
Writeup contoh:
https://anee.me/rabbithole-csaw-ctf-2017-finals-f7d70f3726f3
logika sementara apa yang dilakukan adalah untuk melakukan atau menemukan flag yang ada didalem sebuah binary tree(root, nodes) maka kita harus menemukan apa isi dari V15. Di dalam binary yang ada di rabbit hole oleh Karena itu dibuatlah scrypt brute force sesuai dengan variable yang diketahui flag berada di dalem root nodes, cara yang dilakukan disini adalah dengan melihat program flow menggunakkan IDA dan juga membuat gdb scrpyt yang digunakan untuk melakukan pengecekan char yang nantinya akan dilakukan terus sampai flagnya tercetak semua. Command contoh adalah
sebelumnya dia membuat scrypt pythonnya dulu
terus di execute di gdb
gdb –x ./rabbithole.py
Berikut pernjelasannya pertama decompile file binary dengan IDA
Ini yang pertama sebenernya yang paling perlu diperhatikan adalah pas di check value nya.
Nah sekarang masuk ke dalam fungsi check valuenya
Nah sebenernya program ini melakukan pengecekan berulang pada string yang berukuran char
Pseudo code
Program ini menjalankan pengecekan dan validasi yang berulang dan flag tersebut berada di dalam binary tree. Jadi untuk melihat apa isi dari si v15 jadi pertama sesudah mengetahui bentuk program sekarang kita mencari alamat saat melempar variable ke dalam function check value untuk melakukan break point
Disini kita akan mengambil 0x0..005620b why ? karena disini adalah proses pemanggilan variable yang akan di proses di function check_value
Lalu kita akan membuat scrypt dari python yang berfungsi untuk mengbruteforce setiap char.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import gdb import sys import os import string count = 0 class MyBreakpoint(gdb.Breakpoint): def stop (self): global count some = gdb.execute('print $cl', to_string=True).strip().split('=')[-1].strip() if some == '1': count += 1 return False curr_pos = 5 gdb.execute('file ./rabbithole') bp = MyBreakpoint("*0x5555555aa20b") last = bp.hit_count fl = "_" * (59 - 6) brute_flag = list("flag{" + fl + "}\n") while curr_pos != (len(brute_flag) - 2): for x in string.printable: brute_flag[curr_pos] = x w = ''.join(brute_flag) print('Trying', w) fp = open('rabbithole_flag', 'w') fp.write(w) fp.close() gdb.execute('run < rabbithole_flag') print(count, curr_pos) if count > curr_pos + 1: curr_pos += 1 count = 0 break count = 0 |
code ini akan melakukan brute dari huruf, angka maupun symbol namun disini telah ditetapkan bahwa flag mempunyai unsur “_”.
Lalu jalankan code ini dengan gdb dengan command
gdb –x ./rabbithole_gdb.py
Ini flagnya contoh proses
flag{b3g1n_47_7h3_b3g1nn1ng_4nd_g0_0n_t1ll_y0u_h1t_th3_3nd}