# Canary绕过技巧 `Canary`保护机制的原理,是在一个函数入口处从fs段内获取一个随机值,存到`EBP - 0x4`(32位)或`RBP - 0x8`(64位)的位置。如果攻击者利用栈溢出修改到了这个值,导致该值与存入的值不一致,`__stack_chk_fail`函数将抛出异常并退出程序。`Canary`最高字节一般是`\x00`,防止由于其他漏洞产生的`Canary`泄露。 ## 0x01 泄露Canary --- ### fork > [2017 NJCTF QUALS pwn messager](../CTF-WP/2017-njctf-quals.md) 由于每一次`fork`的进程内存布局与父进程一致,`Canary`值也相同,因此可以通过逐字节爆破,泄露`Canary`。 ### 其他 由于栈布局缓冲区与`Canary`相邻,导致泄露。如果存在`\x00`,可通过逐字节泄露。 ## 0x02 修改Canary --- ### 多线程 > [2018 STARTCTF QUALS pwn babystack](../CTF-WP/2018-starctf-quals.md) 由于多线程中Canary存入`TLS`结构体,而`TLS`位于多线程内部栈的高地址,并且该结构体与当前栈差距不足一个`page`,导致我们能对其进行修改,改为我们想要的值,从而绕过检测。 #### reference - [New bypass and protection techniques for ASLR on Linux](http://www.openwall.com/lists/oss-security/2018/02/27/5) ## 0x03 绕过Canary --- ### 格式化字符串 可以栈地址任意读写,不必连续向栈上写,因此不会触发`Canary`检查。 ### 其他 在栈缓冲区可以直接完成漏洞利用,同样也不会触发`Canary`检查。 来自:https://github.com/pinohans/blog/tree/bb71cceb2a6b2db68d6266685e938d14e43c5925/Pwn