Прятки в linux
[an error occurred while processing this directive]

Когда модули недоступны…


Для борьбы с LKM-rootkit'ами некоторые админы компилируют ядро без поддержки загружаемых модулей и удаляют файл System.map, лишая нас таблицы символов. А без нее хрен что найдешь. Но хакеры выживают даже в этих суровых условиях….

Идеология UNIX выгодно отличается от Windows тем, что любая сущность (будь то устройство, процесс или сетевое соединение) монтируется на файловую систему, подчинясь общим правилам. Не избежала этой участи и оперативная память, представленная "псеводустройствами" /dev/mem

(физическая память до виртуальной трансляции) и /dev/kmem

(физическая память после виртуальной трансляции). Манипулировать с данными устройствами может только root, однако, спускаться на уровень ядра ему необязательно, а, значит, поддержка модульности нам не нужна!

Следующие функции демонстрируют технику чтения/записи ядерной памяти с прикладного уровня:

// чтение данных из /dev/kmem

static inline int rkm(int fd, int offset, void *buf, int size)

{

       if (lseek(fd, offset, 0) != offset) return 0;

       if (read(fd, buf, size) != size) return 0;

       return size;

}

 

// запись данных в /dev/kmem

static inline int wkm(int fd, int offset, void *buf, int size)

{

       if (lseek(fd, offset, 0) != offset) return 0;

       if (write(fd, buf, size) != size) return 0;

       return size;

}

Листинг 9 чтение/запись в/из /dev/kmem

Остается только найти во всем этом мусоре таблицу системных вызовов. Да как же мы ее найдем, если никакой символьной информации у нас нет?! Без паники! Нам помогут центральный процессор и машинный код обработчика прерывания INT 80h, которое этими системными вызовами, собственно говоря, и заведует.

Его дизассемблерный листинг в общем случае выглядит так:

 

0xc0106bc8 <system_call>:  push   %eax

0xc0106bc9 <system_call+1>: cld

0xc0106bca <system_call+2>: push   %es

0xc0106bcb <system_call+3>: push   %ds

0xc0106bcc <system_call+4>: push   %eax

0xc0106bcd <system_call+5>: push   %ebp




Начало  Назад  Вперед


[an error occurred while processing this directive]