Articles of aslr

为什么堆栈必须是页面alignment的?

在Linux中,我试过(只是为了好玩)在process.c中修改内核源代码。创build一个具有更多熵的堆栈地址,即: sp -= get_random_int() % 8192; 当我改变太多,内核停止或我得到一些看似不明确的行为。 我猜这会导致PAGE_ALIGN()以某种方式失败? 我并不关心为什么PAGE_ALIGN()特别是失败,或者说内核中的哪一段代码失败了(尽pipe这也是很好的事情)。 我更感兴趣的是为什么堆栈必须驻留在特定的区域。 这背后的build筑理由和动机是什么? 这与GDT / LDT如何在保护模式下工作有关系吗? 只是为了弄清楚我在问什么: 为什么堆栈的forms必须是0xbfXXXXXX(在32位上)? 为什么堆栈不能是例如0xaaXXXXXX或其他值?

如何禁用Linux上的二进制地址空间随机化?

我正在开发并行程序的运行时系统,它可以利用跨多个进程的公共地址空间布局,可能遍布数千个节点。 很多时候,为这个环境构build的软件是在默认情况下启用了地址空间随机化的Linux系统上运行的,用户可能不希望或者不能在系统范围内禁用它(通过sysctl -w kernel.randomize_va_space=0等) 。 这对并行程序施加了一些限制,并且可能会损害性能。 因此,我们想弄清楚如何为我们构build的二进制文件禁用它。 安全性不是问题,因为此软件始终在受控环境中运行。 我已经find各种标志和variables的引用,如ET_EXEC , EF_AS_NO_RANDOM (显然从来没有合并过?)和PF_RANDOMIZE ,但我找不到任何文件,描述我可以做什么来设置这些标志。 一个理想的答案会告诉我什么编译器/汇编器/链接器标志将会禁用随机化生成的二进制文件,以及工作链/内核的工作版本。 下一个最好的将是一个工具,做一个二进制之后build立相同。 因为我确定有人会提出这个build议,所以我已经意识到我们可以在运行时用setarch -R做这个改变,但是最好把它logging在可执行文件中。 它看起来像paxctl -rx应该做的伎俩,但它似乎并不适用于内核中使用的当前方法,不包括PaX修补程序。

禁用内存地址的随机化

我试图debugging一个使用了很多指针的二进制文件。 有时,为了快速查看输出以找出错误,我打印出对象的地址及其相应的值,但是对象地址是随机的,这就违反了快速检查的目的。 有没有一种方法来暂时/永久禁用此function,以便每次运行该程序时都能得到相同的值。 哎呀。 OS是Linux fsttcs1 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

只为我自己禁用和重新启用地址空间布局随机化

我想在我的系统(Ubuntu GNU / Linux 2.6.32-41-server)上禁用地址空间布局随机化(ASLR),但是,如果我使用 sysctl -w kernel.randomize_va_space=0 我猜想,这个变化会影响系统中的所有用户。 (这是真的吗?)我怎样才能限制ASLR作为一个用户禁用自己的效果,或者仅限于我调用命令禁用的shell会话? 顺便说一句,我看到我的系统的当前(默认)设置是 sysctl -w kernel.randomize_va_space=0 为什么2而不是1或3? 我在哪里可以find有关/ proc / sys设置的数值,它们的范围和它们的含义的文档? 谢谢!

ASLR和Windows系统DLL的非感知可执行文件?

从微软的文章 : 地址空间布局随机化(ASLR) 当系统引导时,ASLR将可执行映像移动到随机位置,使得利用代码难以可预测地运行。 对于支持ASLR的组件,它所加载的所有组件也必须支持ASLR。 例如,如果A.exe使用B.dll和C.dll,则三者都必须支持ASLR。 默认情况下,Windows Vista和更高版本将随机化系统DLL和EXE ,但由ISV创build的DLL和EXE必须select使用/ DYNAMICBASE链接器选项来支持ASLR。 我不太明白。 以WIndows上的每个进程加载基本系统DLL: NtDll.dll和kernel32.dll 。 如果有一个不知道的可执行文件,这些系统DLL会使用ASLR吗? 也就是说,在Win 7上每次系统重新启动后,它们会在这个可执行文件中加载到不同的基地址,还是像Win XP一样在系统重启之后总会加载相同的基址? 为了更清楚我的意思:我典型的虚拟程序的启动堆栈如下所示: write_cons.exe!wmain() Line 8 C++ write_cons.exe!__tmainCRTStartup() Line 583 + 0x19 bytes C write_cons.exe!wmainCRTStartup() Line 403 C > kernel32.dll!_BaseProcessStart@4() + 0x23 bytes 看看BaseProcessStart的asm,我在我的XP机器上看到: _BaseProcessStart@4: 7C817054 push 0Ch 7C817056 push 7C817080h 7C81705B call __SEH_prolog (7C8024D6h) 7C817060 and dword ptr […]

微软的ASLR很奇怪

我观看了32位进程的ASLRed dll映像基地址。 这不是一个完全的随机化。 它只是随机化的1/2概率。 例如,一旦我加载一个DLL然后图像加载在0x12345678 。 我再次加载图像,图像加载在0x23456789上 (基地址被改变!) 但我再次加载图像 0×12345678 0x23456789 0×12345678 0x23456789 … 为什么他们这样执行? 是否为崩溃报告的频率?(为了获得重新部署的dll的相同崩溃地址)

Windows中的堆随机化

Windows 7具有堆随机化和堆栈随机化function。 我怎么能pipe理它? 它们如何影响我的应用程序的性能? 在哪里我可以find更多关于它是如何工作的信息? 我正在使用Visual Studio 2008来开发C ++程序。 我无法find该function的任何编译器的选项。