【问题标题】:Bufferoverflow stack canary location缓冲区溢出堆栈金丝雀位置
【发布时间】:2020-07-11 20:44:20
【问题描述】:

我有 i 二进制文件,可以通过缓冲区溢出来利用,但它有一个堆栈金丝雀

我可以通过gets() 调用获得许多地址和值,但我无法在pwndbggdb 的版本)中找到堆栈金丝雀,所以我可以找出我得到的值是堆栈金丝雀

我尝试查看堆栈但找不到它并查看了一个已经可以利用它的脚本,它使用了一个我什至找不到的金丝雀值(我的意思是来自gets() 的泄露地址的索引)在反汇编程序中

【问题讨论】:

    标签: gdb buffer-overflow stack-smash


    【解决方案1】:

    我在这里遗漏了一些关键细节,但我会尝试一下。

    首先,金丝雀不会在堆栈上,而是在堆栈帧之间: https://manybutfinite.com/img/stack/bufferCanary.png

    谷歌搜索“stack canary location gcc”会生成几张图片,以帮助您更轻松地理解此机制。

    其次,我不太清楚使用gets() 读取是什么意思。 gets() 读取标准输入并将其放入缓冲区。您将无法使用它来读取程序内存。

    关于已经运行的脚本:我持怀疑态度。

    来自 gcc 文档 (https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html):

    当进入函数时初始化守卫,然后在函数退出时检查。

    可能设法利用它的代码在二进制文件中关闭了堆栈保护器,或者它找到了另一种方法来通过其他方式绕过此保护。例如,您可以溢出本地函数指针而不触发堆栈保护器。堆栈保护器仅防止溢出到存储的 RBP 和 RIP(32 位:EBP 和 EIP)中,而不防止溢出到局部变量中。

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 2016-10-04
      • 1970-01-01
      • 2011-06-28
      • 2017-02-23
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      相关资源
      最近更新 更多