Stack_Canaries
Stack_Canaries
canary的地址是栈上的一个随机数,在程序启动时随机生成并保存在比函数的返回地址更低的位置,由于栈溢出从低地址向高地址覆盖,因此攻击者想要控制函数的返回指针就必须先覆盖canary。程序在函数结束前查看canary的值是否发生改变就可以达到保护栈的目的
常见的Canary:
1.terminator
许多栈溢出都是由于字符串操作使用不当产生的,这些字符串以NULL“\x00”结尾,换个角度想是会被”\x00“截断。基于这一点,terminator canaries将低位设置为“\x00”,既可以防止被泄露,也可以防止被伪造。截断字符还有CR(0x0d),LF(0x0a),EOF(0xff)
1 |
|
2.random
为了防止canary被攻击者猜到,random canary通常在程序初始化时随机生成,并保存在一个相对安全的地方。当然如果攻击者知道它的位置也是可以泄露的。随机数通常由/dev/urandom生成,有时也用当前时间的哈希值。
3.random XOR
和random canary类似,但是多了一个XOR操作。无论是canary被修改还是XOR的控制数据被篡改,都会发生错误,这就增加了攻击的难度。
常见的canary操作示范
1 |
|
在Linux中fs段通常用于存放线程局部存储( Thread Local Storage,TLS ),其主要作用是为了避免多个线程同时访问同一全局变量或静态变量所导致的冲突,尤其是多个线程需要同时修改这一变量时。
TLS
Stack_Canaries
http://example.com/Stack_Canaries/