Thursday, October 23, 2014

HACK.LU CTF 2014: GUESS THE FLAG

Look at that guy over there! He's a bandit from the group that robs the stagecoaches in unpredictable intervals. I think he hasn't been with them for very long, so he can't tell whether you're one of them. Try to look like a bandit and talk to him. He probably won't just tell you their plan for the attack, but maybe you can ask him some questions?

Kita juga diberikan binary dan source code:

https://github.com/ctfs/write-ups/tree/master/hack-lu-ctf-2014/guess-the-flag

Binarynya tentunya tidak mengandung flag yang benar (censored). Yang perlu diperhatikan dari source code adalah:

int is_flag_correct(char *flag_hex /* the user's guess in hex */) { 

char bin_by_hex[256] = { /* table for looking up the value of a hex character – -1 means invalid */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,

dan


/* the correct flag was censored out */
char flag[50] = "flag{0123456789abcdef0123456789abcdef0123456789ab}";

Ketika konversi dari hex ke biner yang dilakukan adalah:


for (int i=0; i<50; i++) {
char value1 = bin_by_hex[flag_hex[i*2 ]];
char value2 = bin_by_hex[flag_hex[i*2+1]];
if (value1 == -1 || value2 == -1) {
printf("bad input – one of the characters you supplied was not a valid hex character!\n");
exit(0);
}
given_flag[i] = (value1<<4) | value2;
}

Masalahnya terletak pada “char” yang sifatnya signed. Jika kita beri flag_hex dengan nilai negatif, maka kita akan merujuk ke bin_by_hex[nilaiminus], dan karena tepat setelahnya adalah lokasi flag, maka kita bisa menunjuk agar tiap karakter menunjuk ke flag.


Dari hasil investigasi, ternyata jarak antara bin_by_hex dan flag adala 64 byte, jadi jika kita bisa nilai –64, –63, dst maka kita akan mendapat pesan bahwa flag kita benar. Masalahnya kita tetap tidak tahu flag kita apa.


Jadi untuk mendapatkan flagnya, kita kirimkan semua nilai tadi, kecuali karakter pertama, kita coba dari 0-9a-f. Lalu ketika sudah mendapatkan karakter yang benar, kita coba karakter kedua, dst.


Dengan cara itu, didapat: flag{6974736a7573746c696b65696e7468656d6f76696573}

kalau didecode flagnya: itsjustlikeinthemovies

No comments:

Post a Comment