gpt4 book ai didi

c - 如何强制将 SIGILL 发送到我的程序?

转载 作者:IT王子 更新时间:2023-10-29 01:10:36 26 4
gpt4 key购买 nike

我试图用动态生成的代码做一些讨厌的骇人听闻的事情,我希望操作系统在遇到未知操作码时向我发送一个 SIGILL。这会让我添加一层关于我的程序的元信息等等。

但是,对于我的小测试程序,操作系统似乎没有发送 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;
}

最佳答案

mprotect是你的 friend 。它与 POSIX 兼容(SVr4,POSIX.1-2001),因此它应该在 OS X 和 Linux 下工作。

int pagesize = sysconf(_SC_PAGE_SIZE);
if (pagesize == -1) {
perror("sysconf");
exit(1);
}

/* allocate 16 aligned pages */
void *bad = memalign(pagesize, 16 * pagesize);
if (NULL == bad) {
fprintf("aah, out of mem :-(\n");
exit(1);
}

if (-1 == mprotect(bad, 16 * pagesize, PROT_READ | PROT_WRITE | PROT_EXEC)) {
perror("mprotect");
exit(1);
}

应该这样做。

第二次编辑:memalign 的兼容性似乎没那么容易。我会在 OS X 和 Linux 下尝试 memalignvalloc,如果都不起作用,只需使用常规 malloc 并向返回的指针添加足够的字节这样它就对齐了:-)。

关于c - 如何强制将 SIGILL 发送到我的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9314270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com