GrabDuck

elf, образ ядра

:

Теперь мой антируткит умеет проверять целостность таблицы системных вызовов и первых 5 байт самих системных вызовов. При тестировании оказалось, что код 158го системного вызова в исполняющемся ядре отличается от того, что находится в elf образе ядра на диске. Причем совпадают первые 4 байта, потом несколько байт отличаются, а потом снова совпаюат. Из System.map выяснил, что это c012e100 T sys_sched_yield. Дамп первых 50 байт следующий: из ядра: 55 89 e5 53 fa 90 8d b4 26 00 00 00 00 90 64 a1 80 15 59 c0 ba 80 83 59 c0 8d 1c 02 89 d8 e8 3d cb 25 00 83 83 f8 04 00 00 01 64 a1 00 10 59 c0 8b 50;

из elf файла: 55 89 e5 53 51 52 ff 15 44 ef 49 c0 5a 59 64 a1 80 15 59 c0 ba 80 83 59 c0 8d 1c 02 89 d8 e8 3d cb 25 00 83 83 f8 04 00 00 01 64 a1 00 10 59 c0 8b 50.

Дизассемблированные версии: Ядро:

push ebp

seg000:00000001 mov ebp, esp

seg000:00000003 push ebx

seg000:00000004 cli

seg000:00000005 nop

seg000:00000006 lea esi, [esi+0]

seg000:0000000D nop

seg000:0000000E mov eax, fs:0C0591580h

seg000:00000014 mov edx, 0C0598380h

seg000:00000019 lea ebx, [edx+eax]

seg000:0000001C mov eax, ebx

seg000:0000001E call near ptr 25CB60h

seg000:00000023 add dword ptr [ebx+4F8h], 1

seg000:0000002A mov eax, fs:0C0591000h

elf образ:

push ebp

seg000:00000001 mov ebp, esp

seg000:00000003 push ebx

seg000:00000004 push ecx

seg000:00000005 push edx

seg000:00000006 call dword ptr ds:0C049EF44h

seg000:0000000C pop edx

seg000:0000000D pop ecx

seg000:0000000E mov eax, fs:0C0591580h

seg000:00000014 mov edx, 0C0598380h

seg000:00000019 lea ebx, [edx+eax]

seg000:0000001C mov eax, ebx

seg000:0000001E call near ptr 25CB60h

seg000:00000023 add dword ptr [ebx+4F8h], 1

seg000:0000002A mov eax, fs:0C0591000h

Что-то не верится, что это руткит поймался. Попросил знакомого запустить мою прожку - у него такая же фигня с этим системным вызовом. Есть какие-нибудь идеи?