Skip to content

Canary bypass

solei1 edited this page Apr 28, 2018 · 1 revision

Canary绕过技巧

Canary保护机制的原理,是在一个函数入口处从fs段内获取一个随机值,存到EBP - 0x4(32位)或RBP - 0x8(64位)的位置。如果攻击者利用栈溢出修改到了这个值,导致该值与存入的值不一致,__stack_chk_fail函数将抛出异常并退出程序。Canary最高字节一般是\x00,防止由于其他漏洞产生的Canary泄露。

0x01 泄露Canary


fork

2017 NJCTF QUALS pwn messager

由于每一次fork的进程内存布局与父进程一致,Canary值也相同,因此可以通过逐字节爆破,泄露Canary

其他

由于栈布局缓冲区与Canary相邻,导致泄露。如果存在\x00,可通过逐字节泄露。

0x02 修改Canary


多线程

2018 STARTCTF QUALS pwn babystack

由于多线程中Canary存入TLS结构体,而TLS位于多线程内部栈的高地址,并且该结构体与当前栈差距不足一个page,导致我们能对其进行修改,改为我们想要的值,从而绕过检测。

reference

0x03 绕过Canary


格式化字符串

可以栈地址任意读写,不必连续向栈上写,因此不会触发Canary检查。

其他

在栈缓冲区可以直接完成漏洞利用,同样也不会触发Canary检查。

来自:https://github.com/pinohans/blog/tree/bb71cceb2a6b2db68d6266685e938d14e43c5925/Pwn

Clone this wiki locally