-
Notifications
You must be signed in to change notification settings - Fork 7
Canary bypass
solei1 edited this page Apr 28, 2018
·
1 revision
Canary
保护机制的原理,是在一个函数入口处从fs段内获取一个随机值,存到EBP - 0x4
(32位)或RBP - 0x8
(64位)的位置。如果攻击者利用栈溢出修改到了这个值,导致该值与存入的值不一致,__stack_chk_fail
函数将抛出异常并退出程序。Canary
最高字节一般是\x00
,防止由于其他漏洞产生的Canary
泄露。
由于每一次fork
的进程内存布局与父进程一致,Canary
值也相同,因此可以通过逐字节爆破,泄露Canary
。
由于栈布局缓冲区与Canary
相邻,导致泄露。如果存在\x00
,可通过逐字节泄露。
由于多线程中Canary存入TLS
结构体,而TLS
位于多线程内部栈的高地址,并且该结构体与当前栈差距不足一个page
,导致我们能对其进行修改,改为我们想要的值,从而绕过检测。
可以栈地址任意读写,不必连续向栈上写,因此不会触发Canary
检查。
在栈缓冲区可以直接完成漏洞利用,同样也不会触发Canary
检查。
来自:https://github.com/pinohans/blog/tree/bb71cceb2a6b2db68d6266685e938d14e43c5925/Pwn