Я читал про более старый эксплойт против GDI + на Windows XP и Windows Server 2003 назвал JPEG смерти для проекта, над которым я работаю.
Эксплоит хорошо объяснен в следующей ссылке: http://www.infosecwriters.com/text_resources/pdf/JPEG.pdf
В принципе, файл JPEG содержит раздел COM, содержащий поле комментария (возможно, пустое) и два байтовых значения, содержащих размер COM. Если комментариев нет, размер равен 2. Читатель (GDI +) считывает размер, вычитает два и выделяет буфер соответствующего размера для копирования комментариев в кучу.
Атака предполагает размещение в поле значения 0
. GDI + вычитает 2
, что приводит к значению -2 (0xFFFe)
, которое преобразуется в целое число без знака 0XFFFFFFFE
на memcpy
.
Пример кода:
unsigned int size;
size = len - 2;
char *comment = (char *)malloc(size + 1);
memcpy(comment, src, size);
Обратите внимание, что malloc(0)
на третьей строке должен возвращать указатель на нераспределенную память в куче. Как написать 0XFFFFFFFE
bytes (4GB
!!!!), возможно, не сбой программы? Описывает ли это запись за пределами области кучи и в пространство других программ и ОС? Что происходит потом?
Как я понимаю memcpy
, он просто копирует символы n
из пункта назначения в исходный код. В этом случае источник должен находиться в стеке, место назначения в куче, а n
- 4GB
.