程序开启了Canary 保护 ,如果读取的buffer覆盖了相应的canary值 就会报错 ,调用
__stack_chk_fail 来打印错误 ,我们不关心这报错 ,但是我们可以利用这个函数来打印我们想输出的内容
void __attribute__ ((noreturn)) __stack_chk_fail (void)
{
__fortify_fail ("stack smashing detected");
}
void __attribute__ ((noreturn)) internal_function __fortify_fail (const char *msg)
{
/* The loop is added only to keep gcc happy. */
while (1)
__libc_message (2, "*** %s ***: %s terminated\n",
msg, __libc_argv[0] ?: "");
}
__stack_chk_fail函数会打印argv[0]指针所指向的地址,所以我们只要把argv[0]覆盖成我们想输出的字符串的地址就可以打印出来了