hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/aslr.md

5.5 KiB
Raw Blame History

ASLR

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS红队专家

支持HackTricks的其他方式

基本信息

地址空间布局随机化ASLR是操作系统中使用的一种安全技术,用于随机化系统和应用程序进程使用的内存地址。通过这样做,它显著增加了攻击者预测特定进程和数据位置(如堆栈、堆和库)的难度,从而减轻了某些类型的利用,特别是缓冲区溢出。

检查ASLR状态

要在Linux系统上检查ASLR状态可以从/proc/sys/kernel/randomize_va_space文件中读取值。存储在此文件中的值确定应用的ASLR类型

  • 0:无随机化。一切都是静态的。
  • 1保守随机化。共享库、堆栈、mmap()、VDSO页面被随机化。
  • 2:完全随机化。除了保守随机化随机化的元素外,通过brk()管理的内存也被随机化。

您可以使用以下命令检查ASLR状态

bashCopy codecat /proc/sys/kernel/randomize_va_space

禁用 ASLR

禁用 ASLR您需要将 /proc/sys/kernel/randomize_va_space 的值设置为 0。通常不建议在测试或调试场景之外禁用 ASLR。以下是禁用方法

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

您还可以通过以下方式禁用ASLR进行执行

setarch `arch` -R ./bin args
setarch `uname -m` -R ./bin args

启用ASLR

启用ASLR您可以将值2写入/proc/sys/kernel/randomize_va_space文件。通常需要root权限。可以使用以下命令启用完全随机化

echo 2 | sudo tee /proc/sys/kernel/randomize_va_space

跨重启保持

使用echo命令进行的更改是临时的,将在重新启动时重置。要使更改持久化,您需要编辑/etc/sysctl.conf文件并添加或修改以下行:

kernel.randomize_va_space=2 # Enable ASLR
# or
kernel.randomize_va_space=0 # Disable ASLR

编辑/etc/sysctl.conf后,使用以下命令应用更改:

sudo sysctl -p

这将确保您的ASLR设置在重新启动后保持不变。

绕过32位ASLR

32位暴力破解

PaX将进程地址空间分为3组

  • 代码和数据(已初始化和未初始化):.text.data.bss —> delta_exec变量中的16位熵。该变量在每个进程中随机初始化,并添加到初始地址中。
  • mmap()分配的内存共享库 —> 16位,称为delta_mmap
  • 堆栈 —> 24位,称为delta_stack。但实际上只使用11位从第10到第20个字节包括在内对齐到16字节 —> 这导致524,288个可能的真实堆栈地址

上述数据适用于32位系统降低的最终熵使得可以通过多次尝试执行来绕过ASLR直到利用成功完成。

暴力破解思路:

  • 如果利用是本地的您可以尝试暴力破解libc的基地址适用于32位系统:
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • 如果攻击远程服务器,您可以尝试暴力破解libc函数usleep的地址将10作为参数传递。如果某个时刻服务器需要额外10秒才能响应,则找到了该函数的地址。

{% hint style="success" %} 在64位系统中熵要高得多这是不可能的。 {% endhint %}

Ret2ret

尝试绕过ASLR滥用堆栈内部的地址

{% content-ref url="../stack-overflow/ret2ret.md" %} ret2ret.md {% endcontent-ref %}

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS Red Team Expert

支持HackTricks的其他方式