我正在运行 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
,它本身是从编译成二进制文件的堆栈保护器代码中调用的。