canary的绕过方法
本文最后更新于 2024年10月13日 晚上
Canary 的绕过方法
一、字符串截断获取canary
原理:
- Canary设计其低字节为
\x00,本意是阻止被read、write等函数直接将Canary读出来。通过栈溢出将低位的\x00覆写,就可以读出Canary的值。
二话不说,上题
基础检查发现canary
丢入ida中
发现在循环printf,并且存在字符串漏洞(这个稍后再谈)
同时有getshell函数
可以直接拿shell
接下来就是找canary到栈顶的偏移
有两种方法,这里先介绍第一种
看汇编语言
跟进这段函数的汇编
发现 多了一段异或比较
可以判断canary在var_c里,
所以buf 到canary的偏移为0x70-0xc
payload1的构造为
1 | |
#注意 必须用sendline 发送 用\n来覆盖’\x00’
发送之后接受字符
1 | |
最后构造payload2
1 | |
最终exp为
1 | |
最后强调一下
1 | |
这两行必须要有一个,否则无法运行
最后运行得到shell
编辑**二、字符串漏洞泄露canary**
原理
- 格式化字符串漏洞可以打印出栈中的内容,因此利用此漏洞可以打印出canary的值,从而进行栈溢出
还是上面那道题
这次来介绍一下另一种寻找偏移的办法
用gdb 调试
先用gdb在printf处下断点
找到第一个printf下的栈帧0xffffcf98
从ida上知道程序主要在vuln 函数里面
用gdb 运行文件并在函数下断点运行
发现有一段异或比较,可以判断canary 的值就在eax里面
不断步入到0x8049256
记住eax的值
发现canary存在地址0xc中
可以计算偏移
继续点n
到read 函数运行(这一步很重要,否则偏移不准确)
再次查看栈帧计算此时canary 到esp的偏移量
因为程序是32位
4个字节一组就是31组
所以canary的偏移为31
这部分可参考
https://www.freebuf.com/articles/system/233515.html
https://blog.csdn.net/glhdbk/article/details/100595050
则payload1可构造
1 | |
泄露出canary的值
最后进行再一次栈溢出
1 | |
最终exp
1 | |
