山东001在线

 找回密码
 立即注册
搜索
查看: 541|回复: 0

[美女] 了解:路远征——GLIBC2.37后时代的IO攻击之道(二)h2023/3/26 23:34:39

[复制链接]
  • TA的每日心情
    奋斗
    2023-9-22 14:51
  • 签到天数: 341 天

    [LV.8]以坛为家I

    发表于 2023-3-26 23:34:35 | 显示全部楼层 |阅读模式

    此后的2篇文章是为了后面一条链做好铺垫,为了更好的水文,所以废话比较多,老棍可以直接跳到秦月汉关再现这一节。逆向的相关资讯可以到我们网站了解一下,从专业角度出发为您解答相关问题,给您优质的服务!



    一、老生常谈的GOT表与PLT表
    对于操作系统,GOT表与PLT表是绕不开的问题。





    GOT表全称GOT,翻译过来就是全局偏移表,用于记录在ELF文件中所用到的共享库中符号的地址。说人话,就是程序中开辟了一块固定位置的内存用来存储数据。大部分时候存储的是函数指针。





    PLT表全称PLT,翻译过来就是过程链接表,作用是将位置关的符号转移到绝对地址。当一个外部符号被调用时,PLT去引用GOT中的其符号对应的绝对地址。具体说就是[]这种形式来跳到指定位置。





    GOT表与PLT表可以算是编译届的老古董,它们的产生可以看作软件发展的必然,目前任何操作系统都在使用他们。





    在的3环程序中,RELRO(RLR-O)保护主要针对的就是GOT表,有3种模式,其中与对GOT表保护相同。







    1


    2


    3




    (全部开启,不可写)


    (部分开启,可写)


    (不开启,可写)





    与模式下,在程序刚开始运行时,GOT表项是空的,当符号首次被调用时会动态解析符号的绝对地址然后转去执行,并将被解析符号的绝对地址记录在GOT中,第二次调用同一符号时,由于GOT中已经记录了其绝对地址,直接转去执行即可(不用重新解析)。2就是针对动态解析过程的一种攻击手段。





    模式下,程序在开始时,在___过程中直接将符号表解析,GOT中已经记录了其绝对地址,直接转去执行即可,并且GOT表被分在了不可写的段中。


    二、程序重定位的达摩克利斯之剑
    程序重定位的需求是GOT表与PLT表的前提,在汇编时代,PIC(-,地址关代码)使得程序某些内容必须重定位。86时代,各路链接器在程序重定位方面也是八仙过海各显其能,以GNU为例,程序重定位是通过__86__这一类函数现的,这个函数的作用就是利用在栈中存储的,并将其赋值给通用寄存器,在之后的程序中以此通用寄存器进行定位。








    喜大普奔的RIP寻址
    64指令集在升级的同时,发明了RIP寻址,这使得程序重定位工作变得简单了许多,我们对比86与64的编译之后的文件就可以明显看出区别。86程序中要定位段的字符串需要用到__86__得到当前的,然后通过偏移找到字符串地址,而64系统中只需要使用,[+0]这一条指令就能找到字符串的地址。











    在86_64架构下的现代操作系统中,因为使用虚拟内存管理,完全可以不使用PIC,但是编译器发展这么久掌握的屠之技,不用可惜了,于是就打了个安全的旗号继续使用(说笑)。同样,PIE(-,地址关可执行文件)只是在PIC基础上更近了一步而已,不用过多赘述。


    、秦月汉关再现
    C库也需要重定位
    C库与其他环程序本质上没有任何区别,而且因为它本身由很多文件编译而成,重定位需求更加强烈,同样也有GOT表与PLT表,只是一般来说C库的都是,GOT不可写。








    神出鬼没的PLT
    PLT就是过程链接,对于一个程序而言,任何需要在运行时才确定的内容都是需要过程链接的,例如C++在虚函数展现多态时,虚函数指针就需要在运行时进行链接。同样,在程序处理过程中也需要对一些函数的表在过程中再进行链接,就会有节,这个节由___在程序开始时根据运行环境进行解析(主要是字符集,链接器等内容),而这个节为了能适应环境,就设计成可写的。











    以为例,在静态编译中看到的函数如下,这是根据环境信息对参数进行一定的设置。











    但际函数并非如此。因为函数在开始时候会调用,我们跟随函数找到真正的。可以看出会调用的PLT表,PLT表跳转到一个*ABS*@的地方,里面存储的才是真正的函数地址。

















    其中*ABS*@对应的就是节。











    真正的函数反编译如下,过程还是非常复杂的。











    比较后说一下,不但有这种形式,PLT表也分很多,例如、等。其中调用的就是中的内容。








    四、攻击方式
    说明到这个地方,攻击方式就很简单了,就以刚才的函数为例,既然它一开始会执行()计算字符串长度,那么如果将其修改成的中的内容改成就能够。而且,附近数据非常丰富,和都可以使用,还可以将其直接修改为_。在4各类都不能使用的情况下,如果屏蔽掉函数,这是一种很好用的攻击方式。





    需要说明的是,除了之外,很多函数都会调用中的内容,连___这种函数都会调用,希望大家可以奋力挖掘。


    其他
    此篇文章没有专门的板子,因为只是一种攻击思路,主要原因是为后面一条链做好铺垫。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Archiver|山东001在线 ( ICP11027147 )

    GMT+8, 2026-4-4 10:41 , Processed in 0.046275 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表