如何创建在不同运行中保持相同虚拟地址的可执行文件

逆向工程 C 动态分析 可执行
2021-06-15 20:40:36

我想创建一个可执行文件,在不同的执行运行期间保持相同的虚拟地址。

这绝对是可能的,因为我在 CTF(捕获标志)中看到了这些文件,玩家必须使用缓冲区溢出来重写返回地址以执行“秘密”功能。

那么,有没有办法告诉 GCC 生成一个“不允许”执行时内存随机化的可执行文件?

或者也许我认为这一切都错了。您可以分享任何信息以指出我正确的方向,我们将不胜感激。

1个回答

作为 ASLR 的一部分,操作系统使用嵌入在可执行文件中的代码重定位表来更改可执行映像所在的位置。

如果您删除重定位表(或生成一个没有它的可执行文件),操作系统将无法重定位可执行映像,但是也加载到同一进程的内存地址的其他映像仍将被重定位。

此外,操作系统可能会实现/支持与 ASLR 相关的可执行文件标志来选择加入或退出 ASLR,同样取决于操作系统和用户配置,不支持 ASLR 的可执行文件仍可能是随机的。

Visual Studio 有两个相关的标志,/FIXED/DYNAMICBASE,用于包括重定位表和选择加入 ASLR。

在 GCC 上,-fPIE用于启用重定位表(与位置无关的可执行文件)。