2

您好,我正在尝试从“黑客:开发的艺术”一书中学习一些基本的内存利用,并且由于我的 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 系统中准确注入内存地址的解决方案?

4

0 回答 0