问题标签 [aslr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何强制操作系统(Windows)为每个调试会话为我的程序分配相同的地址?
经过长时间的调试,我发现我的应用程序可能将错误的值写入地址 0x5b81730。我想知道我的代码的哪一部分是这样做的。
前段时间,当我使用 Windows XP 时,这将非常容易。我会在调试器(MS Visual Studio 2005)中重新启动我的应用程序,在该地址设置一个数据断点,然后调试器会指向我有问题的代码。
现在,在我切换到 Windows 7 之后,这似乎是不可能的(或者至少非常困难)。当我运行我的应用程序时,我发现每次堆中同一对象的地址都略有不同(例如,一次运行为 0x53b71b4,而另一次运行为 0x55471b4)。
我听说 Windows 7 有ASLR,这可能是我看到这些地址变化的原因。
那么我该怎么做才能继续使用我的调试技术呢?
我应该关闭 ASLR 吗?(我相信这是可能的,但不知道怎么做)
还是我的问题是由其他原因而不是 ASLR 引起的?
还是我应该忘记使用数据断点的便利,而使用其他一些技术?
linux - ASLR 受 Linux 上可用熵的影响?
在内核源代码中提到random.c
它get_random_int
“类似于 urandom,但目标是最小化熵池耗尽”。但是,在哪里(以及如何)get_random_int
与熵池交互?
现在,urandom
实际上调用extract_entropy_user
了,但我在get_random_int
. 似乎get_random_int
使用了自己的熵源(与键盘、鼠标和磁盘活动无关):
并且不关心(也不更新)一般系统可用的熵状态?
如何get_random_int
耗尽熵池?这是在哪里更新的?我知道我遗漏了一些东西或错误地阅读了源代码,因为当我执行一个程序时,我可以通过在 entropy_avail 上执行 cat 来查看它是如何耗尽熵池的。
我浏览了http://xorl.wordpress.com/2011/01/16/linux-kernel-aslr-implementation/但似乎没有提到这是如何工作的。
ios - 如何在不禁用 ASLR 的情况下计算应用程序在内存中的位置?
所以我正在做一个越狱调整,它在启动时连接到一个特定的应用程序,以允许用户为应用程序使用游戏中的模块,但到目前为止,我能让它工作的唯一方法是使用禁用 ASLR 的应用程序。由于法律规定我无法发布禁用 ASLR 的应用程序版本,因此我想看看在不禁用 ASLR 的情况下计算应用程序内存位置的方法。我以前看过它,只是想知道是否有人知道如何重新创建它。
security - 缓冲区大小和 ASLR 蛮力的机会
增加缓冲区大小如何增加 ASLR 暴力破解成功的机会?
这与我最近做的一个项目有关。我们有一个exploit_1.c 程序,它有一个缓冲区/字符数组(最初大小为517)。使用 memset 将缓冲区设置为 NOP。然后我们将 shellcode 和返回地址放入缓冲区,然后将其写入一个名为 badfile 的文件。该程序采用了一个参数,即返回地址。我们有一个 stack.c 程序,它在一个名为 bof 的函数中将坏文件的内容复制到大小为 12 的缓冲区中。
我读过一种方法是在 NOP sled 的末尾放置一个跳转并将其重定向到 shellcode。但是,shellcode 是 24 个字节,并且在返回地址之前最多只有 16 个字节。所以我所做的就是将 shellcode 放在缓冲区的末尾。
我们得到的第三个任务是选择返回地址,以便利用程序(当然针对缓冲区大小进行了修改)在缓冲区大小为 1000、10000 和 100000 时具有更高的平均成功机会。我们使用了带有计数器的 bash while 循环计算 ASLR 蛮力尝试了多少次。
所以我在想的是,随着内存的增加,NOP 雪橇显然会更长。但必须有更多的东西。
我选择的地址是:0xbf87f030 0xbf82e3d0 0xbfe0fb60
c - ASLR蛮力
我刚刚阅读了有关地址空间布局随机化的内容,并尝试了一个非常简单的脚本来尝试暴力破解它。这是我用来测试一些东西的程序。
我用这个命令编译它:
我确保启用了 ASLR:
然后,我想出了这个简单的脚本:
格式是
运行此脚本几秒钟后,它会以我想要的错误代码 1 退出。我还尝试了其他调用 execv("/bin/sh", ...) 的 shellcode,我也成功了。
我觉得很奇怪,即使在返回地址之后也可以创建这么长的 NOP 幻灯片。我认为 ASLR 更有效,我错过了什么吗?是不是因为地址空间太小了?
编辑:我做了一些额外的研究,这是我发现的:
我请朋友在他的 64b 计算机上运行此代码
-m32 -z execstack
,稍微更改返回地址后,他得到了相同的结果。即使我没有使用
-z execstack
,我还是设法执行了 shellcode。我通过使用不同的 shellcode 来确保这一点,这些 shellcode 都做了他们应该做的事情(即使是众所周知的场景chown root ./vul
,,然后chmod +s ./vul
运行的 shellcode,最后在生成的 shell 中返回“root”)。这很奇怪,因为告诉我可执行堆栈标志位未设置。有谁知道为什么?setreuid(0, 0)
execv("/bin/sh", ...)
whoami
execstack -q ./vul
c++ - C++ 类的内存布局是否会受到地址空间布局随机化的影响
考虑以下 C++ 类:
我使用的编译器创建此类的表示形式,即内存中成员的顺序与我在类定义中使用的顺序相同。我最近遇到了一个程序,利用这个事实来初始化成员。我知道这是一个非常糟糕的主意,因为布局取决于编译器,但我没有编写代码并且它到目前为止工作。
我想知道ASLR
现代操作系统中的功能是否会搞砸这一切。我很确定如果对象在heap
. 但是其他情况呢?
ios - 如何在 iOS 上使用 gdb 以及 ASLR 打破 dylib 的构造函数?
场景:
我试图对移动基板 dylib 进行逆向工程。通过 IDA,dylib 在构造函数中调用了 MSHookFunction(),参数来自 dlopen 和 dlsym。IDA 未能显示 dlopen 和 dlsym 的符号,所以我不得不求助于 gdb,它可能会在运行时打印 dlsym 的第二个参数,一个 char*。
目标:
用 gdb 在这个 dylib 的构造函数的最开始处中断。
第一个想法:
dylib 的构造函数在加载后立即执行,进行所有必要的初始化(如果我错了,请纠正我)。所以我写了一个命令行工具,它简单地 dlopen dylib 然后 dlclose 它,以运行构造函数。仅供参考,这是 dylib 和命令行工具的代码:
你可以猜到,一旦我运行 iOSTestTool,它就会打印:
- snakeninny:命令行工具的第 6 行
- snakeninny:dylib 的 ctor
- snakeninny:命令行工具的第 8 行
然后在 iOSTestDylib.dylib 中设置一个断点似乎可以解决问题。但是突然发现,在dlopen iOSTestDylib.dylib之前,iOSTestDylib.dylib的ASLR偏移是未知的,所以bp的地址是不确定的。同时,在dlopen之后,虽然我们可以计算出ASLR偏移量,但是ctor已经被执行了,所以bp变得毫无意义。在任何一种情况下,我都无法打破 dylib 的构造函数。任务失败了,我也没有再想,也没有B计划:(
问题:
我应该怎么做才能达到我的目标?
linux - 在启用 NX (DEP) 和 ASLR 的 x86-64 上利用基于字符串的溢出
考虑以下易受攻击的代码/程序:
在 IA-32(x86,32 位)上运行 Linux 并启用 NX 和 ASLR,我将使用 GOT 覆盖技术利用这一点,该技术主要包括以下步骤:
- 溢出缓冲区直到 RIP
- 用地址覆盖 RIP
strcpy@plt
- 使用一个干净的小工具
.text
,例如pop edi ; pop ebp ; ret
,作为返回地址strcpy
- 写参数
strcpy
:&bss
-address 作为目的地和一个字节的/bin/sh
using.text
- 重复步骤 2-4 直到
/bin/sh
完全写入&bss
strcpy
用 with覆盖 GOT 条目system
(使用偏移量,需要了解使用的 Libc 版本 - 让我们在这里忽略它)- 写入
strcpy@plt
堆栈,然后是一些 4 字节的块,最后是&bss
指向的地址/bin/sh
- 利润
我想在 x86-64 上利用相同的缓解措施来利用它。但这比想象的要困难得多。主要有以下几个原因:
- x86-64 基于寄存器的调用约定:函数参数使用寄存器而不是堆栈传递。因此,需要一些额外的 ROP-gadgets 将参数从堆栈传输到适当的寄存器。这是一个小问题,但也受以下问题的影响:
64 位返回地址:x86-64 中的 RIP 指向的地址
/li>.text
甚至不是 32 位长。因此,必须将 NULL 字节写入堆栈以链接函数调用。strcpy
基本上,使用链式调用并利用strcpy
始终写入的 NULL 终止字符,可以根据需要写入尽可能多的 NULL 字节。strcpy
但是通过只覆盖 RIP 的最低有效字节可能只调用一次。
这些是我在启用 NX 和 ASLR 的 x86-64 上利用该程序时遇到的主要问题。有什么技术可以解决这些问题吗?或者 x86-64 真的能阻止一个有效的、打开 shell 的漏洞利用吗?
c - 如何在 OS X 上获得另一个进程的 ASLR 幻灯片?
是否可以在 OS X 上获得正在运行的进程的 ASLR 幻灯片?
我不想以某种方式禁用 ASLR(例如 like gdb
),而是获得偏移量。
例子:
多次运行 test 将确认test()
每次运行确实有不同的地址:
注意:查找幻灯片的方法不应该搜索进程的内存或以其他方式检查它,因为我需要一个适用于所有可执行文件的便携式解决方案。
windows - 现代 Windows 中的 ASLR 和 NX 位?
当攻击者在 x86-64 上获得对 Windows 指令指针的控制权时,如何关闭 NX 位保护,同时受到 NX 位和 ASLR 的保护?我假设禁用此功能的系统调用只是在非ASLRed地址,可以直接调用吗?
似乎堆喷射经常用于利用现代 Windows 机器(例如,在 Javascript 实现中存在错误),显然这需要一个可执行堆,那么在堆喷射之前如何使堆可执行?是否有一些论文清楚地表明了这是如何在 Windows 上完成的?