问题标签 [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.

0 投票
1 回答
2296 浏览

security - 运行 windows shell 命令 NASM X86 汇编语言

我正在编写一个简单的汇编程序,它将只执行 Windows 命令。我将在下面附上当前的工作代码。如果我硬编码 WinExec 的基地址(来自 Kernel32.dll 的函数),该代码就可以工作,我使用另一个名为 Arwin 的程序来定位该地址。但是,由于 Windows 内存保护地址空间布局随机化 (ASLR),重新启动会破坏这一点

我要做的是找到一种方法来执行 Windows shell 命令,而不必将内存地址硬编码到我的代码中,该地址将在下次重新启动时更改。我发现了类似的代码,但没有任何我理解或符合目的的代码。我知道这可以用 C 编写,但我专门使用汇编程序来保持大小尽可能小。

感谢您的建议/帮助。

0 投票
2 回答
1042 浏览

c - 如果全局变量的地址在 ELF 中被硬编码,它们如何随机化?

我在一些地方读到,ASLR 应该.data在每次运行程序时在随机地址加载该部分,这意味着全局变量的地址应该不同。但是,如果我有以下代码:

我用 编译它gcc -fpie -o global global.cobjdump -d -M intel显示以下内容:

看起来它global_var总是被放置在 601038。事实上,如果我用调试符号编译,global_var's DIE 的地址是硬编码的:

在这些情况下,ASLR 是如何工作的?

0 投票
1 回答
372 浏览

c - OS X Yosemite 上的堆栈粉碎?

我无法弄清楚如何在 OS X 10.10.5 (Yosemite) 上禁用堆栈保护。我一直在拼凑来自各种在线线程的有希望的 gcc 标志,但到目前为止还没有设法禁用保护。我目前正在编译我的程序:

但是当我尝试粉碎堆栈时,我会出现段错误。

我在 Red Hat Enterprise Linux Server 7.2 (Maipo) 上尝试过相同的程序,在适当调整内存地址差异后,在编译后粉碎堆栈没有问题:

还可能值得注意的是,与大多数 Mac 一样,我机器上的 gcc 是 clang 的符号链接(Apple LLVM 版本 7.0.0 (clang-700.0.72))。

如何禁用 Yosemite 的堆栈保护?


额外细节

我正在使用的虚拟程序是:

当我运行时otool -tv program,我注意到以下内容:

success我要跳转到的例程在 address 0x00001e70

我们通常会返回的指令authenticate位于 address 0x00001efe

当我gdb在输入虚拟密码“xxxxxxxxxx”并使用 检查缓冲区后运行时x/30xb &password,我观察到:

我们想将第 270xfe个字节覆盖为0x70.

当我尝试按如下方式粉碎堆栈时:

我得到一个段错误。

0 投票
0 回答
1581 浏览

c - 如何在 Linux 上禁用 ASLR,使堆栈指针的初始值每次都相同?

我一直在为故意易受攻击的(我写的)编写基于堆的缓冲区溢出漏洞利用。为了劫持控制流,我在堆栈上覆盖了函数的返回地址。

这些漏洞利用取决于堆栈位于特定(硬编码)位置。

我认为这没问题,因为我禁用了 ASLR(我正在运行 Ubuntu 14.04,x86_64):

我通过添加并重新启动机器kernel.randomize_va_space = 0来禁用 ASLR 。/etc/sysctl.conf我已通过以下命令确认已禁用 ASLR:

但是 main 开始时堆栈的地址明显改变。为了测试这一点,我在 gdb 中加载了程序并在第一条 asm 指令上中断并执行了以下操作:

然后我重新启动并做了同样的事情

这种行为是预期的吗?我可以禁用它以使特定的二进制文件始终具有相同的堆栈地址吗?如果不是真正的漏洞利用需要泄漏堆栈的地址来做到这一点?有没有一种通用的技术?

0 投票
1 回答
475 浏览

linux - Linux ASLR 究竟如何随机化堆栈位置

我使用的是 32 位 x86 Ubuntu 桌面。我查看了 /proc/[pid]/mmaps,发现堆栈基地址总是在变化(例如,在以下情况下为 0xbfe76000)。所以我猜内核(或 ELF 加载器)必须在每次进程启动时随机化堆栈位置。

我想知道堆栈基地址随机化的确切代码(在内核或 ELF 加载器中)是什么/在哪里。因为我想在 0xC0000000 正下方分配(例如通过 mmap)几页,我只是不确定堆栈是否有可能位于,比如 0xbffff000。谢谢!

0 投票
2 回答
2753 浏览

c++ - 如何获取另一个进程的基地址?(ASLR)

我需要获取 .exe 的基地址地址,该地址每次启动时都有一个随机基地址。我试过这个,但它似乎不起作用:

怎么了?

0 投票
1 回答
110 浏览

windows - 为什么堆栈的“逻辑底部”和“物理底部”的偏移量是随机的?

我用windbg在我的Windows 10机器上运行一个程序,让它在初始断点处中断。我取堆栈物理底部的地址(TEB 的 stackBase),然后减去rsp. ntdll!LdrInitializeThunk我只是在同一个程序上做了 5 次,得到了 5 个不同的值:

如果你对ntdll!RtlUserThreadStart等做同样的事情,你会得到类似的结果。这表明堆栈的“逻辑底部”有些随机化。这是为什么?这是堆栈内部的某种“迷你ASLR”吗?这在任何地方都有记录吗?

0 投票
1 回答
14528 浏览

compilation - ELF、PIE ASLR 以及介于两者之间的所有内容,特别是在 Linux 中

在问我的问题之前,我想介绍一些我想确保我得到正确的技术细节:

  • 与位置无关的可执行文件 (PIE) 是一个无论加载到哪个内存地址都能够执行的程序,对吧?

  • ASLR(地址空间布局随机化)几乎指出,为了保持地址静态,我们会以某种方式随机化它们,

我已经读过,特别是在基于 Linux 和 Unix 的系统中,实现 ASLR 是可能的,无论我们的代码是否是 PIE,如果它是 PIE,所有跳转、调用和偏移都是相对的,因此我们没有问题。如果不是,无论代码是可执行文件还是共享对象,代码都会以某种方式被修改并编辑地址。

现在这让我问几个问题

  1. 如果 ASLR 可以在不是 PIE 并且是可执行文件且不是共享/可重定位对象的代码中实现(我知道重定位如何在可重定位对象中工作!!!!),它是如何完成的?ELF 格式不应该包含任何部分来说明代码部分中函数的位置,以便内核加载程序可以修改它,对吗?ASLR 应该是一个内核功能,例如,一个包含例如这些指令的可执行文件。

    伪代码:

    如果它们没有存储在 ELF 文件中的某个可重定位表中并且不是相对的以便将可执行文件加载到某个随机地址中,那么内核可执行加载程序如何知道如何更改地址?

  2. 假设我错了,为了实现 ASLR,你必须有一个 PIE 可执行文件。所有段都是相对的。如何编译 C++ OOP 代码并使其工作,例如,如果我有一个类的某个实例使用指向其结构中的虚拟表的指针,并且该虚拟表应该保存绝对地址,因此我不会能够为使用运行时虚拟表的 C++ 程序编译纯 PIE,并且 ASLR 再次是不可能的......我怀疑虚拟表将包含相对地址,并且每次调用都会有一个不同的虚拟表一些虚函数...

  3. 我最后一个也是最不重要的问题是关于 ELF 和 PIE - 是否有一些特殊的方法来检测 ELF 可执行文件是 PIE?我熟悉 ELF 格式,所以我怀疑有没有办法,但我可能错了。无论如何,如果没有办法,内核加载程序如何知道我们的可执行文件是否是 PIE,因此它可以在其上使用 ASLR。

我把这一切都搞砸了,如果有人能在这里帮助我,我会很高兴的。

0 投票
1 回答
1394 浏览

c - Why does ASLR not seem to be working

I checked if ASLR is enabled as follows and I think it is:

I tried testing it with the following program:

test.c:

I expected, if ASLR is active, to a different address for each run, right? But I got the same each time. I tested both for 64bit and 32bit executables. I am using a 64bit Arch Linux system to test this:

As you can see, the address is the same for every run. Doesn't this mean that ASLR is off?

0 投票
1 回答
252 浏览

c - 以下代码是否禁用 ASLR?

我在练习中遇到了这段代码。根据我的估计,这应该在子进程上禁用 ASLR。但是,我使用 LD_PRELOAD 在 printf 上休眠二进制文件,并在此时附加 gdb。在这一点上,我注意到 ASLR 似乎已启用,基于堆栈地址的变化。Aslr 肯定是在父进程中启用的。

是否应该在子进程上禁用 ASLR?阻止 ASLR 在分叉子项中被禁用的代码有什么问题?