BF Addresses in the Stack
Last updated
Last updated
学习并练习 AWS 黑客技能:HackTricks 培训 AWS 红队专家 (ARTE) 学习并练习 GCP 黑客技能:HackTricks 培训 GCP 红队专家 (GRTE)
如果你面对一个由 canary 和 PIE(位置无关可执行文件)保护的二进制文件,你可能需要找到一种方法来绕过它们。
请注意,checksec
可能无法发现一个二进制文件受到 canary 保护,如果它是静态编译的,并且无法识别该函数。
然而,如果你发现在函数调用开始时保存了一个值在栈中,并且在退出之前检查了这个值,你可以手动注意到这一点。
为了绕过 PIE,你需要泄漏一些地址。如果二进制文件没有泄漏任何地址,最好的方法是在易受攻击的函数中暴力破解栈中保存的 RBP 和 RIP。 例如,如果一个二进制文件同时使用canary和PIE进行保护,你可以开始暴力破解 canary,然后接下来的 8 字节(x64)将是保存的RBP,接下来的 8 字节将是保存的RIP。
假设栈中的返回地址属于主二进制代码,如果漏洞位于二进制代码中,通常情况下会是这样。
要从二进制文件中暴力破解 RBP 和 RIP,你可以发现一个有效的猜测字节是否正确,如果程序输出了一些内容或者它没有崩溃。可以使用与用于暴力破解 canary 相同的函数来暴力破解 RBP 和 RIP:
最后你需要战胜PIE的是计算从泄漏的地址中得到的有用地址:RBP 和 RIP。
通过 RBP 你可以计算出你的shell写在堆栈中的位置。这对于知道你将在堆栈中的哪里写入字符串 "/bin/sh\x00" 非常有用。要计算泄漏的RBP和你的shellcode之间的距离,你可以在泄漏RBP后设置一个断点,检查你的shellcode位于哪里,然后计算shellcode和RBP之间的距离:
从RIP中,您可以计算PIE二进制文件的基地址,这是您需要创建有效的ROP链所需的内容。
要计算基地址,只需执行objdump -d vunbinary
并检查最新的反汇编地址:
在这个示例中,您可以看到只需要1字节和半字节就可以定位所有的代码,因此,在这种情况下,基地址将是泄漏的RIP,但以"000"结尾。例如,如果泄漏了0x562002970ecf
,则基地址为0x562002970000
根据这篇文章的一些观察,当泄露RBP和RIP值时,服务器不会因为一些不正确的值而崩溃,而BF脚本会认为它获得了正确的值。这是因为即使不是完全正确的地址,有些地址也不会导致崩溃。
根据该博客文章,建议在请求之间向服务器添加短暂延迟。