有没有办法超载"或重新实现__stack_chk_fail?

时间:2017-02-10 17:21:33

标签: c gcc buffer-overflow

我想在gcc中为我在x86 linux上运行的系统启用堆栈保护功能。

我希望如果它检测到堆栈粉碎它会调用我自己的函数来处理这个案例,或者它会调用我自己的函数__stack_chk_fail的实现,有没有办法做到这一点?

到目前为止,我尝试取消__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但是在粉碎堆栈时导致了分段错误,但也导致了分段错误。

1 个答案:

答案 0 :(得分:3)

经过一些研究后我发现我可以使用链接器标志--wrap来包装__stack_chk_fail并按照我的意愿插入我自己的hanlding。

该标记会将__stack_chk_fail的每次通话更改为__wrap___stack_chk_fail,并且每次拨打__real___stack_chk_fail__stack_chk_fail

如果我想

,我甚至可以跳过调用真实的__stack_chk_fail 下面的

是名为test.c的文件中的示例代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void __real___stack_chk_fail(void);

void __wrap___stack_chk_fail(void)
{
    printf("our test");
    __real___stack_chk_fail();
}
void func()
{
    char buffer[2];
    strcpy(buffer, "smashhhhhhhhhhhhhhhh");
}
int main(void)
{
    func();
    return 0;
}

要编译它执行:

gcc -fstack-protector-strong -c test.c
gcc -Wl,--wrap=__stack_chk_fail test.o 

输出将是&#34;我们的测试&#34;然后是__stack_chk_fail

的常规行为

更新:

另一种方法是使用标记--exclude-libs,libssp从链接过程中排除libssp并实现__stack_chk_failguard_setup(启动__stack_chk_guard值的函数)你自己的