我在测试一个带有堆栈金丝雀保护的简单C程序。我试图通过覆盖函数的返回地址和覆盖main的地址来绕过保护。我正在用目标程序中函数的地址覆盖它。我得到了以下结果,这使我相信攻击是可能的:

它检测到了smash,但它似乎试图跳入目标函数,即"yo“。我试图操纵它试图访问的任何地址,但没有运气。
我的问题是,还可能有进一步的剥削吗?它是否由于SIGSEGV (即访问0x1010.)而终止?或者是金丝雀的发现?
这个想法来自于这个文章
该方案:

发布于 2017-08-20 18:25:33
由于金丝雀的发现,它即将结束。仅仅因为GDB显示堆栈帧,包括您的其他返回地址,并不意味着代码执行就会到达-- GDB只是读取堆栈上的地址(“解除堆栈”)来向您显示信息。只有当您成功地从所有这些函数返回时,您才会到达yo,但是由于__stack_chk_fail导致程序死亡而不返回,所以不会发生这种情况。
要绕过堆栈金丝雀,您几乎需要泄漏、猜测或粗暴地强制执行金丝雀值,查找任意的写入(例如,在EIP上写入而不覆盖金丝雀),或者在堆栈金丝雀处理程序中找到可利用的bug。
https://security.stackexchange.com/questions/116654
复制相似问题