Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #78, ИЮНЬ 2005 г.

BIOS на блюдечке

Крис Касперски ака мыщъх

Хакер, номер #078, стр. 078-108-4


У первых точка входа расположена по смещению 10h байт от конца модуля. Если здесь находится jmp, значит, это наш клиент! Так, в частности, устроены загрузочный и основной блоки.

[модуль 9a69vpa1.BIN с точкой входа по смещению 10h от конца (первый байт точки выделен)]

00000000: 42 73 47 05 00 E0 00 F0-00 10 00 40 00 40 00 00

00000010: 1E B8 40 00 8E D8 C6 86-4F 02 00 F7 06 10 00 01

00000020: 00 0F 84 ED 00 B0 02 BA-F7 03 EE EB 00 EB 00 FA

…

0001FFD0: 88 1E 00 01 1F 61 CF 00-00 50 43 49 2F 49 53 41

0001FFE0: 00 60 03 3C E7 45 84 01-00 01 80 00 80 05 3E 93

0001FFF0: !!!EA!!! 5B E0 00 F0 30 36 2F-31 39 2F 30 33 00 FC E5

Блоки второго типа содержат сигнатуру 55 AA в самом своем начале. Следующий за ней байт определяет длину модуля, выраженную в 512-байтовых секторах (например 10h секторов соответствует 8 килобайтам). Точка входа у них находится по смещению 03h от начала, и обычно на ней стоит jmp. Так устроены pxe.lom, i815.vga, все ISA/PCI-модули и многие другие блоки.

[модуль pxe.lom c сигнатурой 55 AA]

00000000: 55 AA 50 !!!E8!!! 1E 16 CB 8F-F9 03 00 00 00 00 00 00

00000010: 00 00 00 00 00 00 20 00-40 00 60 00 2E 8B C0 90

00000020: 55 4E 44 49 16 39 00 00-01 02 BD 10 00 08 60 97

Блоки третьего типа начинаются с обыкновенного текстового (или не совсем) заголовка, заканчивающегося нулем, за которым находится точка входа, опять-таки, в подавляющем большинстве случаев представляющая старый добрый jmp. Типичные представители подобных блоков: awardext.rom, decomp_blk.bin, anti_vir.bin.

[модуль decomp_blk.bin с текстовым заголовком, завершаемым нулем в начале]

00000000: 3D 20 41 77 61 72 64 20-44 65 63 6F 6D 70 72 65 = Award Decompre

00000010: 73 73 69 6F 6E 20 42 69-6F 73 20 3D 00 !!!66!!! 60 51 ssion Bios = ...

00000020: 06 56 A1 04 01 80 E4 F0-80 FC F0 75 3A E8 B2 0A xxxxxxxxxxxxxxxx

Блоки четвертого типа лишены заголовка и сразу же начинаются с точки входа. Наглядный пример тому — awardeyt.rom.

[модуль awardeyt.rom с точкой входа в самом начале]

00000000: !!!E9!!! 00 00 90 EA 09 00 00-A8 8C C8 8E E0 B8 00 A0

00000010: 8E D0 66 BC F0 EF 00 00-B8 00 F0 8E C0 BE B7 D2

00000020: 26 0F 01 1C 66 60 1E 06-0F A0 0F A8 BA F8 0C 66

Блоки пятого типа вообще не имеют точки входа и представляют собой набор вспомогательных процедур, вызываемый из остальных блоков, поэтому их следует дизассемблировать в последнюю очередь, когда структура остальных блоков уже ясна.

Поскольку в BIOS'е интенсивно используются абсолютные адреса, каждый дизассемблируемый блок должен быть загружен по своему родному смещению, иначе у нас ничего не получится. IDA автоматически запрашивает сегмент на смещение двоичных файлов перед загрузкой, а вот в HIEW'е для этой же цели можно использовать базирование. Ну не считать же все адреса каждый раз вручную, верно? Мы же хакеры, а не лошади!

Сложнее всего дизассемблирование интеловских BIOS'ов. Фактически это AMI BIOS'ы, но какие-то они извращенные. Точка входа лежит где-нибудь в середине файла, и чтобы ее найти, необходимо отыскать последовательность FA/FC/8C C8/8E D0 (CL/CLD/MOV AX,CS/MOV SS,AX). Собственно, это не совсем точка входа, но нечто очень к ней приближенное. Впрочем, для наших целей она вполне подходит.

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