ssp攻击
canary的各种利用方式中,有一种是通过 __stack_chk_fail
函数打印报错信息来实现。
__stack_chk_fail源码:
1 2 3 4 5 6 7 8 9 10 11
| 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 terminatedn", msg, __libc_argv[0] ?: "<unknown>"); }
|
据源码可见,报错信息中会打印出libc_argv[0]
的值,而libc_argv[0]
指向的则是程序名。
若我们能够栈溢出足够的长度,覆盖到__libc_argv[0]
的位置,那我们就能让程序打印出任意地址的数据,造成任意地址数据泄露。这就是ssp攻击。