Array Indexing
基本信息
此类别包括所有由于在处理数组索引时出现错误而可能覆盖某些数据而导致的漏洞。这是一个非常广泛的类别,没有特定的方法论,因为利用机制完全取决于漏洞的条件。
然而,您可以找到一些不错的示例:
存在2个冲突的数组,一个用于存储数据的地址,另一个用于存储该数据的大小。可以从一个数组中覆盖另一个数组,从而可以写入任意地址并将其指定为大小。这允许将
free
函数的地址写入GOT表,然后用system
的地址覆盖它,并从具有/bin/sh
的内存中调用free。64位,无nx。覆盖一个大小以获得一种缓冲区溢出,其中每个东西都将被用作双精度数,并按从小到大排序,因此需要创建一个满足该要求的shellcode,考虑到不能移动canary的位置,并最终用地址覆盖RIP以返回,满足先前的要求,并将最大的地址放在一个新地址上,指向栈的起始位置(由程序泄漏),因此可以使用ret跳转到那里。
64位,无relro,canary,nx,无pie。栈中数组存在一个off-by-one,允许控制指针以授予WWW(它将数组中所有数字的总和写入数组中的off-by-one覆盖的地址)。控制堆栈以覆盖GOT
exit
地址为pop rdi; ret
,并在堆栈中添加main
的地址(回到main
)。使用ROP链泄漏GOT中put的地址(将调用exit
,因此将调用pop rdi; ret
,从而在堆栈中执行此链)。最后使用新的ROP链执行ret2lib。32位,无relro,无canary,nx,pie。利用错误的索引来从堆栈中泄漏libc和堆的地址。利用缓冲区溢出执行ret2lib调用
system('/bin/sh')
(需要堆地址来绕过检查)。
最后更新于