[BSIDESSF 2017] Skipper 2 (200)

Masalah

Diberikan binary yang bernama skipper2-32 .

Penyelesaian

Pengumpulan Informasi

Arsitektur
$ file skipper2-32
skipper2-32: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=21b4662c34fa366172172c202b2301df89208313, not stripped

Arsitektur yang dipakai adalah Linux 32-bit.

Alur Program
$ ./skipper2-32
Computer name: dummy
Sorry, your computer's name - dummy - is not correct!
[1] 7576 killed ./skipper2-32

Program mengambil informasi nama komputer yang sedang digunakan dan mencetak pesan galat.

Dekompilasi

Gunakan RetDec untuk dekompilasi dengan kode yang lebih rapi.

// Address range: 0x804cf87 - 0x804d17f
int main(int argc, char ** argv) {
int32_t str2;
memset((char *)&str2, 0, 1024);
int32_t str;
int32_t v1 = &str; // 0x804cfcd_0
get_name(v1);
printf("Computer name: %s\n", &str);
if (strcmp((char *)&str, "hax0rz!~") != 0) {
// 0x804d00e
printf("Sorry, your computer's name - %s - is not correct!\n", &str);
raise(9);
// branch -> 0x804d032
}
// 0x804d032
strcat((char *)&str2, (char *)&str);
get_os(v1);
printf("OS version: %s\n", &str);
if (strcmp((char *)&str, "2.4.31") != 0) {
// 0x804d08f
printf("Sorry, your OS version - %s - is not supported!\n", &str);
raise(9);
// branch -> 0x804d0b3
}
// 0x804d0b3
strcat((char *)&str2, (char *)&str);
get_cpuid((char *)&str);
puts((char *)&str);
if (strcmp((char *)&str, "AMDisbetter!") != 0) {
// 0x804d10b
printf("Sorry, your CPU - %s - is not supported!\n", &str);
raise(9);
// branch -> 0x804d12f
}
// 0x804d12f
strcat((char *)&str2, (char *)&str);
finish((char *)&str2);
if (*(int32_t *)20 != *(int32_t *)20) {
// 0x804d16b
__stack_chk_fail();
// branch -> 0x804d170
}
// 0x804d170
return 0;
}

Berdasarkan kode hasil dekompilasi, alur program melakuan pemeriksaan untuk nama komputer, versi sistem operasi, dan CPU pada variabel str. Sedangkan variabel str2 digunakan untuk menampung semua string yang benar dan digunakan sebagai parameter fungsi finish yang lumayan rumit.

Identifikasi Kelemahan

Berdasarkan informasi yang telah dikumpulkan, terdapat beberapa kelemahan.

  • Masing-masing struktur kondisional bisa dilewati dengan mengatur nilai register eax menjadi 0
  • Semua nilai yang benar saat pemeriksaan sudah tersedia pada kode hasil dekompilasi, jika digabungkan maka variabel str2 bernilai hax0rz!\\~2.4.31AMDisbetter!.

Eksploitasi

Penyelesaian akhir dilakukan dengan menggunakan Python dan Radare2.

  • Atur beberapa breakpoint untuk setiap set instruksi test eax, eax
  • Buka binary dalam mode debug dengan r2pipe
  • Analisis binary dengan perintah aaaaa
  • Mulai program dengan perintah dc
  • Atur breakpoint dengan perintah db
  • Lanjutkan alur program menuju breakpoint dengan perintah dc
  • Atur register EAX agar bernilai 0 dengan perintah dr eax=0 untuk melewati beberapa pengecekan.
import r2pipe

passcode = "hax0rz!\\~2.4.31AMDisbetter!"
break_point_flag = "0x0804d152"
break_points = [
"0x0804d00a", # pc name
"0x0804d08b", # os name
"0x0804d107", # cpu name
]

r2 = r2pipe.open("./skipper2-32", ["-d"])
r2.cmd("aaaaa") # analyse binary
r2.cmd("dc") # continue

for break_point in break_points:
r2.cmd("db " + break_point) # set break point
r2.cmd("dc") # continue
r2.cmd("dr eax=0") # skip those tests

r2.cmd("db " + break_point_flag) # break before getting the flag
r2.cmd("dc") # continue
r2.cmd("s eax") # seek to parameter that's passed to the flag function
r2.cmd("wb 00") # clear memory block with 0x00's
r2.cmd("wz " + passcode) # write passcode as paramater for the flag func in the memory block
print(r2.cmd("dc")) # get flag!

Luaran

python getflag.py
Process with PID 15576 started...
= attach 15576 15576
bin.baddr 0x08048000
Using 0x8048000
Assuming filepath /home/dummy/Private/progress/bsides/rev/skipper-200/skipper2-32
asm.bits 32
TODO: esil-vm not initialized
Cannot find section boundaries in here
Warning null var in fcn.0x80489a5.b.1.8
Warning null var in fcn.0x80489a5.b.1.8
Warning null var in fcn.0x80489a5.b.1.8
Warning null var in fcn.0x80489a5.b.1.8
= attach 15576 15576
Selecting and continuing: 15576
child stopped with signal 17
got signal...
Selecting and continuing: 15576
hit breakpoint at: 804d00a
Selecting and continuing: 15576
hit breakpoint at: 804d08b
Selecting and continuing: 15576
hit breakpoint at: 804d107
Selecting and continuing: 15576
hit breakpoint at: 804d152
Selecting and continuing: 15576
PTRACE_EVENT_EXIT pid=15576, status=0x0
Computer name: dummy
OS version: 4.10.0
GenuineIntel


The key is: FLAG:18ee7c71d2794f546ca23e6858de0bc6
Reference

results matching ""

    No results matching ""