• Advance ROP(高级ROP)


    参考https://bbs.pediy.com/thread-250703.htm

    介绍

    在linux中,有个关于链接库在被链接时的机制叫延迟绑定,即在程序运行时,第一次引用链接库里的函数时,才会链接,跟以往的静态链接不一样,这样可以节省很多内存空间。而在链接过程中,有一个步骤叫重定位,即重新定位函数在程序的位置,而linux中是利用函数_dl_runtime_runtime_resolve(link_map_obj,reloc_index)函数进行重定位的,所以我们可以通过控制相关的参数,就可以控制这个函数去运行我们需要的函数了。在利用之前先做一点前置知识的介绍:

    前置知识

    https://bbs.pediy.com/thread-250703.htm

     

    这个总结的非常好,还有实际操作

    利用步骤

    其实也没什么所谓的步骤,只要我们知道dl_runtime_resolve这个函数的流程,那么,我们在某个可执行可写可读的地方,构造他执行时需要的数据、地址就可以了

    所以利用这个漏洞最重要的就是这个函数的执行流程

    1.该函数通过link_map_obj来访问,该.dynamic,并分别取出.dynstr、.dynsym、.rel.plt这三个地址,这三个地址基本上就是该函数的主要流程了

    2..rel.plt通过参数reloc_index相加后,可以得到当前函数的重定位表象Elf32_Rel的指针,记做rel (所以我们只需要在我们可以控制的地方进行参数index的伪造那么,我们就可以控制住rel这个指针,(当前地址-.rel.plt_addr,这样得出了我们的index))

    3.rel->r_info>>8后,可以得到dynsym地址的相应函数的符号表项Elf32_Sym的指针,记做sym  (通过伪造了rel后,我们知道rel是一个结构体,由于上一步我们用index,把rel指针指向了我们的控制地址,所以我们在我们rel所指向的地方添加函数的got信息和我们要伪造的r_info信息,这样就可以控制住在利用.dynsym时需要的下标,然后在将r_info右移,并且与7做异或)

    4.dynstr+sym这个地址后,可以得到相应的函数名称(当sym被控制住后,我们要如何构造sym呢?我们找到我们要的函数名称,并且把他保存在我们的地址中,然后用这个地址减去.dynstr这个地址即可)

    5.在动态链接库查找这个函数的地址,并且把地址赋值给*rel->r_offset,即GOT表;

    6.最后调用这个函数

  • 相关阅读:
    Java接口总结
    java面向对象特点总结
    二分查找的两种实现方法
    关于Java的对象equals方法
    java加密枝术是怎样的?
    Java中子类和父类间的调用关系
    Java中字符串的完美度
    Java源代码不编译到字节码文件
    java生成6位随机数
    Struts2中ModelDriven的使用
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/12903980.html
Copyright © 2020-2023  润新知