Adobe Shockwave Player 11.5.6.606 (DIR) Multiple Memory Vulnerabilities. Возможно ли выполнить на уязвимой системе код?

11 мая 2010 года в паблике была обнародована информация об уязвимости в Adobe Shockwave Player существующая вплоть до версии 11.5.6.606. По описанию этой баги (читаем тут http://www.zeroscience.mk/en/vulnerabilities/ZSL-2010-4937.php) уязвимость присутствует в дллке DIRAPI.DLL, относится к классу переполнения буфера и позволяет злоумышленниику выполнить атаку удаленного выполнения кода или DoS’а при открытии специально сформированного .DIR файла. Автор предлагает даже POC, написанный на Си, создающий зловредный .DIR файл. Однако, в паблике код привиден с ошибками, по ссылке привожу исправленный мною вариант.

Код компилируем, запускаем и получаем необходимый .dir файл. При открытии в броузере IE вылетает ошибка, смотрим в отладчике почему и видим Access violation to read… Тупо меняю в функции memset значение 0×41 на другие значения, изменяю size_junk на большие значения – все также эксепшн из-за ошибки чтения по адресу такому-то. Меняются регистры, но не eip, вызов виртуальных функций (а-ля call eax) вблизи не видно (где-то там вдалеке правда такой вызов виднелся))). Ну хорошо, обойти ошибку чтения по адресу не удается путем изменения значения заполняющего переполняемый буфер (в коде выше в функции memset), чтож попробуем несуществующие области памяти создать путем heap spray техники. Создаем html страничку, в которой будет открываться зловредный .DIR файл и… облом, .DIR’ы в хтмл не вставляются, только .DCR файлы. Если провести аналогию с флэшем, то .DIR это типа .FLA файлы, а .DCR – это какбы .SWF файлы. А дальше тупик… Ошибка в dirapi.dll модуле и компиляция dir’а в dcr ни к чему не приведет.
Возможно ли выполнение кода через эту уязвимость на современных системах!?? Я такую возможность к сожалению не нашел…

Подмена выдачи для firefox

Однажды встала задача написать для броузера firefox программку подменяющую выдачу содержимого web-страниц. Например, заменяющая содержимое одного тэга на другой. На просторах интернета можно найти статью по написанию для этого броузера форм-граббера (например здесь https://forum.antichat.ru/thread176434.html).  Технология, описываемая в статье подразумевает использование сплайсинга для внедрения в функцию PR_Write своего кода для дальнейшего логгирования введенных пользователем данных. Поставленная передо мной задача впринципе сводилась к аналогичной работе, с той лишь разницей, что перехватывать необходимо теперь функцию PR_Read (эти функции находятся в nspr4.dll).

Прототип функции PR_Read следующий (взято с https://developer.mozilla.org/en/PR_Read)

PRInt32 PR_Read(PRFileDesc *fd, void *buf, PRInt32 amount)

Перехватывая данную функцию, необходимо учесть, что помимо html-кода через эту функцию также проходит всякая неинтересующая нас фигня. Первая проблема идентифицировать, что в буфере находится хтмл-код. Вариант, который сразу пришел на ум – это парсить содержимое буфера на наличие какого-либо тэга, например, <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”> (или части его))). Кстати, в этом буфере может также находится http-заголовок. Этот процесс можно чуточку оптимизировать по скорости, отбрасывая те случаи когда размер, передаваемый через параметр amount, не входит в границы от 0xf00 до 0×1000. Практика показала, что для большинства загружаемых страниц это так, однако, логично предположить, что не всегда, возможно загружаемая страница совсем маленькая. Размер буфера buf равен 0×1000 байт, так что если загружаемая страница больше размером, она передается в несколько порций. Это нужно учитывать, если искомый тэг находится где-то в конце страницы.

Вероятно может возникнуть такая задача, чтобы производить не подмену, а инъектирование своего кода, т.н. web-inject. Тут все сложнее. Вызов PR_Read блокирующий, поэтому думаю стоит поступать по следующей схеме. Фиксировать интересующий хэндл (fd), например, соответствующий загрузке страницы с определнного сайта, стопорить вызов функции с этим хендлом в потоке (не возвращать управление), пока не загрузится вся страница, вызывая при этом самим оригинальный PR_Read. Содержимое будет накапливаться в каком-то своем буфере, в котором и произведем все интересующие нас инъекты и подмены))). Этот свой саллокированный буфер можно освобождать, сделав хук на PR_Close.