PIE

Reading time: 4 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

基本信息

编译为 PIE(位置无关可执行文件)的二进制文件意味着 程序每次执行时可以加载到不同的内存位置,防止硬编码地址。

利用这些二进制文件的技巧在于利用 相对地址——程序各部分之间的偏移量即使绝对位置改变也保持不变。要 绕过 PIE,只需泄露一个地址,通常通过使用格式字符串攻击等漏洞从 中获取。一旦你有了一个地址,就可以通过它们的 固定偏移量 计算其他地址。

在利用 PIE 二进制文件时,一个有用的提示是它们的 基地址通常以 000 结尾,这是因为内存页是随机化的单位,大小为 0x1000 字节。这种对齐可以是 检查漏洞是否按预期工作 的关键,指示是否已识别正确的基地址。
或者你可以将其用于你的漏洞利用,如果你泄露了一个地址位于 0x649e1024,你就知道 基地址是 0x649e1000,然后你可以 计算 函数和位置的偏移量。

绕过方法

为了绕过 PIE,需要 泄露已加载二进制文件的某个地址,有一些选项可以做到这一点:

  • 禁用 ASLR:如果 ASLR 被禁用,编译为 PIE 的二进制文件总是 会加载到相同的地址,因此 PIE 将变得无用,因为对象的地址总是会在同一个地方。
  • 给出 泄露(在简单的 CTF 挑战中常见, 查看这个例子
  • 在栈中 暴力破解 EBP 和 EIP 值,直到你泄露出正确的值:

BF Addresses in the Stack

  • 使用 任意读取 漏洞,例如 格式字符串 来泄露二进制文件的地址(例如,从栈中,如前面的技术所示)以获取二进制文件的基地址并从那里使用偏移量。在这里找到一个例子

参考

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks