Canary保护相关
对抗canary保护技术
- 泄露canary值
直接泄露栈上canary
利用输出函数,不输入’\x00’,让canary的值被打印出来
栈溢出时在覆盖时把canary覆盖成它本身的值泄露fs:28内的值
假设有任意读的功能的函数,则去读取fs:28h地址的值(验证值)
当我们已经泄露libc基址时即可以算出该地址位置,且每次程序执行该地址与libc基址偏移固定不变
(程序开始时会把fs:28的值保存在栈上作为canary,程序结束时会把canary的值和fs:28h比较,不一样则调用__stack_chk_fail,一样则正常返回)
【补图】
覆写副本值
如果有任意写的能力可以考虑把fs:28h的值覆写掉劫持stack_chk_fail
可以修改全局偏移表(GOT)中存储的__stack_chk_fail函数地址(如通过格式化字符串),便可以在触发canary检查失败时,跳转到指定的地址继续执行。
- stack smashing
- 当canary被覆盖之后,会call到__stack_chk_fail打印argv[0]这个指针指向的字符串,默认argv[0]是程序的名字
- 如果我们把它覆盖成其他的地址时,它就会把其他内存地址的信息给打印出来
于是可以通过这个机制泄露相应内容(观察栈的结构查看该指针的位置并计算偏移)
【补图】
- 逐字节爆破
逐字节覆盖canary,正常执行则说明正确
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 aYoung's Blog!
评论



