如何在x86-64中注入任意内存地址?

时间:2013-03-14 02:47:04

标签: c x86-64 exploit memory-address format-string

您好我正在尝试从“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系统中准确注入内存地址的解决方案吗?

0 个答案:

没有答案