Diketahui bahwa service tersebut merupakan python sandbox, dimana terdapat informasi flag terdapat didalam file 'flag.txt', untuk membaca file flag yang ada di komputer tersebut adalah sebagai berikut:
Monday, November 3, 2014
IDSECCONF OFFLINE 2014: Medium Exploit
Diketahui bahwa service tersebut merupakan python sandbox, dimana terdapat informasi flag terdapat didalam file 'flag.txt', untuk membaca file flag yang ada di komputer tersebut adalah sebagai berikut:
IDSECCONF OFFLINE 2014: Easy Exploit
Program akan membaca file 'flag' ketika kita dapat melakukan overwrite variable yang melakukan cek perbandingan dengan nilai 0xdeadbeef. Untuk melakukan mengoverwrite variable tersebut, input buffer yang dibutuhkan adalah 20bytes.
Thursday, October 23, 2014
HACK.LU CTF 2014: Personnel Database
Kita diberikan source code ke sebuah service. Ketika register kita mendapatkan level terendah, dan kita hanya bisa membaca info milik boss jika memiliki level tertinggi.
Kelemahan service ini adalah: buffer yang digunakan untuk menulis besarnya tidak sama dengan membaca. Ketika mendapatkan input dari user:
char line[512]; /* last incoming command */
while (printf("> "), fgets(line, sizeof(line), stdin)) {
rtrim(line);
Dan ketika membaca dari file:
char line[256];
while (fgets(line, sizeof(line), f)) {
512 vs 256. Karena fgets dipakai, maka satu “baris” menjadi max 256 line. Jika kita memberikan deskripsi lebih dari 256 karakter, maka sisanya akan dianggap baris berikutnya.
Perintah ini cukup untuk mendapatkan flagnya:
register yohanes:yohanes1
set_description ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ123456789access_level=11
logout
user yohanes
pass yohanes1
whois boss
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

