Linux - статьи

Модификация обработчика системных вызовов


Используя описанный выше метод, мы можем также дизассемблировать другие критические функции в памяти ядра. Одна из них это обработчик системных вызовов, имеющий имя system_call и использующийся для определения адреса и вызова функций системных вызовов. Обработчик использует таблицу системных вызовов для определения адреса нужного системного вызова. Дизассемблировав этот обработчик, мы можем проверить используется ли правильный адрес таблицы системных вызовов или обработчик был модифицирован. Для осуществления атаки, злоумышленник может создать свою собственную таблицу системных вызовов, использующую его системные вызовы. Затем он может разместить новый адрес таблицы системных вызовов в обработчике системных вызовов. (gdb) disass system_call Dump of assembler code for function system_call: 0xc01090dc <system_call>: push %eax 0xc01090dd <system_call+1>: cld 0xc01090de <system_call+2>: push %es 0xc01090df <system_call+3>: push %ds 0xc01090e0 <system_call+4>: push %eax 0xc01090e1 <system_call+5>: push %ebp 0xc01090e2 <system_call+6>: push %edi 0xc01090e3 <system_call+7>: push %esi 0xc01090e4 <system_call+8>: push %edx 0xc01090e5 <system_call+9>: push %ecx 0xc01090e6 <system_call+10>: push %ebx 0xc01090e7 <system_call+11>: mov $0x18,%edx 0xc01090ec <system_call+16>: mov %edx,%ds 0xc01090ee <system_call+18>: mov %edx,%es 0xc01090f0 <system_call+20>: mov $0xffffe000,%ebx 0xc01090f5 <system_call+25>: and %esp,%ebx 0xc01090f7 <system_call+27>: testb $0x2,0x18(%ebx) 0xc01090fb <system_call+31>: jne 0xc010915c <tracesys>

0xc01090fd <system_call+33>: cmp $0x100,%eax 0xc0109102 <system_call+38>: jae 0xc0109189 <badsys> 0xc0109108 <system_call+44>: call *0xc0302c30 (,%eax,4) 0xc010910f <system_call+51>: mov %eax,0x18(%esp,1) 0xc0109113 <system_call+55>: nop End of assembler dump.

Обратите внимание, что дизассемблированный обработчик содержит адрес оригинальной таблицы системных вызовов.



Содержание раздела