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

BIOS на блюдечке

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

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


Насколько такая процедура безопасна? По правде говоря, опасности нас подстерегают на каждом шагу. Микросхема может выскользнуть из рук и упасть на плату, малейшая ошибка в прошивке может вывести оборудование из строя (например нечаянно задрать напряжение или тактовую частоту). До приобретения боевого опыта лучше всего насиловать старые материнские платы, которые все равно идут в утиль.

[вскрытие BIOS’а]

Чтобы модифицировать BIOS, необходимо знать его структуру, повадки и т.п. В древних AT весь BIOS умещался в последнем сегменте адресного пространства, простилающемся от F000:0000 до F000:FFFF. Современные прошивки занимают порядка 256-512 Кб, и чтобы обеспечить обратную совместимость, BIOS пришлось разбить на несколько частей, в результате чего он приобрел сложную модульную структуру, с которой не так-то просто разобраться.

Но мы же не боимся трудностей, верно? Вот перед нами лежит прошивка (пусть для определенности это будет прошивка 06/19/2003-i845PE-W83627-9A69VPA1C-00 с именем файла 4PE83619.BIN). Как ее дизассемблировать?! IDA едет крышей и ничего путного не показывает, пока мы ее не научим.

Будем исходить из того, что последний байт прошивки расположен по адресу F000h:FFFFh, а точка входа в BIOS находится по адресу F000h:FFF0h.

Загружаем файл в HIEW или ИДУ, отсчитываем 10h байт от его конца и дизассемблируем код. С вероятностью, близкой к единице, там будет торчать межсегментный переход:

[HEX-дамп последних 30h байт прошивки (байты инструкции, расположенной в точке входа, выделены)]

0007FFD0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00

0007FFE0: 00 00 00 00-00 00 00 00-39 41 36 39-56 50 41 31

0007FFF0: !!!EA 5B E0 00-F0!!! 2A 4D 52-42 2A 02 00-00 00 60 FF

[дизассемблерный листинг окрестностей точки входа в прошивку]

0007FFF0: !!!EA5BE000F0 jmp 0F000:0E05B!!!

0007FFF5: 2A4D52 sub cl,[di][00052]

В данном случае переход указывает на адрес F000h:E05Bh. Как найти это место в прошивке? Да проще простого: если 7FFF0h — это F000h:FFF0h, то 0F000h:0E05Bh — это: 7FFF0h  (FFF0h  E05Bh) == 7FFF0h  1F95h = 7E05Bh. Здесь расположен следующий код:

[начало дизассемблирования boot-блока]

0007E05B: EA60E000F0 jmp 0F000:0E060

0007E060: 8EEA mov gs,dx

0007E062: FA cli

0007E063: FC cld

0007E064: 8CC8 mov ax,cs

0007E066: 8ED0 mov ss,ax

Место, в которое мы попали, называется загрузочным блоком (boot-block или boot-kernel). Этот блок, предельно допустимый размер которого составляет 64 Кб, выполняет первичную инициализацию оборудования и загружает все остальные блоки, хранящиеся в упакованном виде.

Естественно, перед дизассемблированием остальных блоков их необходимо распаковать. Нормальный распаковщик можно написать и самостоятельно, однако проще взять уже готовый и автоматически извлечь все модули. В частности, обладатели Award'а могут запустить утилиту cbrom с ключом /D (или bp.exe с ключом /e), чтобы узнать, из каких блоков состоит данная версия BIOS и по каким адресам они располагаются.

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