20100114

Heap Overflow в наборе кодеков K-Lite Codec Pack

С чего все началось
Многие наверно используют в своей повседневной жизни Total Commander. Очень удобная программа, к тому же поддерживает плагины. Так же многие используют набор кодеков K-Lite Codec Pack. Поддерживает многие форматы видео и аудио файлов, собственно по этому и пользуется большой популярностью. Но мало кто знает, что будучи установлены по умолчанию, эти два продукта, могут сыграть с вами злую шутку. Существует вероятность очень "удачного" стечения обстоятельств. А именно переполнение хипа. И так, как же оно было обнаружено.
Как вы знаете в Total Commander есть встроенное средство быстрого просмотра содержимого файлов (по нажатию F3). Если к файлу привязано какое-либо расширение, есть возможность открыть как мультимедиа - то есть, в нашем случае, K-Lite зарегистрировал свои расширения и fourcc коды и Total Commander попытается воспроизвести файл, а не просмотреть его содержимое допустим в HEX. Это все справедливо для настроек по умолчанию.
И так, во время экспериментов с MP4 видеофайлом (Metasploit для winamp), у меня рухнул Total Commander - ошибка работы с хипом Runtime C++ Error...
Исследование
Приведу общую конфигурацию системы, где все это происходило:
OS Windows 7 Ultimate x86
Total Commander 7.04a
K-Lite Codec Pack (klcodec520f.exe):
    MP4/3GP/MOV splitter (Haali Media Splitter) [version 1.9.42.1]
    For parsing the MP4/MOV/3GP containers (. Mp4. M4v. Hdmov. Mov .3 gp files).
При разборе падения было выяснено, что Total Commander создает граф в котором есть фильтр MP4Splitter.ax. В нем и происходит падение. 
Привожу часть дампа мною созданного файла. который инициирует падение:


5460h: 60 C2 D0 80 0C 0A 48 48 48 48 48 48 48 48 48 48  `ÂЀ..HHHHHHHHHH
5470h: 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48  HHHHHHHHHHHHHHHH
5480h: 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48  HHHHHHHHHHHHHHHH
5490h: 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48  HHHHHHHHHHHHHHHH
54A0h: 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48  HHHHHHHHHHHHHHHH
54B0h: 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48  HHHHHHHHHHHHHHHH 

Чтобы не запутаться, я изменил этот диапазон на последовательность типа “AA..AABB..BBCC..CC”. В результате переполнение хипа в модуле MP4Splitter.ax в OllyDbg, будет выглядеть так:
1) До вызова HeapFree()

2) После вызова HeapFree()
Как видим, при освобождении, идет затирание структуры хипа (см, правый нижний квадрат - дамп хипа). Замечаем важную особенность - указатель на хип содержится в esi регистре..
Эксплуатация
И так, в общем случае, цель - это хип, перейти туда можно по команде jmp esi. Опкод команды \xE6\xFF.


03D0h: 00 00 00 00 00 00 00 00 00 00 00 31 2E 32 34 00  ...........1.24.
03E0h: 55 50 58 21 0C 09 05 0A 7B F4 8E F8 24 E1 9F 99  UPX!....ôŽø$៙
03F0h: 4D 49 32 00 64 A5 0E 00 00 B6 2C 00 26 7A 00 DF  MI2.d¥...¶,.&z.ß
0400h: FF 67 E6 FF 03 07 42 6F 6F 6C 65 61 6E 01 00 09  ÿgæÿ..Boolean...
0410h: 10 40 00 05 46 61 6C 73 65 04 BE CD FE FB 54 72  .@..False.¾ÍþûTr
0420h: 75 65 8D 1B 02 04 43 68 61 72 37 FF 3E 90 01 08  ue...Char7ÿ>.. 

Найдя его и переписав хип так, чтобы управление передалось на нужный байт, цель будет достигнута. Так как я собрался эксплуатировать именно Total Commander, то найдем в нем нужную нам последовательность. Я был приятно удивлен, что в заголовке Total Comander (а он пожат UPX) была найдена эта последовательность. И мало того, плюс еще 14 совпадений, что дает возможность морфить код эксплоита.
Проблемы с правильным затиранием хипа, и его защитой, типа SafeGuard, я оставлю вам на самостоятельное рассмотрение.
P.S.: Данная информация была написана исключительно для размышления. Автор, то есть я, никакой ответственности за эту информацию не несу. Никаких сплоетов и исходников не прилагаю.

С уважением.

20100105

Здравствуйте

Создал блог, думаю буду тут отписывать всякие технические вещи. Хотя, может и не только технические.
Думаю будет интересно.
Если не будет времени, то удалю. Извините :-)