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

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

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

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


2. к полученной последовательности дописываем хэш O-пароля (/O поле).

3. дописываем P-флаг, интерпретируемый как 4-байтовая целочисленная переменная типа LSB (Less Significant Bellow — наименее значимый байт лежит по меньшему адресу как в x86). Если бы пункта 3 не существовало, мы бы могли свободно менять атрибуты P-флага в HEX-редакторе, а так… Увы…

4. дописываем идентификатор (поле /ID), если он есть (это необязательное поле);

5. пропускаем полученную последовательность через алгоритм MD5 и на выходе получаем хэш-сумму. Ее первые 5 байт — ключ шифрования (encryption key) для 40-битного алгоритма (примечание: в ревизии 3 полученный хэш пропускается через MD5-алгоритм 50 раз, и от финальной хэш-последовательности берется столько байт, сколько нужно для ключа).

Хэш-сумма пользовательского пароля, хранящаяся в /U-поле, — это всего лишь 32-байтовая последовательность, дополненная указанной hardcoded-строкой, зашифрованная по алгоритму RC4 с использованием 5-байтового ключа шифрования (encryption key).

Проверка пароля, введенного пользователем, осуществляется после выполнения пунктов 1-5 с последующим сравнением полученного результата со значением /U-поля. Если обе последовательности совпадают до последнего бита, пароль считается истинным, и наоборот.

Проверка пароля владельца осуществляется по аналогичной схеме. Выполняем пункты с первого по пятый, используя либо пароль пользователя, либо жестко кодированную последовательность, если этого пароля нет. Полученным ключом шифрования encryption key расшифровываем O-поле по алгоритму RC4 и трактуем образовавшуюся последовательность как U-пароль, проверяя его по вышеописанной схеме. Очевидно, что, если мы знаем U-пароль (или содержимое документа не зашифровано), мы можем модифицировать P-флаг и регенерировать /O-поле, рассчитав его новое значение, которое Acrobat воспримет как правильное.

Дела с расшифровкой содержимого, зашифрованного непустым U-паролем, обстоят намного сложнее. Да, мы можем рассчитать новое /U-поле для пустого пароля, и Acrobat подумает, что никакого пароля здесь нет, но открыть файл он все равно не сможет. Прежде его необходимо расшифровать вот так:

1. выполняем шаги 1-5, получая 5-байтовый ключ шифрования (или длиннее).

2. дописываем трехбайтовый номер строки/объекта (string/object number) и двухбайтовый номер поколения (generation number, см. рис. 10). примечание: в фильтре ревизии 3 номер объекта и поколения пропускаются через скрамблер и к ним добавляется еще и случайная привязка в лице SALT-строки (см. рис. 11).

3. вычисляем MD5-хэш для данной 10-байтовой строки.

4. используем первые десять или более байт хэш-суммы в качестве ключа шифрования по RC4, расшифровывая содержимое строки/объекта.

Если пароль пользователя не установлен, мы легко и быстро расшифровываем pdf-файл, освобождаясь от оков O-пароля, так как в этом случае вместо U-пароля используется жестко прошитая строка. Просто расшифруй все секции и строки, удаляя /Encrypt-поле из trailer'а. И вот уже pdf свободен от каких-либо ограничений.

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