标签: aslr

禁用内存地址的随机化

我正在尝试调试使用大量指针的二进制文件.有时为了快速查看输出以找出错误,我打印出对象的地址及其相应的值,但是,对象地址是随机的,这违背了快速检查的目的.有没有办法临时/永久禁用它,以便每次运行程序时都得到相同的值.

哎呀.操作系统是Linux fsttcs1 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

linux memory-address aslr

31
推荐指数
3
解决办法
2万
查看次数

如何在Windows 7 x64上禁用ASLR(地址空间布局随机化)?

如何在Windows 7 x64上禁用ASLR,以便我的程序始终在同一地址加载共享CRT?

windows windows-7 aslr windows-7-x64

25
推荐指数
3
解决办法
5万
查看次数

记录在OS X上禁用ASLR的方法?

在OS X 10.9(Mavericks)上,如果通过调用并传递未记录的属性来启动进程,则可以为单个进程禁用地址空间布局随机化.像这样:posix_spawn()0x100

extern char **environ;
pid_t pid;
posix_spawnattr_t attr;

posix_spawnattr_init(&attr);
posix_spawnattr_setflags(&attr, 0x100);
posix_spawn(&pid, argv[0], NULL, &attr, argv, environ);
Run Code Online (Sandbox Code Playgroud)

(这是Apple的GDB来源的逆向工程.)

像这样的无证件功能的问题在于它们往往会在没有通知的情况下消失.根据此Stack Overflow回答,动态链接器dyld用于查询环境变量DYLD_NO_PIE,但这在10.9中不起作用; 类似地,静态链接器显然用于--no-pie选择,但现在不再是这种情况了.

那么是否有记录的方法来禁用ASLR?

(我需要禁用ASLR的原因是为了确保在测试和调试时,行为取决于对象地址的代码的可重复性,例如基于地址的哈希表和基于BIBOP的内存管理器.)

macos aslr osx-mavericks

25
推荐指数
1
解决办法
5898
查看次数

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

我想在我的系统(Ubuntu Gnu/Linux 2.6.32-41-server)上禁用地址空间布局随机化(ASLR),但是,如果我使用

sysctl -w kernel.randomize_va_space=0
Run Code Online (Sandbox Code Playgroud)

我认为,这种变化会影响系统上的所有用户.(这是真的吗?)我如何限制仅作为用户禁用ASLR对我自己的影响,或者仅限于我调用命令禁用的shell会话?

顺便说一句,我看到我系统的当前(默认)设置是

kernel.randomize_va_space = 2
Run Code Online (Sandbox Code Playgroud)

为什么2而不是1或3?在哪里可以找到有关/ proc/sys设置的数值,范围及其含义的文档?谢谢!

linux bash virtual-address-space aslr sysctl

21
推荐指数
2
解决办法
2万
查看次数

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

我正在为并行程序开发一个运行时系统,它可以利用跨多个进程的公共地址空间布局,可能分布在几千个节点上.很多时候,为此环境构建的软件在默认启用地址空间随机化的Linux系统上运行,用户可能不希望或无法在系统范围内禁用它(通过sysctl -w kernel.randomize_va_space=0等).这对并行程序施加了一些限制,并且可能损害性能.因此,我们想弄清楚如何为我们构建的二进制文件禁用它.安全性不是问题,因为该软件始终在受控环境中运行.

我发现了对各种标志和变量的引用,比如ET_EXEC,EF_AS_NO_RANDOM(显然从未合并过?)和PF_RANDOMIZE,但我找不到任何描述我可以做什么来设置这些标志的文档.一个理想的答案会告诉我什么编译器/汇编器/链接器标志将禁用生成的二进制文件的随机化,以及它工作的工具链/内核的版本.接下来最好的是在构建二进制文件后执行相同操作的工具.

由于我确信有人会提出建议,我已经知道我们可以在运行时进行此更改setarch -R,但最好将其记录在可执行文件中.

看起来paxctl -rx应该做的伎俩,但它似乎不适用于不包含PaX补丁的内核中使用的当前方法.

linux gcc heap-randomization aslr

17
推荐指数
1
解决办法
1万
查看次数

为什么 __libc_start_main 的地址在 GDB 中始终相同,即使 ASLR 已打开?

Breakpoint 1, 0x00007ffff7de8060 in __libc_start_main () from /usr/lib/libc.so.6
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/firstlove/projects/org-ioslide/example/a.out 

Breakpoint 1, 0x00007ffff7de8060 in __libc_start_main () from /usr/lib/libc.so.6
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/firstlove/projects/org-ioslide/example/a.out 

Breakpoint 1, 0x00007ffff7de8060 in __libc_start_main () from /usr/lib/libc.so.6
(gdb) Quit
(gdb) quit
A debugging session is active.

        Inferior 1 [process …
Run Code Online (Sandbox Code Playgroud)

c linux gdb libc aslr

17
推荐指数
1
解决办法
685
查看次数

ASLR是否意味着不需要改变dll?

如果我们使用ASLR,那么我认为在我们的构建期间重新设置我们的dll是没有意义的,因为当内核加载时dll会再次被重新设置?

我担心我们的应用程序经常用在终端服务机器上.因此,如果在加载时发生重新定位,我们最终可能会为每个加载的进程重新设置dll(每个会话将有一个进程).这将导致更多的内存使用和分页,而不是我们想要支付的.我需要担心吗?

我发现以下博客文章说,变基只发生一次,它是系统范围的:Matt Evans - 启用ASLR节省内存?.我没有看到任何其他关于此的引用,所以只是想确定我是否使用ASLR并且在构建期间不进行rebase我不会在终端服务盒上导致内存问题?

windows dll aslr

15
推荐指数
1
解决办法
1226
查看次数

在C++ Builder中启用安全异常处理

对于Windows 8应用程序认证,有(以及其他)这些要求:

  • 3.2必须使用/SafeSEH标志编译您的应用程序,以确保安全的异常处理
  • 3.3必须使用/NXCOMPAT标志编译您的应用程序以防止数据执行
  • 3.4您的应用必须使用/DYNAMICBASE地址空间布局随机化(ASLR)标志进行编译

我无法在C++ Builder XE中找到如何启用其中任何一个.

对于/NXCOMPAT/DYNAMICBASE,可以使用editbin.exeVS或peflags.exeCygwin.虽然我对可能的副作用更有信心,但如果有本地方式来启用这些副作用.

无论如何,我完全不知所措/SafeSEH.

delphi c++builder seh aslr windows-8

12
推荐指数
1
解决办法
1431
查看次数

如何知道dll是否使用ASLR?

如何检查某个dll是否使用ASLR?

让我们以kernel32.dll为例,它是否使用ASLR?以及如何检查其他dll ...

谢谢 ..

windows dll protection aslr

10
推荐指数
1
解决办法
7092
查看次数

强制Windows在地方加载DLL,以便内存碎片最小化

我的应用程序需要大量内存和大数据结构才能执行其工作.应用程序通常需要超过1 GB的内存,在某些情况下,我的客户确实需要使用64位版本的应用程序,因为它们有几千兆字节的内存.

在过去,我可以很容易地向用户解释,如果内存达到1.6到1.7 GB的内存使用量,那就是"内存不足"或者真的接近"内存不足"的情况,他们需要减少内存或者转到64位版本.

去年我注意到,应用程序通常在内存耗尽之前仅使用大约1 GB.经过一些调查后,似乎这个问题的原因是内存碎片化.我使用VMMAP(一个SysInternals实用程序)来查看我的应用程序的内存使用情况,看到这样的事情: 地址空间碎片

橙色区域是我的应用程序分配的内存.紫色区域是可执行代码.

正如您在图像的下半部分所看到的那样,紫色区域(它们是DLL)被加载到许多不同的地址,导致我的内存碎片化.如果我的客户没有大量数据,但如果我的客户的数据集超过1 GB,并且部分应用程序需要大块内存(例如50 MB),这不是一个真正的问题,它可能导致内存分配失败,导致我的应用程序崩溃.

我的大多数数据结构都是基于STL的,并且通常不需要大块的连续内存,但在某些情况下(例如非常大的字符串),确实需要有一个连续的内存块.不幸的是,并不总是可以更改代码,因此它不需要这样一个连续的内存块.

问题是:

  • 如何在内存中加载DLL的位置,而不在客户计算机上的所有DLL上明确使用REBASE,或者不显式加载所有DLL.
  • 有没有办法在您自己的应用程序清单文件中指定DLL的加载地址?
  • 或者有没有办法告诉Windows(通过清单文件?)不散布DLL(我认为这种散射称为ASLR).

当然,最好的解决方案是我可以在我的应用程序的清单文件中影响,因为我依赖于Windows自动/动态加载DLL.

我的应用程序是混合模式(托管+非托管)应用程序,尽管应用程序的主要部分是不受管理的.

有人建议吗?

windows dll manifest aslr

8
推荐指数
1
解决办法
2354
查看次数