我想在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