您好,我正在尝试从“黑客:开发的艺术”一书中学习一些基本的内存利用,并且由于我的 x86-64 系统而遇到了麻烦。
对于本书的这一部分,我正在学习格式字符串漏洞利用,并且我将注入一个环境变量以通过漏洞读取。(第 172 页)
这是我尝试使用格式字符串漏洞利用的程序的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char text[1024];
static int test_val = -72;
if(argc < 2) {
printf("Usage: %s <text to print>\n", argv[0]);
exit(0);
}
strcpy(text, argv[1]);
printf("The right way to print user-controlled input:\n");
printf("%s", text);
printf("\nThe wrong way to print user-controlled input:\n");
printf(text);
printf("\n");
// Debug output
printf("[*] test_val @ %p = %d %p\n", &test_val, test_val, test_val);
exit(0);
}
从这里开始,为了利用,我在编译后按照书中所说的(为 x86-32 编写)进行了尝试:
./fmt_vuln $(printf "\x\x\x\x\x\x\x\x")%016x%016x%016x%016x%016x%016x%016x%s
(\x\x\x\x\x\x\x 替换为小端格式任意环境内存地址),当我遇到“\n打印用户控制输入的错误方法时,我得到的只是分段问题: \n" 部分。
程序的正确响应应该是注入地址中的字符串。
我还关闭了 ASLR、NX 和格式保护。
我不知道如何让它工作。我猜要么我没有正确注入地址,因为 32 和 64 之间的差异,或者 %s 没有正确读取我的地址。或者可能我猜我没有足够好地关闭安全性。
您能否找到如何在 x86-64 系统中准确注入内存地址的解决方案?