Libc Protections
Last updated
Last updated
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
Malloc 在 8 字节 (32 位) 或 16 字节 (64 位) 分组 中分配内存。这意味着在 32 位系统中,块的结束应与 0x8 对齐,而在 64 位系统中应与 0x0 对齐。安全特性检查每个块在使用 bin 中的指针之前是否在这些特定位置 正确对齐。
在 64 位系统中强制块对齐显著增强了 Malloc 的安全性,通过 将假块的放置限制为每 16 个地址中的 1 个。这使得利用攻击变得更加复杂,尤其是在用户对输入值的控制有限的情况下,使攻击更复杂且更难成功执行。
对 __malloc_hook 的 Fastbin 攻击
Malloc 中的新对齐规则也阻止了涉及 __malloc_hook
的经典攻击。之前,攻击者可以操纵块大小以 覆盖此函数指针 并获得 代码执行。现在,严格的对齐要求确保此类操纵不再可行,关闭了一个常见的利用途径,增强了整体安全性。
Pointer Mangling 是一种安全增强,用于保护内存管理操作中的 fastbin 和 tcache Fd 指针。该技术有助于防止某些类型的内存利用战术,特别是那些不需要泄漏内存信息或直接相对于已知位置操纵内存位置的战术(相对 覆盖)。
该技术的核心是一个模糊公式:
New_Ptr = (L >> 12) XOR P
L 是指针的 存储位置。
P 是实际的 fastbin/tcache Fd 指针。
在 XOR 操作之前,将存储位置 (L) 向右移动 12 位的位移是至关重要的。这种操作解决了内存地址最低有效 12 位的确定性特性所固有的漏洞,这些位通常由于系统架构限制而可预测。通过移动位,预测部分被排除在外,从而增强了新混淆指针的随机性,从而保护免受依赖这些位可预测性的利用。
这个混淆指针利用了 地址空间布局随机化 (ASLR) 提供的现有随机性,ASLR 随机化程序使用的地址,使攻击者难以预测进程的内存布局。
解混淆 指针以检索原始地址涉及使用相同的 XOR 操作。在这里,混淆指针被视为公式中的 P,当与未更改的存储位置 (L) 进行 XOR 时,结果是原始指针被揭示。这种混淆和解混淆的对称性确保系统能够高效地编码和解码指针,而不会产生显著的开销,同时大大提高了对操纵内存指针攻击的安全性。
指针混淆旨在 防止堆管理中的部分和完整指针覆盖,这是安全性的重要增强。此功能以多种方式影响利用技术:
防止字节相对覆盖:之前,攻击者可以更改指针的一部分以 在不知道确切地址的情况下将堆块重定向到不同位置,这种技术在无泄漏的 House of Roman 利用中显而易见。通过指针混淆,此类相对覆盖 在没有堆泄漏的情况下现在需要暴力破解,大大降低了成功的可能性。
增加 Tcache Bin/Fastbin 攻击的难度:通过操纵 fastbin 或 tcache 条目来覆盖函数指针(如 __malloc_hook
)的常见攻击受到阻碍。例如,一种攻击可能涉及泄漏 LibC 地址,将一个块释放到 tcache bin 中,然后覆盖 Fd 指针以将其重定向到 __malloc_hook
以进行任意代码执行。通过指针混淆,这些指针必须正确混淆,需要堆泄漏以进行准确操纵,从而提高了利用门槛。
在非堆位置需要堆泄漏:在非堆区域(如栈、.bss 段或 PLT/GOT)创建假块现在也 需要堆泄漏,因为需要指针混淆。这增加了利用这些区域的复杂性,类似于操纵 LibC 地址的要求。
泄漏堆地址变得更加困难:指针混淆限制了 Fd 指针在 fastbin 和 tcache bins 中作为堆地址泄漏源的有效性。然而,未排序、小型和大型 bins 中的指针仍然未混淆,因此仍可用于泄漏地址。这一变化迫使攻击者探索这些 bins 以获取可利用的信息,尽管某些技术仍可能允许在泄漏之前解混淆指针,但有一定的限制。
有关该过程的更好解释 请查看原始帖子。
用于混淆和解混淆指针的公式是:
New_Ptr = (L >> 12) XOR P
其中 L 是存储位置,P 是 Fd 指针。当 L 向右移动 12 位时,它暴露了 P 的最高有效位,由于 XOR 的特性,当位与自身进行 XOR 时输出为 0。
算法中的关键步骤:
最初泄漏最高有效位:通过将移位后的 L 与 P 进行 XOR,您有效地获得了 P 的前 12 位,因为移位部分的 L 将为零,留下 P 的相应位不变。
恢复指针位:由于 XOR 是可逆的,知道结果和一个操作数可以让您计算另一个操作数。这个特性用于通过将已知的位集与混淆指针的部分进行逐步 XOR 来推导 P 的整个位集。
迭代解混淆:该过程重复进行,每次使用从上一步中发现的 P 的新位来解码混淆指针的下一个部分,直到所有位都被恢复。
处理确定性位:由于移位,L 的最后 12 位丢失,但它们是确定性的,可以在后处理时重建。
您可以在这里找到该算法的实现:https://github.com/mdulin2/mangle
指针保护是一种在 glibc 中使用的利用缓解技术,用于保护存储的函数指针,特别是那些通过库调用(如 atexit()
)注册的指针。该保护涉及通过将指针与存储在线程数据中的秘密 (fs:0x30
) 进行 XOR 并应用位旋转来打乱指针。该机制旨在防止攻击者通过覆盖函数指针来劫持控制流。
理解指针保护操作:指针的打乱(混淆)是使用 PTR_MANGLE
宏完成的,该宏将指针与 64 位秘密进行 XOR,然后执行 0x11 位的左旋转。恢复原始指针的反向操作由 PTR_DEMANGLE
处理。
攻击策略:该攻击基于已知明文的方法,攻击者需要知道指针的原始版本和混淆版本,以推导用于混淆的秘密。
利用已知明文:
识别固定函数指针:通过检查 glibc 源代码或初始化的函数指针表(如 __libc_pthread_functions
),攻击者可以找到可预测的函数指针。
计算秘密:使用已知的函数指针(如 __pthread_attr_destroy
)及其来自函数指针表的混淆版本,可以通过反向旋转(右旋转)混淆指针,然后与函数的地址进行 XOR 来计算秘密。
替代明文:攻击者还可以尝试使用已知值(如 0 或 -1)混淆指针,以查看这些是否在内存中产生可识别的模式,当这些模式在内存转储中找到时,可能会揭示秘密。
实际应用:在计算出秘密后,攻击者可以以受控的方式操纵指针,从而在了解 libc 基地址和能够读取任意内存位置的情况下,基本上绕过多线程应用中的指针保护。
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)