我想做一些关于动态生成代码的恶意黑客攻击,我希望当操作系统达到未知的操作码时,它会发送一个SIGILL给我。这将让我为我的程序添加元信息层等等。
然而,对于我的小测试程序来说,似乎操作系统没有发送SIGILL,而是发送了SIGBUS或SIGSEGV。我猜测这意味着内存所在的页面上有一个NX位被设置了。
如何让内存可执行?有什么提示吗?
以下是我的测试程序参考:
然而,对于我的小测试程序来说,似乎操作系统没有发送SIGILL,而是发送了SIGBUS或SIGSEGV。我猜测这意味着内存所在的页面上有一个NX位被设置了。
如何让内存可执行?有什么提示吗?
以下是我的测试程序参考:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
void SIGILL_handler(int sig)
{
printf("Handling SIGILL\n");
}
typedef void(*FUNC)(void);
int main()
{
signal(SIGILL, SIGILL_handler);
int *bad = malloc(16);
memset(bad, 255, 16);
((FUNC)bad)();
printf("Returning like it's no big deal\n");
return 0;
}
mmap(3)
。它可以让你在一个系统调用中分配具有适当保护位的内存,还可以避免无意中更改其他恰好位于同一页内的内存的保护位。 - Adam Rosenfieldaddr = mmap (NULL, 8, PROT_EXEC, MAP_ANONYMOUS, 0, 0); ((FUNC)addr) ();
- Diwakar Sharma0000 add [bx+si],al
表示你将取消引用一个指针,这可能会导致SIGSEGV
崩溃。要导致非法指令,您应该使用0x0F0B
填充mmap
的内存,这是Intel上的非法指令UD2。例如,在执行之前,可以使用*((unsigned char *)addr) = 0x0f; *((unsigned char *)addr+1) = 0x0b;
。 - Johannes WeissPROT_READ
。 - Johannes WeissPROT_WRITE
。所以是PROT_READ | PROT_WRITE | PROT_EXEC
。 - Johannes Weiss