Saturday, July 12, 2014

Pwnium CTF2014: re150 Kernel Land

Dalam soal kali ini, kita diberikan sebuah file ELF yang memenuhi multiboot specification (file ELF ini adalah kernel yang bisa diboot dengan grub atau qemu). Tapi karena ada petunjuk bahwa di tick ke 3 kita akan menemukan flagnya (“The third Tick gives you the answer ;)”), saya tidak memboot file ini, tapi hanya melihat disassemblynya saja pada fungsi “timer_tick”.

00100958 <timer_tick>:
100958: 83 ec 14 sub $0x14,%esp
10095b: a1 c0 60 10 00 mov 0x1060c0,%eax
100960: 8d 50 01 lea 0x1(%eax),%edx
100963: 89 15 c0 60 10 00 mov %edx,0x1060c0
100969: 50 push %eax
10096a: 68 03 22 10 00 push $0x102203
10096f: e8 d5 05 00 00 call 100f49 <printf>
100974: 0f b6 0d c0 60 10 00 movzbl 0x1060c0,%ecx
10097b: 83 c4 10 add $0x10,%esp
10097e: b8 00 00 00 00 mov $0x0,%eax
100983: 89 ca mov %ecx,%edx
100985: 32 90 60 30 10 00 xor 0x103060(%eax),%dl
10098b: 83 c2 01 add $0x1,%edx
10098e: 88 90 60 30 10 00 mov %dl,0x103060(%eax)
100994: 83 c0 01 add $0x1,%eax
100997: 83 f8 28 cmp $0x28,%eax
10099a: 75 e7 jne 100983 <timer_tick+0x2b>
10099c: 83 c4 0c add $0xc,%esp
10099f: c3 ret

Data ada di 0x103060 dan ada 0x28 byte (40 bytes).

$ objdump -s --start-address=0x103060 --stop=0x103088 kernel


kernel:     file format elf32-i386 

Contents of section .data:
103060 49746f66 726a7862 32602e2e 632e322e Itofrjxb2`..c.2.
103070 36303331 5d673662 31676730 5e296231 6031]g6b1gg0^)b1
103080 3163625e 5e2d5d7a 1cb^^-]z

Saya terjemahkan langsung algoritmanya apa adanya ke C:

Ketika dijalankan didapatkan:

cl = 1 flag = Ivohtlzd4b00c0408231]g8d1gg2`)d11cd``-]|
cl = 2 flag = Lunkwoyg7a33b373;124`f;g4ff1c,g44bgcc0`
cl = 3 flag = Pwnium{e5c11b1519328df9e8ff3a0e88beaa4d}

di “tick” ke 3 itu kita mendapatkan flagnya:


Pwnium{e5c11b1519328df9e8ff3a0e88beaa4d}

Pwnium 2014: misc75 So Basic

Kita diberi sebuah file Misc75.zip, isinya adalah 40 file, masing-masing dengan nama berupa string heksadesimal seperti ini:

02e74f10e0327ad868d138f2b4fdd6f0
1679091c5a880faf6fb5e6087eb1b2dc
182be0c5cdcd5072bb1864cdee4d3d6e
19ca14e7ea6328a42e0eb13d585e4c22
1c383cd30b7c298ab50293adfecb7b18
1f0e3dad99908345f7439f8ffabdffc4
1ff1de774005f8da13f42943881c655f
33e75ff09dd601bbe69f351039152189
34173cb38f07f89ddbebc2ac9128303f
37693cfc748049e45d87b8c7d8b9aacd
3c59dc048e8850243be8079a5c74d079
45c48cce2e2d7fbdea1afc51c7c6ad26
4e732ced3463d06de0ca9a15b6153677
6364d3f0f495b6ab9dcf8d3b5c6e0b01
6512bd43d9caa6e02c990b0a82652dca
6ea9ab1baa0efb9e19094440c317e21b
6f4922f45568161a8cdf4ad2299f6d23
70efdf2ec9b086079795c442636b55fb
8e296a067a37563370ded05f5a3bf3ec
8f14e45fceea167a5a36dedd4bea2543
98f13708210194c475687be6106a3b84
9bf31c7ff062936a96d3c8bd1f8f2ff3
a5771bce93e200c36f7cd9dfd0e5deaa
a5bfc9e07964f8dddeb95fc584cd965d
a87ff679a2f3e71d9181a67b7542122c
aab3238922bcc25a6f606eb525ffdc56
b6d767d2f8ed5d21a44b0e5886680cb9
c16a5320fa475530d9583c34fd356ef5
c20ad4d76fe97759aa27a0c99bff6710
c4ca4238a0b923820dcc509a6f75849b
c51ce410c124a10e0db5e4b97fc2af39
c74d97b01eae257e44aa9d5bade97baf
c81e728d9d4c2f636f067f89cc14862c
c9f0f895fb98ab9159f51fd0297e236d
cfcd208495d565ef66e7dff9f98764da
d3d9446802a44259755d38e6d163e820
d67d8ab4f4c10bf22aa353e27879133c
e369853df766fa44e1ed0ff613f563bd
e4da3b7fbbce2345d7772b0674a318d5
eccbc87e4b5ce2fe28308fd9f2a7baf3

 

Di dalam masing-masing file ada dua digit heksadesimal. Setelah mencoba-coba menggunakan md5 cracker online, ternyata masing-masing adalah angka (c4ca4238a0b923820dcc509a6f75849b adalah md5 untuk angka 1, dst). Jadi langkah pertama yang saya lakukan adalah merename semua hash menjadi nomor, ini bisa dilakukan dengan skrip bash:


for((i=0; i < 40; i++)); do mv $(echo -n $i|md5sum| cut -f 1 -d' ') $i;done

 


Berikutnya kita coba gabungkan semua isi file sesuai urutannya:


for((i=0; i < 40; i++)); do cat $i; done

Hasilnya:


50776e69756d7b30326365663765656237356664643964666336376330646331653365323535627d


Berikutnya kita coba convert ke ASCII, dan ternyata kita dapat flagnya:


$ echo 50776e69756d7b30326365663765656237356664643964666336376330646331653365323535627d| xxd -r -p

Pwnium{02cef7eeb75fdd9dfc67c0dc1e3e255b}

Pwnium CTF2014: Crypto75 break_me

Ini adalah soal crypto yang paling sederhana, kita diberikan string ini:

QlpoOTFBWSZTWTxSmOAAAAsJAF/gOwAgADEAAAiZMNT0JbKzhCQcyQtA2gNbvXgSvxdyRThQkDxSmOA=

Dan diminta memecahkan kodenya. Terlihat bahwa itu adalah data dalam base64. Kita bisa mendecodenya:

$ echo “QlpoOTFBWSZTWTxSmOAAAAsJAF/gOwAgADEAAAiZMNT0JbKzhCQcyQtA2gNbvXgSvxdyRThQkDxSmOA=” | base64 –d > file

Lalu cek isinya;


$ file file

file: bzip2 compressed data, block size = 900k

Kita coba langsung decode:


$ bzcat file
9afa828748387b6ac0a393c00e542079

Didapatkan flagnya:9afa828748387b6ac0a393c00e542079

Pwnium CTF2014: For150 Altered Code

Diberikan sebuah source code singkat ini:

 

Kita disuruh mencari kodenya. Di teks di atas tidak terlihat, tapi di source code aslinya terlihat bahwa ada yang indentasinya memakai spasi dan ada yang memakai tab, setelah kita comment baris-baris yang berbeda, hasilnya:

 

Dan ketika dicompile , lalu dijalankan, flag yang kita dapatkan:

D0nT_e4t_Sushi

Pwnium CTF 2014: Prog300 ROT

Ketika melakukan koneksi ke 41.231.53.40:9090, kita akan disambut dengan string base64 yang merupakan image, ketika dibuka, imagenya memiliki format seperti ini:

x

Tugas kita adalah membuat program yang memutar gambarnya menjadi seperti ini:

A

Kemuudian membaca teksnya, dan mengirimkan hasilnya ke server.

Saya membuat program singkat dalam Python:

 

Program ini memanfaatkan PIL untuk bagian rotasinya dan menggunakan Tesseract OCR untuk membaca teksnya. Akurasinya OCR ini cukup baik, walau tidak sempurna, untungnya kita tidak diminta mengirimkan N teks akurat, cukup satu saja (dalam waktu 2.5 detik sejak menerima gambarnya).

Flag yang didapat: Pwnium{b1a371c90da6a1d2deba2f6ebcfe3fc0}

Pwnium 2014: re10 Baby Crackme

Ini adalah soal reversing paling sederhana (dan nilainya memang hanya sepuluh point). Executable yang diberikan akan memprint “Baby Crackme”, dalam loop. Untuk menyelesaikan ini tidak perlu IDA, hanya perlu objdump saja. Bisa dilihat bahwa program ini mengecek apakah dijalankan dengan parameter atau tidak (membandingkan [$ebp+8] ==1). Dengan menjalankan program dengan parameter sembarang, kita mendapatkan flagnya: G00d_B0y.

08048454 <main>:
8048454: 55 push %ebp
8048455: 89 e5 mov %esp,%ebp
8048457: 83 e4 f0 and $0xfffffff0,%esp
804845a: 83 ec 10 sub $0x10,%esp
804845d: 83 7d 08 01 cmpl $0x1,0x8(%ebp)
8048461: 7f 0e jg 8048471 <main+0x1d>
8048463: c7 04 24 b0 85 04 08 movl $0x80485b0,(%esp)
804846a: e8 15 ff ff ff call 8048384 <puts@plt>
804846f: eb f2 jmp 8048463 <main+0xf>
8048471: c7 04 24 47 00 00 00 movl $0x47,(%esp)
8048478: e8 d7 fe ff ff call 8048354 <putchar@plt>
804847d: c7 04 24 30 00 00 00 movl $0x30,(%esp)
8048484: e8 cb fe ff ff call 8048354 <putchar@plt>
8048489: c7 04 24 30 00 00 00 movl $0x30,(%esp)
8048490: e8 bf fe ff ff call 8048354 <putchar@plt>
8048495: c7 04 24 64 00 00 00 movl $0x64,(%esp)
804849c: e8 b3 fe ff ff call 8048354 <putchar@plt>
80484a1: c7 04 24 5f 00 00 00 movl $0x5f,(%esp)
80484a8: e8 a7 fe ff ff call 8048354 <putchar@plt>
80484ad: c7 04 24 42 00 00 00 movl $0x42,(%esp)
80484b4: e8 9b fe ff ff call 8048354 <putchar@plt>
80484b9: c7 04 24 30 00 00 00 movl $0x30,(%esp)
80484c0: e8 8f fe ff ff call 8048354 <putchar@plt>
80484c5: b8 bd 85 04 08 mov $0x80485bd,%eax
80484ca: c7 44 24 04 79 00 00 movl $0x79,0x4(%esp)
80484d1: 00
80484d2: 89 04 24 mov %eax,(%esp)
80484d5: e8 9a fe ff ff call 8048374 <printf@plt>
80484da: b8 00 00 00 00 mov $0x0,%eax
80484df: c9 leave
80484e0: c3 ret

Pwnium CTF2014: Web200 Guest Book

Dalam soal web kali ini, kita diminta mencari flag di sebuah aplikasi guest book. Yang bisa kita lakukan hanya mengisi judul dan teks isi guest book. Tidak ada permintaan lain yang bisa dilakukan. Setelah mencoba-coba, ternyata bisa dilakukan SQL Injection, tapi hanya pada “insert”. Kira-kira SQL yang dibuat adalah seperti ini

"insert into guestbook(title, text) values('"+ $POST["title"] + "', '" + $POST["text"] + "')"

Dengan memasukkan title: ‘ + abs(2) + ‘, kita mendapatkan title: 2


Percobaan menggunakan version() menunjukkan DBMS yang dipakai adalah MySQL. Trik menggunakan comment (—-, #) dan “on duplicate update” tidak berhasil dilakukan, jadi akhirnya dipakai cara manual: konversi dari string ke numerik. Perhatikan bahwa di mysql, statement:


select 'ab' + 'cd';

akan menghasilkan 0 (string akan dikonversi implisit menjadi bilangan, lalu dijumlahkan). Trik yang saya pakai adalah mengubah teks menjadi bilangan yang bisa dikembalikan lagi menjadi teks. Fungsi yang salah pilih adalah substring, hex, dan conv, seperti ini:


' + (select conv(hex(substring(table_name,1,5)),16,10) from information_schema.tables where table_type='base table' limit 1 offset 1) + '

Didapatkan: 1718378855


Itu digunakan untuk mendapatkan 5 huruf pertama nama tabel (untungnya namnaya singkat: “flag”). Saya memilih 5 karakter, karena lewat dari itu, bilangan yang dihasilkan adalah floating point (kehilangan presisi). Untuk mengembalikan bilangan menjadi teks digunakan:


select unhex(conv(1718378855, 10, 16)) 

Berikutnya saya mencari nama kolom, kemudian melakukan select terhadap kolom tersebut (select flag from flag). Pertama saya sempat bingung, karena hasilnya kosong, ternyata flagnya ada di row kedua. Setelah menambahkan “offset”, didapatkan flagnya adalah:


Pwnium{a6f33b4062b8bdcf3fe12e024568f67b}


Catatan: mungkin ada yang salah yang salah lakukan, karena di write up orang lain, mereka bisa memakai –. Tapi write up ini menunjukkan ada lebih dari satu jalan untuk menyelesaikan masalah.