栈溢出ROP——动态链接

当程序采用静态链接的方式时,我们进行ROP是很简单的,因为采用静态链接的程序,其本身就带有了大量的库函数,这样我们可以很方便的找到我们需要的gadget,但是当程序采用动态链接的方式时,其本身并没有这么多gadget,这时我们该如何处理呢。

首先,先看下面这张图

采用动态链接的程序,会有一个PLT表(代码段)和GOT表(数据段),程序中用到的函数都会在PLT表中存在一个表项,而GOT表中则存放了函数实际的物理地址。当程序调用函数时,执行call指令之后,会首先访问PLT中相应的表项,之后PLT表会立即询问GOT表,查看GOT表中是否已经存放了函数的物理地址。值得注意的是,函数被第一次调用时,GOT表中并没有存放函数对用的物理地址,这时GOT表就会告诉PLT其并没有对应的地址,那么PTL就会开始解析函数地址,并将解析出来的地址存放进GOT表,这样在以后调用函数时就不需要每次都解析地址了。

从最简单的题目开始,程序本身已经为我们提供了ststem函数,这样在PLT中就会有一个相应的表项,我们如果想要访问system函数,就可以直接从PLT表中获取到其对应的地址。

常规的第一步,checksec命令查看一下文件的类型和权限

看一下函数构成,发现有gets()函数可以利用

扫描二维码关注公众号,回复: 15248931 查看本文章

 然后通过动态调试计算需要覆盖的数据大小

可以看到需要112字节的垃圾数据。接下来我们就可以构造payload,编写攻击脚本了。

 值得注意的是,当我们搜索"/bin/sh"时,一定不要只搜索"bin/sh",因为这两个的搜索到的地址可能是不一样的,这就会导致攻击脚本失败(本人就是浪费了一个多小时才发现了这个问

题)。

这样执行脚本之后就可以拿到shell啦!

猜你喜欢

转载自blog.csdn.net/z671514087/article/details/124563903
ROP