原题找不到源码,这里就讲一下原理
条件:有栈溢出,最好是gets函数(栈溢出的空间比较大)
原理:当程序开启canary保护时若发生栈溢出则会调用canary_check_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] ?: "<unknown>");
}
可以发现输出了libc_arg[0]的字符串,这个字符串通常再main函数的栈里,只要找到gets函数栈与这个地址的偏移,再将libc_arg[0]改为我们所需要的内容的地址,就可以输出我们想要的内容
特殊情况:当bss段被覆盖,bss段映射到内存的时候其实映射了两份,找到另一份即可,用vmmap指令即可找到
参考文章:https://blog.csdn.net/qq_41202237/article/details/107628831