禁用***检测到堆栈粉碎***:终止

禁用***检测到堆栈粉碎***:终止

我正在运行 Ubuntu 18.04 和一个简单的程序,例如:

#include <stdio.h>

int main(int ac, char *av[ac+1], char **env) {
    char arr[8];

    printf("0x%x\n", av);
    scanf("%s", arr);
    return 0;
}

当受到缓冲区溢出攻击时终止,并显示消息:

*** stack smashing detected ***: <unknown> terminated

在以前版本的 Ubuntu(或 Linux?我不知道发生了什么变化)中,它会打印出类似以下内容:

*** stack smashing detected ***: ./a.out terminated

我可以恢复它吗?发生了什么变化?

答案1

我没有运行 ubuntu,但我认为这在较新版本的 glibc 中是不可能的。看到这个犯罪

当然,缺少编写自己的堆栈粉碎检测器。

你可以看看来源打印该消息的函数:

void
__attribute__ ((noreturn))
__fortify_fail_abort (_Bool need_backtrace, const char *msg)
{
  /* The loop is added only to keep gcc happy.  Don't pass down
     __libc_argv[0] if we aren't doing backtrace since __libc_argv[0]
     may point to the corrupted stack.  */
  while (1)
    __libc_message (need_backtrace ? (do_abort | do_backtrace) : do_abort,
            "*** %s ***: %s terminated\n",
            msg,
            (need_backtrace && __libc_argv[0] != NULL
             ? __libc_argv[0] : "<unknown>"));
}

need_backtrace = False该函数将从__stack_chk_fail,它本身是从编译成二进制文件的堆栈保护器代码中调用的。

相关内容