问题标签 [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.
x86-64 - 地址规范形式和指针算法
在兼容 AMD64 的架构上,地址在被取消引用之前需要采用规范形式。
在 64 位模式下,如果地址位 63 到微架构实现的最高有效位被设置为全 1 或全零,则地址被认为是规范形式的。
现在,当前操作系统和体系结构上最重要的实现位是第 47 位。这给我们留下了一个 48 位的地址空间。
特别是当启用ASLR时,用户程序可以期望接收到第 47 位设置的地址。
如果使用诸如指针标记之类的优化并且使用高位来存储信息,则程序必须确保在取消引用地址之前将第 48 位到第 63 位设置回第 47 位。
但是考虑一下这段代码:
现在考虑一下intArray
,说:
0000 0000 0000 0000 0 111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1100
设置it
为intArray
并增加it
一次后,考虑sizeof(int) == 4
,将变为:
0000 0000 0000 0000 1 000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
第 47 位以粗体显示。这里发生的是指针算术检索到的第二个指针无效,因为不是规范形式。正确的地址应该是:
1111 1111 1111 1111 1 000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
程序如何处理这个问题?操作系统是否保证永远不会为您分配地址范围不随第 47 位变化的内存?
pascal - How to enable ASLR for a lazarus exe project?
executable files on windows have a .reloc
section which stores information to rebase the image. But EXE built by lazarus doesn't have that. How I enable dynamic base on a lazarus project if I really need ASLR?
c - 堆栈缓冲区溢出:在 GDB 上工作,不在 GDB 之外
很久以前,我阅读了有关 Stack 位于 Buffer Overflows 的信息,但决定设置一个虚拟机并在实践中实际看到它们。
以下代码是易受攻击的程序:
它是使用 GCC 上的-zexecstack
and-fno-stack-protector
选项编译的,以允许堆栈中的代码可执行并禁用程序内置的堆栈溢出保护(“金丝雀”值)。
gcc vuln.c -o vuln -zexecstack -fno-stack-protector -g
然后我用GDB找出name
栈上的内存位置,找到如下地址:0x7fffffffdc10
由于我的 VM 具有最新的 linux 版本,我不得不通过运行:
sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"
或sudo sysctl -w kernel.randomize_va_space=0
.
shellcode 取自我在网上找到的一篇关于 Stack Smashing 的文章,并通过 Perl 脚本提供给程序:
作为 shellcode 的前 45 个字节(应该在屏幕上写“Hax!”),一些额外的 27 个“A”字节以使指针位于正确的位置,最后是有效载荷的起始地址(小端序)。
问题是:
在 GDB 上运行程序时,通过:
我可以运行 shellcode 和“Hax!” 输出。
当试图在 GDB 之外运行程序时
我收到一个Illegal instruction (core dumped)
错误而不是“Hax!” 输出。
我一直在努力想弄清楚这种不同行为的原因是什么。显然 GDB 默认禁用 ASLR,但是我也在sysctl
内核上禁用了它。内核可以忽略kernel.randomize_va_space
变量吗?或者内存地址可能不同,即使是静态的,在 GDB 和真实进程上?或者,也许真正的进程实际上正在运行 shellcode,但是 GDB 忽略/绕过的真正进程出了问题?
关于可能是什么原因的任何想法?
c++ - Fixed base address in MSVC2015
I am attempting to debug a memory leak within my application. The leaked object is somewhat difficult to identify (before destroying the heap), and there are many similar objects created. If it were to have the same address each session, it would make it considerably easier. As such, I'm trying to disable ASLR using /FIXED
and /DYNAMICBASE:NO
in the linker properties of my executable.
However, this doesn't seem to achieve the desired result, the address is still different each time. Additionally, even the addresses for argv
in main
are different each session. Are there some additional parameters I need to set, or am I somehow misunderstanding the purpose of these flags?
python - 如何启用exe文件的ASLR
我编写了一个简单的 python 脚本(只是一个消息框)并使用 pyInstaller 使其可执行。我想使用 Powershell 脚本Invoke-ReflectivePEInjection.ps1反射性地加载该 exe 文件,但 powershell 抛出错误(PE 文件不支持 ASLR)
有没有办法从 python 脚本制作兼容 ASLR 的 exe 文件。
exploit - 面向返回的编程中的坏字符
我正在为一个易受攻击的程序编写一个 rop 链(堆栈溢出,NX 和 ASLR 已打开)。
我通过观察 gdb peda 上的堆栈指针来跟踪我的小工具的执行。它运行良好,除非遇到小工具mov[eax], edx; ret
。这个小工具被执行了,但是之后有一个push ebx
,即使我没有在我的 ROP 链中放入任何类似的小工具。最后我的利用不起作用。
我已经尝试过使用不同的寄存器来执行这条指令,但后面总是有push ebx
,我不知道为什么。
有人会有想法吗?
c - %p 到底是什么,为什么它与使用 %d 打印指针的 int 值不同?
我得到的输出是:
前两个输出的值发生变化(显然是因为 ASLR)并且 0x2 保持不变。
linux - 在 Linux 上为 ASLR 提供随机种子
有一个选项可以启用或禁用堆栈随机化,但有没有办法为 ASLR 算法提供种子以使其具有确定性?
编辑:上下文如下:一个内存错误我在 ASLR 下弹出了十分之一的执行,并且在禁用 ASLR 的情况下无法重现。为 ASLR 算法提供随机种子将极大地帮助调试过程。
c++ - 手工插装后编译 PIE
我目前正在尝试在运行时实现代码的重新随机化,以提高针对代码重用攻击的安全性。为此,我需要与位置无关的代码/可执行文件(PIC/PIE)。
我必须在生成的代码中更改的一件事是全局数据引用。使用 -fPIE 标志,它们相对于指令指针生成为 leaq,但由于我需要在运行时移动函数的位置,因此我需要将其更改为绝对寻址。我通过在汇编器输出中执行以下更改来做到这一点:
=>
这应该由编译器解决为使用绝对寻址的加载。问题是这不再是有效的 PIE 代码,并且链接器说无法执行这个特定的重定位。这是我收到的错误消息:
当我使用 -fPIC 标志(用于共享对象 - 我确实想创建一个独立的可执行文件)时,我的检测代码被转换回它的原始形式。
有谁知道我如何在保持位置独立可执行的同时实现全局数据引用的绝对寻址?
所有编译器调用和步骤是: