原题找不到源码,这里就讲一下原理

条件:有栈溢出,最好是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指令即可找到