您好我正在尝试从“Hacking:剥削艺术”这本书中学习一些基本的内存漏洞,而且由于我的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系统中准确注入内存地址的解决方案吗?