IDSECCONF ONLINE 2016: Bit 100

Problem

Service: 128.199.232.109 Port: 17846

bit guess

Solve

Diberikan file ELF 64-bit, stripped, jika didecompile dengan IDA didapatkan source code.

int __cdecl main(int argc, const char **argv, const char **envp)
{
unsigned int t; // eax@1
signed __int64 r; // rbx@1
int result; // eax@5
signed int saldo; // [sp+14h] [bp-2Ch]@7
__int64 tebakanku; // [sp+18h] [bp-28h]@3
__int64 taruhanku; // [sp+20h] [bp-20h]@3
__int64 jawaban; // [sp+28h] [bp-18h]@1t = time(0LL);
srand(t);
r = (signed __int64)rand() << 32;
jawaban = r | rand();
if ( jawaban > 13 )
jawaban += 14LL;
puts(“++++ BITCOIN KASINO ++++!”);
fflush(0LL);
sleep(3u);
puts(“Eddy Tongsis Masuk Dengan BTC90000…\nGayus Timbunan Masuk Dengan BTC100000…\nDan Kamu Dengan Saldo 100BTC.”);
fflush(0LL);
sleep(3u);
puts(“Tebak Angka Yang Akan Naik – (Diatas 13)”);
fflush(0LL);
sleep(3u);
printf(“Masukkan Angka Keberuntunganmu: “, argv);
fflush(0LL);
__isoc99_scanf(0x400D59LL, &tebakanku);
printf(“Nilai Taruhanmu (BTC): “, &tebakanku);
fflush(0LL);
__isoc99_scanf(0x400D76LL, &taruhanku);
if ( (signed int)taruhanku <= 100 && taruhanku >= 0 )
{
progress(8);
puts(“Hasilnya adalah…”);
fflush(0LL);
sleep(3u);
if ( tebakanku == jawaban )
{
puts(“Ajaib! Selamat Atas Tebakannya.”);
saldo = taruhanku + 100;
}
else
{
saldo = 100 – taruhanku;
printf(“Bukan %lld. Yang Benar Adalah %lld.\n“, tebakanku, jawaban);
}
fflush(0LL);
sleep(3u);
if ( saldo > 100000 )
{
progress(5);
printf(“Anda Memenangkan %dBTC\nSelain Itu Akan Kami Berikan Bonus Berupa\n“, (unsigned int)saldo);
sleep(5u);
giveflag();
}
else
{
printf(“Kamu Kalah! (%dBTC) \n“, (unsigned int)saldo);
}
result = 0;
}
else
{
puts(“Taruhan ditolak, saldo kamu hanya 100BTC”);
result = 0;
}
return result;
}

Jadi intinya, anda disuruh menebak angka random, dan memberikan nilai taruhan. Jika tebakan anda benar, uang anda akan ditambah dengan taruhan, dan jika salah maka dikurangi sebesar taruhan. Jika di akhir uang anda melebihi 100000, anda menang dan mendapatkn flag.

Sekilas tidak mungkin, karena taruhan dibatasi dari 0 sampai 100. Kalaupun tebakan benar, uang hanya bertambah 100 menjadi 200, dan program tidak looping sehingga tidak mungkin mencapai nilai 100000.

Mungkin bisa mencurangi dengan memasukkan taruhan bernilai minus dan memasukkan angka apa saja, sehingga kode dibawah ini

saldo = 100 – taruhanku;
printf(“Bukan %lld. Yang Benar Adalah %lld.\n“, tebakanku, jawaban);

akan membuat saldo menjadi jauh lebih besar (100 dikurangi -100000 akan menjadi 100100 misalnya). Sayangnya ada pengecekan if ( (signed int)taruhanku <= 100 && taruhanku >= 0 yang terjemahkan assembly sebagai jg (cek <= 100) dan jns (cek >= 0).

Salah satu cara yang terpikirkan adalah menggunakan nilai maksimum integer 32-bit 4294967295 atau (11111111111111111111111111111111) dalam biner.

Pengecekan pertama, karena menggunakan cmp eax, 100 dan test yang signed jg, maka nilai pada register EAX (11111111111111111111111111111111) akan dianggap -1, sehingga lolos pengecekan <= 100.

Pengecekan kedua, dengan test rax, rax dan jns. Nilai taruhan yang jika disimpan di register RAX akan bernilai dalam biner (0000000000000000000000000000000011111111111111111111111111111111).

Jika dilakukan test rax, rax, bilangan tersebut dianggap bilangan positif 64-bit (karena bit depannya 0), sehingga akan lolos dari jns dan cek >= 0. Jika dimasukkan angka tersebut ke program (dengan angka tebakan apa saja supaya salah) maka

$ ./bit


++++ BITCOIN KASINO ++++!

Eddy Tongsis Masuk Dengan BTC90000…

Gayus Timbunan Masuk Dengan BTC100000…

Dan Kamu Dengan Saldo 100BTC.

Tebak Angka Yang Akan Naik – (Diatas 13)

Masukkan Angka Keberuntunganmu: 0

Nilai Taruhanmu (BTC): 4294967295

========= Hasilnya adalah…

Bukan 0. Yang Benar Adalah 5381429336863665181.

Kamu Kalah! (101BTC)

Perhatikan bahwa anda kalah namun saldo malah bertambah, artinya berhasil memasukkan angka -1. Dari sini sudah jelas, anda akan memasukkan angka (4294967295 – 100000 = 4294867295) supaya saldo bertambah 100001 meski kalah.

Langsung saja coba ke remote server

$ nc 128.199.232.109 17846


++++ BITCOIN KASINO ++++!

Eddy Tongsis Masuk Dengan BTC90000…

Gayus Timbunan Masuk Dengan BTC100000…

Dan Kamu Dengan Saldo 100BTC.

Tebak Angka Yang Akan Naik – (Diatas 13)

Masukkan Angka Keberuntunganmu: 0

Nilai Taruhanmu (BTC): 4294867295

========= Hasilnya adalah…

Bukan 0. Yang Benar Adalah 1420821384614299086.

====== Anda Memenangkan 100101BTC

Selain Itu Akan Kami Berikan Bonus Berupa

flag{Integer_H4ri_Ini}

results matching ""

    No results matching ""