讲讲lazy binding、GOT Hijack、One Gadget和ROP

lazy binding

首先,程序中的每一条指令并不是都会被执行,程序中的library call也并不是都会被执行,例如程序中的分支结构。且在程序开始之前就解析所有用到的library call 会让程序很晚执行。所以,就有了lazy binding,即在程序第一次呼叫到library call的时候,才进行解析。

lazy binding有几个概念需要先了解下:
GOT:Global Offset Table
在我们程序call function(library call)的时候是根据GOT表中已被解析过的地址进行跳转。这表是用于存放各个liabrary call真实地址或未被解析时的地址资料。
tips:在gdb中可以直接敲入got会显示GOT表
在这里插入图片描述
.plt:Process Linkage Table
在GOT表中未被解析过的library call会跳转至plt表进行解析最后跳到runtime_resolve()解析函数进行最后解析绑定。这表存放着操作指令。
.plt.sec:呼叫library call 时,第一步会到这个表跳转至library call的真实地址,而library call的真实地址会在GOT表中查看。

第一次呼叫library call会先到.plt.sec表中查看地址,.plt.sec中存放的指令将指引程序跳转到GOT表查看该library call的地址,如果是未被解析过的library call,那么该library call在GOT表中的地址将指引程序跳转到plt表,那么GOT将继续跳转到plt表中进行解析,解析最后过程中最终会跳转至GOT表中的runtime_resolve()解析函数进行最后最后解析,并将解析出的地址在GOT表中进行绑定,这样就完成了第一次解析,在之后呼叫该library call是将直接跳转至library call的地址,不再进行解析。

这样讲感觉好干,下次补图好了…

GOT Hijack

前面我们说到GOT中存放着library call真实地址的值,GOT hijack大概就是修改GOT表中的值写成我们要执行指令的地址,就可以控制程序的执行流程。注意,这里library call绑定的地址是要被解析过的。

One Gadget

Gadget 是程序中一些可以为我们所用的指令片段。
One Gadget存放在libc中,跳进One Gadget就可以只开shell。
思路:可以找找程序中现有的library call,然后算出libc的基址,在用基址加上One Gadget在libc中的offset,将GOT表中程序原本library call绑定的地址改写成我们One Gadget的地址就可以了。

ROP (Return Otiented Program)

ROP是最后一个指令是ret指令的Gadget。
ROP是在栈溢出的基础上进行的,将要ret的地址在stack上修改为我们会使用到的Gadget的地址,这些Gadget会帮助我们布局syscall会用到的各个寄存器和变量的值,在最后一层Gadget指令执行后直接跳转执行syscall。
前文讲到由于stack区域被设置为NX标识,stack禁止执行指令,,程序无法完美执行我们植入shellcode。面对这种保护机制的程序我们就可以使用ROP。

syscall table用到的时候可以查
在这里插入图片描述

太多文文文文文字…
下次再加图改进更新好了
在这里插入图片描述

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值