该视频https://youtube.com/watch?v=4HxUmbOcN6Y介绍了现代编译器如何使用堆栈 cookie 和函数保护堆栈溢出__stack_chk_fail。
- 如何识别二进制文件是否具有堆栈粉碎保护?如果我
__stack_chk_fail在 IDA 中看到 我能猜到这个二进制文件使用了堆栈 cookie(只有当这个二进制文件动态编译时,我才会看到这个函数)。
但是如果这个函数是静态编译的,我怎么识别呢?每个函数都会以if ... then abort else return或仅以从用户处获取缓冲区的函数结束?
- 如果二进制使用堆栈粉碎保护并获得缓冲区不安全(例如
gets),我该如何克服堆栈 cookie?还是没有办法返回到另一个函数?