我正在阅读关于DLL注入技术的内容,我记住了这个问题.
让我们假设我们想要将一个DLL注入Windows 7中的目标进程,该进程为kernel32.dll启用了ASLR
因此,任何一段注入的代码都不能使用任何winapi或任何系统调用,因为地址让我们说在注入器代码中的loadLibrary函数将与目标进程中的地址loadLibrary不同,不是吗?
所以这样的召唤CreateRemoteThread不起作用:
CreateRemoteThread(hProcess,
NULL,
0,
(LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32,
"LoadLibraryA" ),
pLibRemote,
0,
NULL );
::WaitForSingleObject( hThread, INFINITE );
Run Code Online (Sandbox Code Playgroud)
如果我在这个推理中错了,请纠正我.
如何启用可执行文件的地址空间布局随机化?
注意:我没有使用 Visual Studio 或任何提供/dynamicbase编译器选项的编译器。
出于本次讨论的目的,假设我正在向编译器添加功能以启用 ASLR。
我已经知道如何设置其他 Windows 可执行映像选项。例如,然后IMAGE_FILE_NET_RUN_FROM_SWAP标记。您在 PE 二进制标头中设置 PE 选项:
LOADED_IMAGE li;
MapAndLoad(fileName), null, li, false, false)
LI.FileHeader.FileHeader.Characteristics |= IMAGE_FILE_NET_RUN_FROM_SWAP;
UnMapAndLoad(li)
Run Code Online (Sandbox Code Playgroud)
如何启用地址空间布局随机化?它是PE标志吗?它是组装清单条目吗?
我如何选择一个可执行文件进入 NX(不执行)?
我有这个结构:
struct Books {
char title[50];
char author[50];
};
Run Code Online (Sandbox Code Playgroud)
让我说我知道如果我传递arg1给程序,在代码的某些部分,它会在方向上添加一些字符$title+52,因此author值被覆盖(缓冲区溢出).
现在我将ASLR添加到我的二进制文件中.通过这种方式,一些方向是随机的,所以我认为我之前描述的缓冲区溢出是不可能的.
这是真的?或者即使我添加ASLR,结构成员的方向也在一起,缓冲区溢出是可能的吗?
我检查了ASLR是否启用如下,我认为它是:
[user@localhost test]$ cat /proc/sys/kernel/randomize_va_space
2
Run Code Online (Sandbox Code Playgroud)
我试过用以下程序测试它:
test.c:
#include <stdio.h>
int main(void)
{
printf("%p\n", main);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
如果ASLR处于活动状态,我希望每次运行都能使用不同的地址,对吧?但我每次都得到同样的东西.我测试了64位和32位可执行文件.我正在使用64位Arch Linux系统来测试这个:
[user@localhost test]$ gcc test.c -o test
[user@localhost test]$ ./test
0x4004c6
[user@localhost test]$ ./test
0x4004c6
[user@localhost test]$ ./test
0x4004c6
[user@localhost test]$ ./test
0x4004c6
[user@localhost test]$ gcc -m32 test.c -o test
[user@localhost test]$ ./test
0x80483eb
[user@localhost test]$ ./test
0x80483eb
[user@localhost test]$ ./test
0x80483eb
[user@localhost test]$ ./test
0x80483eb
Run Code Online (Sandbox Code Playgroud)
如您所见,每次运行的地址都相同.这不是说ASLR关闭了吗?
我在几个预编译头文件和地址空间布局随机化不兼容的网站上阅读它.是什么让他们不相容?修复它需要什么?
我的问题是操作系统独立我听说这是linux上的grsecurity和更新的Windows版本的问题.(而且我不知道ASLR还有什么.)