------[ 4.- BIOS32 (Прямая инфекция ядра)
Теперь у тебя есть BIOS руткит, который выполняется в BIOS. Но находясь в BIOS, он просто сосет с точки зрения атакующего. В идеале нам нужен контроль над ядром операционной системы. Вот почему ты должен аплоаднуть шеллкод на жесткий диск или сделать SMBIOS-руткит. Но что делать, если жесткий диск зашифрован? Или если машина не имеет жесткого диска и грузится по сети? Не ссы, потому что этот раздел именно для таких случаев. Есть заблуждение, что BIOS не используется после загрузки. Это неправда. ОС обращается к BIOS по многим причинам, как, например, установка видеорежимов (Int 10h) или вызов BIOS-32. Что такое BIOS32? Используя поиск Google, мы пришли к выводу, что это скрытая служба BIOS, которая предоставляет информацию о других сервисах BIOS современным 32-разрядным операционным системам. Вы можете обратиться к [BIOS32SDP] для получения более детальной информации. Важно то, что многие операционные системы обращаются к нему. И единственным требованием, чтобы подменить службу BIOS32, является то, что Вам необходимо сделать заголовок BIOS32 где-то от E000:0000 до F000:FFFF области памяти. Структура заголовка:
Код:
Code:
Offset Bytes Description
0 4 Signature "_32_"
4 4 Entry point for the BIOS32 Service (here you put a pointer
to your stuff)
8 1 Revision level, put 0
9 1 Length of the BIOS32 Headers in paragraphs (put 1)
10 1 8-bit Checksum. Security FTW!
11 5 Reserved, put 0s.
Это шаблон для всех сервисов BIOS. Чтобы найти и выполнить сервис, нужно выполнить шаблонный поиск по контрольной сумме, а затем он просто переходит на функцию, которая является своего рода диспетчером. Такое поведение присутствует в различных BIOS функциях, такие как Plug и Play ($PnP), Post Memory Manager ($PMM), BIOS32 (_32_) и т. д. В то время, когда система была разработана, безопасность не учитывалась, поэтому мы можем использовать это преимущество и вставить наши собственные заголовки (мы можем даже использовать option-ROM, без изменения системы BIOS), ну и ОС, в конечном счете, всегда доверяет BIOS. Вот как Linux 2.6.27 находит и вызывает эту услугу на этапе ядра:
[CODE]
Code:
arch/x86/pci/pcibios.c,check_pcibios()
...
if ((pcibios_entry = bios32_service(PCI_SERVICE))) {
pci_indirect.address = pcibios_entry + PAGE_OFFSET;
local_irq_save(flags);
__asm__(
"lcall *(%%edi); cld\n\t"