ASLR, PIE, PIC

1. ASLR(地址空间布局随机化)

  • 作用:ASLR 随机化进程的内存布局(包括代码数据等)。
  • 目标:使得内存中数据和代码的位置难以预测,增加安全性。

2. PIE(位置无关可执行文件)

  • 作用:使可执行文件的整个代码和数据部分位置无关,能在任意内存地址加载运行。
  • 目标:配合 ASLR,允许整个程序的地址随机化,提高抵抗某些类型攻击的能力。

3. PIC(位置无关代码)

  • 作用:使库中的代码位置无关,可以在任意内存地址加载
  • 目标:主要用于动态链接库,使其可在多个程序中共享而无需重新定位。

各种情况下的表现:

ASLR关闭,PIE关闭,PIC关闭
  • 主程序、栈、库:都将在内存中的固定地址加载。没有任何随机化,安全性最低。
ASLR关闭,PIE关闭,PIC开启
  • 主程序、栈:固定地址加载。
  • :虽然是PIC,但无ASLR支持,所以可能仍加载在固定地址
ASLR关闭,PIE开启,PIC关闭
  • 主程序:理论上位置无关,但因ASLR关闭,可能仍加载在固定地址。
  • 栈、库:同上,可能不会随机化。
ASLR关闭,PIE开启,PIC开启
  • 主程序、库:都是位置无关,但因ASLR关闭,可能加载在固定地址。
  • :位置固定。
ASLR开启,PIE关闭,PIC关闭(最普遍情况)
  • 主程序:固定地址加载。
  • 栈、库:地址随机,但库加载可能需要重定位。
ASLR开启,PIE关闭,PIC开启
  • 主程序:固定地址。
  • 栈、库随机地址加载,库不需要重定位。
ASLR开启,PIE开启,PIC关闭
  • 主程序、栈、库所有部分地址随机化库可能需要重定位,但主程序完全随机
ASLR开启,PIE开启,PIC开启
  • 主程序、栈、库全部随机地址加载,没有重定位需求,安全性最高。

推荐配置:

对于大多数应用,最佳实践是同时启用ASLR和PIE。这样不仅主程序可以随机加载,整个程序的内存布局都被优化保护。如果你正在使用共享库,也应启用PIC,以确保库同样受益于随机化且无需重定位,这可以减少运行时的开销。

希望这些详细说明能帮助你更好地理解这些设置的具体作用和推荐的使用场景。

int a = 1;

void func() {

}

int main() {
    int b = 2;
}

1. ASLR关闭,PIE关闭,PIC关闭

  • 全局变量 a:在全局数据区(.data段)的固定地址。
  • 函数 func():代码在代码段的固定地址。
  • main() 函数:代码也在代码段的固定地址。
  • 局部变量 b:在栈上,但由于ASLR关闭,栈的起始地址固定。

2. ASLR关闭,PIE关闭,PIC开启

  • 全局变量 a:固定地址。
  • 函数 func():固定地址。
  • main() 函数:固定地址。
  • 局部变量 b:在栈上,地址固定。

3. ASLR关闭,PIE开启,PIC关闭

  • 全局变量 a:虽然程序是PIE,但因ASLR关闭,可能仍在固定地址。
  • 函数 func():可能在固定地址。
  • main() 函数:可能在固定地址。
  • 局部变量 b:在栈上,地址固定。

4. ASLR关闭,PIE开启,PIC开启

  • 全局变量 a:可能在固定地址。
  • 函数 func():可能在固定地址。
  • main() 函数:可能在固定地址。
  • 局部变量 b:在栈上,地址固定。

5. ASLR开启,PIE关闭,PIC关闭(最普遍情况)

  • 全局变量 a:固定地址。
  • 函数 func():固定地址。
  • main() 函数:固定地址。
  • 局部变量 b:栈的地址随机。

6. ASLR开启,PIE关闭,PIC开启

  • 全局变量 a:固定地址。
  • 函数 func():固定地址。
  • main() 函数:固定地址。
  • 局部变量 b:栈的地址随机。

7. ASLR开启,PIE开启,PIC关闭

  • 全局变量 a:随机地址。
  • 函数 func():随机地址。
  • main() 函数:随机地址。
  • 局部变量 b:栈的地址随机。

8. ASLR开启,PIE开启,PIC开启

  • 全局变量 a:随机地址。
  • 函数 func():随机地址。
  • main() 函数:随机地址。
  • 局部变量 b:栈的地址随机。
ASLR(Address Space Layout Randomization)是一种安全机制,可以通过随机化进程的内存布局来减少针对特定内存地址的攻击。在 Linux 系统中,ASLR 是通过内核参数和运行时链接器来实现的。 要启用 ASLR,需要执行以下步骤: 1. 确认系统内核版本是否支持 ASLR,并检查内核参数是否已启用 ASLR。可以通过执行以下命令来检查: ``` $ sysctl kernel.randomize_va_space ``` 如果输出为 `kernel.randomize_va_space = 2`,则表示已启用 ASLR;如果输出为 `kernel.randomize_va_space = 0`,则表示未启用 ASLR。 2. 如果 ASLR 未启用,则需要编辑 `/etc/sysctl.conf` 文件并添加以下行: ``` kernel.randomize_va_space=2 ``` 保存文件并执行以下命令以使更改生效: ``` $ sysctl -p ``` 3. 确认系统中的所有可执行文件都已启用 ASLR。可以通过执行以下命令来检查: ``` $ readelf -l /path/to/executable | grep "GNU_STACK" ``` 如果输出中包含 `GNU_STACK` 并且 `RWE` 标志已设置,则表示该文件已启用 ASLR。 如果输出中没有 `GNU_STACK` 标志,则需要重新编译该文件并添加 `-Wl,-z,relro,-z,now` 选项来启用 ASLR。 如果输出中的 `GNU_STACK` 标志未设置为 `RWE`,则需要使用 `execstack` 命令来设置该标志: ``` $ execstack -c /path/to/executable ``` 然后再次运行 `readelf` 命令来确认 `GNU_STACK` 标志已设置为 `RWE`。 重复以上步骤,确保系统中的所有可执行文件都已启用 ASLR
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LIHAORAN99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值