Gdb 缓冲区溢出堆栈加那利位置

Gdb 缓冲区溢出堆栈加那利位置,gdb,buffer-overflow,stack-smash,Gdb,Buffer Overflow,Stack Smash,我有一个可以利用缓冲区溢出的二进制文件,但它有一个堆栈金丝雀 我可以通过gets()调用获得许多地址和值,但我无法在pwndbg(版本为gdb)中找到堆栈金丝雀,因此我可以找出我得到的值中哪些是堆栈金丝雀 我试着查看堆栈,但找不到它,并且查看了一个已经可以利用它的脚本,它使用了一个金丝雀值(我指的是get())中泄漏的地址的索引),我甚至在反汇编程序中找不到它,我在这里缺少一些关键细节,但我会尝试尝试一下 首先,金丝雀不会在堆栈上,而是在堆栈帧之间: 通过谷歌搜索“stack canary l

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

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


我试着查看堆栈,但找不到它,并且查看了一个已经可以利用它的脚本,它使用了一个金丝雀值(我指的是
get()
)中泄漏的地址的索引),我甚至在反汇编程序中找不到它,我在这里缺少一些关键细节,但我会尝试尝试一下

首先,金丝雀不会在堆栈上,而是在堆栈帧之间:

通过谷歌搜索“stack canary location gcc”可以得到一些图片,帮助您更轻松地理解这一机制

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

关于已经开始运作的剧本:我持怀疑态度

从gcc文档()中:

在输入函数时初始化防护,然后在函数退出时进行检查

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