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脚本会认为它得到了正确的值。这是因为某些地址即使不是完全正确的,也可能不会导致崩溃。
根据那篇博客文章,建议在对服务器的请求之间添加短暂的延迟。
学习与实践AWS黑客技术:HackTricks培训AWS红队专家(ARTE) 学习与实践GCP黑客技术:HackTricks培训GCP红队专家(GRTE)