我有一个可以利用缓冲区溢出攻击的二进制文件,但是它有一个堆栈金丝雀。
我可以通过一个gets()调用获得许多地址和值,但是我无法在pwndbg( gdb的版本)中定位堆栈金丝雀,所以我可以找出我得到的值是什么堆栈金丝雀。
我试着查看堆栈,但找不到它,并查看了一个已经可以利用它的脚本,它使用了一个金丝雀值(我指的是gets()泄露地址的索引),而我甚至在反汇编程序中都找不到。
发布于 2020-09-08 17:00:59
我在这里遗漏了一些关键的细节,但我会试着试一试。
首先,金丝雀不是在堆栈上,而是在堆栈帧之间:https://manybutfinite.com/img/stack/bufferCanary.png。
谷歌的“堆栈金丝雀位置gcc”生成了几张图片,以帮助您更容易地理解这一机制。
其次,我不太清楚使用get()来读取是什么意思。获取()读取stdin并将其放入缓冲区。您将无法使用它来读取程序内存。
关于已经生效的脚本:我对此表示怀疑。
gcc博士(https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html):
在输入函数时初始化保护程序,然后在函数退出时进行检查。
可能是设法利用它的代码要么在二进制文件中关闭了堆栈保护程序,要么找到了另一种通过其他方式绕过这种保护的方法。例如,您可以溢出一个本地函数指针,而根本不触发堆栈保护程序。堆栈保护器只保护防止溢出到存储的RBP和RIP (32位: EBP和EIP),而不是防止溢出到局部变量。
https://stackoverflow.com/questions/62854389
复制相似问题