# 数组索引 {% hint style="success" %} 学习并练习AWS黑客:[**HackTricks培训AWS红队专家(ARTE)**](https://training.hacktricks.xyz/courses/arte)\ 学习并练习GCP黑客:[**HackTricks培训GCP红队专家(GRTE)**](https://training.hacktricks.xyz/courses/grte)
支持HackTricks * 查看[**订阅计划**](https://github.com/sponsors/carlospolop)! * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享黑客技巧。
{% endhint %} ## 基本信息 此类别包括所有由于在处理数组索引时出现错误而可能覆盖某些数据而导致的漏洞。这是一个非常广泛的类别,没有特定的方法论,因为利用机制完全取决于漏洞的条件。 然而,您可以找到一些不错的**示例**: * [https://guyinatuxedo.github.io/11-index/swampctf19\_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19\_dreamheaps/index.html) * 存在**2个冲突的数组**,一个用于存储数据的**地址**,另一个用于存储该数据的**大小**。可以从一个数组中覆盖另一个数组,从而可以写入任意地址,将`free`函数的地址写入GOT表,然后用`system`的地址覆盖它,并从具有`/bin/sh`的内存中调用free。 * [https://guyinatuxedo.github.io/11-index/csaw18\_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18\_doubletrouble/index.html) * 64位,无nx。覆盖一个大小以获得一种缓冲区溢出,其中每个东西都将被用作双精度数,并按从小到大的顺序排序,因此需要创建一个满足该要求的shellcode,考虑到不能移动canary的位置,并最终用指向ret的地址覆盖RIP,满足先前的要求,并将最大的地址放在一个新地址,指向栈的开始(由程序泄漏),因此可以使用ret跳转到那里。 * [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/) * 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。 * [https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html) * 32位,无relro,无canary,nx,pie。利用错误的索引来从堆栈中泄漏libc和堆的地址。利用缓冲区溢出执行ret2lib调用`system('/bin/sh')`(需要堆地址来绕过检查)。