我一直在阅读关于在 Windows XP 和 WindowsServer2003上针对 GDI + 的一个较老的漏洞,它被称为 JPEG 的死亡,我正在从事的一个项目。
该漏洞在以下链接中得到了很好的解释: Http://www.infosecwriters.com/text_resources/pdf/jpeg.pdf
基本上,JPEG 文件包含一个名为 COM 的部分,其中包含一个(可能是空的)注释字段,以及一个包含 COM 大小的两字节值。如果没有注释,则大小为2。读取器(GDI +)读取大小,减去2,并分配一个大小适当的缓冲区来复制堆中的注释。
攻击包括在字段中放置值 0
。GDI + 减去 2
,得到一个值 -2 (0xFFFe)
,通过 memcpy
转换为无符号整数 0XFFFFFFFE
。
示例代码:
unsigned int size;
size = len - 2;
char *comment = (char *)malloc(size + 1);
memcpy(comment, src, size);
请注意,第三行上的 malloc(0)
应该返回一个指向堆上未分配内存的指针。如何写入 0XFFFFFFFE
字节(4GB
! ! !) 可能不会让程序崩溃?这是否超出了堆的范围,进入了其他程序和操作系统的空间?然后呢?
根据我对 memcpy
的理解,它只是将 n
字符从目的地复制到源。在这种情况下,源应该在堆栈上,目标在堆上,而 n
是 4GB
。