BF Forked & Threaded Stack Canaries
Last updated
Last updated
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
如果你遇到一个受 canary 和 PIE(位置无关可执行文件)保护的二进制文件,你可能需要找到一种方法来绕过它们。
请注意,checksec
可能无法发现一个二进制文件受 canary 保护,如果它是静态编译的,并且无法识别该函数。
然而,如果你发现一个值在函数调用开始时被保存到栈中,并且在退出之前检查这个值,你可以手动注意到这一点。
绕过简单 canary 的最佳方法是,如果该二进制文件是一个每次你与之建立新连接时分叉子进程的程序(网络服务),因为每次你连接到它时将使用相同的 canary。
因此,绕过 canary 的最佳方法就是逐字符暴力破解,你可以通过检查程序是否崩溃或继续其正常流程来判断猜测的 canary 字节是否正确。在这个例子中,函数暴力破解一个 8 字节的 canary(x64),并通过检查服务器是否发送了响应来区分正确猜测的字节和错误字节(在其他情况下,另一种方法可以使用try/except):
这个例子是为 64 位实现的,但可以很容易地为 32 位实现。
这是为32位实现的,但可以很容易地更改为64位。 还要注意,对于这个例子,程序首先期望一个字节来指示输入的大小和有效负载。
同一进程的线程将共享相同的金丝雀令牌,因此如果二进制文件在每次发生攻击时生成一个新线程,将有可能暴力破解金丝雀。
此外,在受金丝雀保护的线程函数中发生的缓冲区溢出可能被用来修改存储在TLS中的主金丝雀。这是因为,可能通过线程的栈中的bof到达存储TLS(因此,金丝雀)的内存位置。 因此,该缓解措施是无效的,因为检查使用的是两个相同的金丝雀(尽管已被修改)。 此攻击在以下写作中进行:http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
还请查看https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015的演示,其中提到通常TLS是通过**mmap
存储的,当创建线程的栈**时,它也是通过mmap
生成的,这可能允许如前所述的溢出。
64位,无PIE,nx,BF金丝雀,在某些内存中写入ROP以调用execve
并跳转到那里。