Спящий вирь. Изучаем технику Sleep-обфускации на ROP-цепочках

Содержание статьи

  • ROP
  • Ekko
  • Выводы

Ви­русо­писа­тели при­думы­вают все новые и новые спо­собы скры­тия сво­его ПО пос­ле инжекта в про­цесс. В пос­леднее вре­мя ста­ла популяр­на не прос­то обфуска­ция, а Sleep-обфуска­ция. Давай раз­берем­ся с этой тех­никой, поз­накомим­ся с ROP-цепоч­ками, если ты с ними еще не зна­ком, и заценим пуб­лично дос­тупные PoC.

Ка­кую глав­ную цель прес­леду­ет любой ува­жающий себя злов­ред? Быть может, зарабо­тать соз­дателю мил­лион дол­ларов? Зах­ватить весь мир? Ста­щить нюд­сы быв­шей? Все это может быть потом, но пер­вая и важ­ней­шая задача — скрыть­ся! И Sleep-обфуска­ция в этом отлично помога­ет. Этот спо­соб скры­тия может при­менять­ся как к шелл‑коду, так и ко всей копии фай­ла в памяти в целом.

Боль­шинс­тво анти­виру­сов обра­щает прис­таль­ное вни­мание на любые области памяти с пра­вами на исполне­ние. Конеч­но, не все так прос­то, важ­но вер­но учи­тывать реги­он памяти (глу­по было бы бло­киро­вать все RX-дан­ные в Image-сек­циях), но Sleep-обфуска­ция не об этом.

Пред­ставь, что ска­нер так и рыщет злы­ми гла­зами по памяти уже заражен­ного про­цес­са, пыта­ясь выцепить сво­ими ког­тищами наш бед­ный малень­кий шелл‑код. Что­бы скрыть себя в памяти, он может взять и поменять раз­решения сво­его реги­она с RX на, нап­ример, RW или вооб­ще PAGE_NO_ACCESS. Пос­ле чего допол­нитель­но пок­сорить­ся на уда­чу. И всё, шелл‑код в домике. А Око Кас­пер­ско­го оста­нет­ся ни с чем.

Собс­твен­но, эту задачу и реша­ет Sleep-обфуска­ция. Она поз­воля­ет изме­нить раз­решения памяти, спря­тать шелл‑код, а затем через некото­рое вре­мя вер­нуть его к жиз­ни путем рас­шифров­ки и вос­ста­нов­ления Execute-прав.

Пред­лагаю сра­зу разоб­рать­ся с тер­минами. Пос­пра­шивав экспер­тов и пог­лядев PoC на GitHub, я сме­ло заяв­ляю, что Sleep-обфуска­цию мож­но счи­тать под­видом флук­туации шелл‑кода. Флук­туация реша­ет ту же задачу — шиф­рование и изме­нение раз­решений. Но лич­но я счи­таю, что Sleep-обфуска­ция — это все то, что при­водит, исполь­зуя те же тай­меры (или иные механиз­мы, свя­зан­ные со вре­менем), к выс­тре­лу кол­бэка и пос­леду­юще­му изме­нению раз­решений памяти.

Флук­туация — это кон­цепция такого поведе­ния вре­доно­са в целом. Добить­ся флук­туации мож­но и без вре­мен­ных фун­кций. Мож­но в шелл‑коде раз­местить PAGE_GUARD или Hardware Breakpoint. Такой фокус при выпол­нении шелл‑кодом кон­крет­ной инс­трук­ции поз­волит акти­виро­вать кол­бэк, который спря­чет вре­донос в памяти.

 

ROP

Поч­ти все извес­тные PoC на «спя­щую» обфуска­цию исполь­зуют ROP-цепоч­ки. Если очень вкрат­це, то ROP-цепоч­ки счи­тают­ся некото­рой прод­винутой заменой стан­дар­тно­му перепол­нению буфера. Вмес­то того что­бы помещать где‑то в сте­ке наш шелл‑код, мы, манипу­лируя адре­сами воз­вра­та, зас­тавля­ем код выпол­нять необ­ходимые нам инс­трук­ции. Набор инс­трук­ций называ­ется ROP-гад­жетом, нес­коль­ко ROP-гад­жетов — ROP-цепоч­кой.

От­личная кар­тинка, наг­лядно пред­став­ляющая этот механизм, есть в бло­ге ka1d0.

Наг­лядная иллюс­тра­ция ROP-цепоч­ки www

Боль­ше про этот инте­рес­ный спо­соб экс­плу­ата­ции мож­но почитать тут:

  • Ре­шение задания с pwnable.kr 26 — ascii_easy. Раз­бира­емся с ROP-гад­жетами с нуля раз и нав­сегда
  • ROP-цепоч­ки и гад­жеты: учим­ся раз­рабаты­вать экс­плой­ты
  • Return Oriented Programming (ROP) attacks
  • 32-bit Stack-based Buffer Overflow
  • What is the difference between a buffer overflow attack and a ROP attack?

Впро­чем, пог­ружать­ся в самые деб­ри нам сегод­ня не понадо­бит­ся. Связь меж­ду Sleep-обфуска­цией и ROP осно­вана толь­ко на том, что пос­ле выпол­нения одной фун­кции авто­мати­чес­ки будет дер­гать­ся дру­гая. Вот и всё! Давай пос­мотрим на при­мере.

 

Ekko

Прос­тей­ший и самый наг­лядный PoC для демонс­тра­ции Sleep-обфуска­ции — это Ekko. У него есть и более прод­винутый вари­ант, но он не столь наг­лядный, и разоб­рать­ся с ним будет слож­нее.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *