canary绕过感悟
最近接触到了修改TLS结构体来绕过canary,翻了翻之前刚开始学习canary基础时的随记,感觉蛮好的,就分享下吧。
canary的位置在哪里?打程序时canary在s也就是ebp的前面,也就是说,得先把canary打下来,才能继续把s也就是ebp打下来,来到r的位置,也就是来到eip的位置.然后就可以控制程序了,跳转到我们想跳转的地方,执行shell获得权限后cat flag.
为了防住我们,加了一个保护,就是说,在打到r,还没到r,打到s之前的路上设置了一个屏障,它会先判断你,输入的数据和它内部储存的数据是不是一样的,只有一样的才放你过去.
那么,我们要想打到r的位置,就必须得把canary的值给泄露出来,先打到canary的位置.在把我们泄露出的canary给它,放我们过去,然后,我们就可以一路打到r的位置,控制程序了.
所以核心就是如何让程序泄露出canary,并且我们可以拿到程序泄露出的值.
谈谈canary的大小:
经验之谈,对于64位的机子canary就是固定的8字节, 地址为16位,对于32位的机子canary就是固定的4字节,地址为8位
对于利用格式化字符串漏洞获取canary
如果是32位的就用4个a或者4个其他字符后面加-%x
如果是64位的就用8个a或者8个其他字符后面加-%p
加-可以有效的把他们分隔开,毕竟我们要数它的数值.
先拓展一点知识:32位的就用aaaa+n%x
%p可以打印出地址,我们可以吧canary的地址连带着给打印出来
64位的就用aaaaaaaa+%p
比如64位的机子,如果确定了canary位置的数值是16那么使用%p$16就可以只把canary的值打出来.
对于覆盖截断字符获取canary,就是最后记得加一个a字符上去覆盖就行了.