Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #62, ЯНВАРЬ 2006 г.

Ломаем текстовые хранилища

Крис Касперски

Спецвыпуск: Хакер, номер #062, стр. 062-096-4


Все алгоритмы шифрования документированы и детально описаны в спецификации формата, которую можно бесплатно скачать с сайта Adobe (http://partners.adobe.com/public/developer/pdf/index_reference.html) или в исходных текстах любого pdf-viewеr'а OpenSource. Никаких проблем на этом этапе возникнуть не должно.

Если говорить кратко, то pdf-файл представляет собой довольно сложное инженерное сооружение следующего вида:

<PDF file> ::= <header> <body> <cross-reference table> <trailer>.

Заголовок (header) описывает различную служебную информацию, он нам совершено не интересен. Вот тело файла (body) неплохо бы рассмотреть поподробнее. Оно состоит из последовательности объектов (object), идентифицируемых двумя числами: номер объекта (object number) и номер поколения (generation number). Внутренне объекты состоят из потока данных (stream data) и словаря потока (stream dictionary). Словарь описывает атрибуты данных, объясняя viewеr'у, что это такое: графическое изображение, текст, шрифты, зашифрованы они или нет, и если зашифрованы, то по какому алгоритму, и т.д. Таблица перекрестных ссылок (cross reference table) связывает номера объектов с их позицией в файле и всегда хранится в незашифрованном состоянии.

Листинг 1. Схематичное представление структуры PDF-файла

<PDF file> ::= <header> <body> <cross-reference table> <trailer>

<body> ::= <object> {<object>}

<object> :: <objectID> (<data> | < > <stream>)

Поддерживаются данные следующих типов: булевские константы (boolean), числа (numeric), ссылка на объекты (object reference), имена (name), строки (string) и потоки (stream). Потоки начинаются с ключевого слова «stream» и заканчиваются ключевым словом «endstream», между ними расположены двоичные данные. Откроем любой документ HIEW'ом, чтобы найти их (см. рис. 9). Строки могут быть как литеральными (то есть состоящими из печатаемых символов), так и шестнадцатеричными. Литеральные строки заключаются в круглые скобки: «(это литеральная строка)», а шестнадцатеричные — в угловые: «<4E6F762073686D6F7A206B6120706F702E>». Строки и потоки могут быть шифрованы, остальные типы данных — нет.

Имена начинаются с наклонной черты, той самой, которой разделяют каталоги в UNIX (например «/ThisIsName»), ссылки на объекты обозначаются парой чисел: номер объекта/поколения, за которыми идет ключевое слово «R» (например «23 0 R»). Данные разных типов могут быть объединены в массив (array) или словарь (dictionary). Массив обрамляется прямыми скобами (например «[23 0 R /XYZ null]»), а словарь — «типографскими кавычками» (например «<</Name1 (Val1) /Name2 /Val2>>»)

Это минимум информации, которую необходимо знать для низкоуровневой работы с pdf-документом.

Мы довольно глубоко увязли в теории, пора вылезать на поверхность. Возьмем любой pdf-файл (пусть для определенности это будет www.encode-sec.com/pdf/esp0302.pdf) и загрузим его в любимый HEX-редактор.

Назад на стр. 062-096-3  Содержание  Вперед на стр. 062-096-5