Leak-canary 简单绕过canary

leak-canary
提取码8ypi

这是从别人那里看见的,在看canary怎么绕过的时候看到的
别人的博客

他讲的感觉挺对,不过这个程序他利用的不是很充分,然后我就现学现卖一下了

Leak-canary 简单绕过canary

Leak-canary 简单绕过canary
这里好像严格来说至少有两个漏洞,一个是buf<read的大小,栈溢出;一个是printf格式化字符串漏洞。

根据canary的保护机制,他就是在栈里面放一段数,(应该是随机的吧)然后在函数返回的时候检查这段数还在不在、是否完整,如果有人通过栈溢出破坏了这一段数,程序就崩溃了。
这是一个简单的提,没绕那么多圈子,有个格式化字符串漏洞就可以把canary泄露出来

首先

Leak-canary 简单绕过canary

v3这个数应该就是canary,然后ida里给的提示是距离栈底Ch,

Leak-canary 简单绕过canary
被选中的地方就是栈底,在main函数返回值上面,然后栈底往回减去Ch就是最左边编号为0124的地方,这个里面的十六进制数就是canary,我试过,每次好像都不一样,所以需要泄露出来。

再看我们输入的1234,这一段输入信息被储存在编号024的地方,距离canary是100个字节。然后,如果我们输入%n$p这样的格式化字符串,它就会被当作参数传递给read函数后面的printf,栈顶下一个字节也就是004的地方就是格式化字符串的指针(吧),所以这么数的话,canary的值相对于格式化字符串的偏移为31,所以输入%31$p,就会显示
Leak-canary 简单绕过canary

这个就是canary的值

Leak-canary 简单绕过canary

然后这道题良心,又给了system

由于这个程序是read然后printf为一个循环,总共循环两次,所以有两次输入输出

第一次payload就是’%31$p’,获得canary值

第二次payload = 100*‘A’ + (canary值) + 12 * ‘B’ + p32(system)

Leak-canary 简单绕过canary

第一次自己做出来题,我兴奋了