我想在gcc中为我在x86 linux上运行的系统构建一个系统启用堆栈保护功能。有没有办法“超载”或重新实现__stack_chk_fail?
我想,如果它检测到堆栈溢出会打电话给我自己的功能,将处理的情况下,否则会叫我自己实现的功能__stack_chk_fail
的,是有办法做到这一点?
到目前为止,我试图undef __stack_chk_fail
和__stack_chk_guard
,然后自己定义它们,但它没有工作,并在尝试利用缓冲区溢出时导致分段错误。 这里是什么,我做了一个例子:
#undef __stack_chk_guard
#undef __stack_chk_fail
uintptr_t __stack_chk_guard = 0xdeadbeef;
void __stack_chk_fail(void)
{
printf("Stack smashing detected");
}
void foo(void)
{
char buffer[2];
strcpy(buffer, "hello, I am smashing your stack!");
}
我也使用LD_PRELOAD
尝试,但那个砸堆栈时造成分段错误,但它也造成了分段故障。
C(即在启动
__stack_chk_guard
值函数)不支持重载,它是一种不同的语言比C++。不要垃圾标签。 – Olaf@Olaf我知道C不支持方法重载,但我不为有更好的名字什么,我试图做 – omer12433
因此,当你决定使用C,我仍然不知道为什么你使用的C++代码了。无论如何,我的评论都适用。回答你的问题:你的意思是“undef ...”,你不能“取消”一个变量或函数。这不是一个宏观。关于段错误:您调用未定义的行为并且您的代码行为未定义。我会说一切按预期工作,任务完成,没问题。 – Olaf