Ес­ли ты никог­да не поль­зовал­ся Radare2, то навер­няка о нем слы­шал: это опен­сор­сный набор инс­тру­мен­тов для иссле­дова­ния прог­рамм. В него вхо­дит мощ­ный дизас­сем­блер и отладчик, поз­воля­ющий пог­рузить­ся в сис­тему глуб­же, чем стан­дар­тный GDB. В этой статье мы под­робно погово­рим о филосо­фии Radare2 и нач­нем работать с ним.

В статье «От­ладка прог­рамм без исходни­ков. Ана­лизи­руем дво­ичные фай­лы в Linux штат­ными средс­тва­ми» мы рас­смот­рели базовые средс­тва дизас­сем­бли­рова­ния и отладки при­ложе­ний в Unix-подоб­ных опе­раци­онных сис­темах, нас­толь­ко ста­рых, что ими поль­зовались еще динозав­ры. С дру­гой сто­роны, уже в XXI веке были соз­даны аль­тер­натив­ные инс­тру­мен­ты, бла­года­ря сво­ему удобс­тву и мощи заво­евав­шие любовь тру­дящих­ся на ниве информа­цион­ной (без)опас­ности спе­циалис­тов.

 

Radare2

Как извес­тно, Radare2 пред­став­ляет собой гло­баль­но изме­нен­ный форк пер­вого Radare. В соот­ветс­твии с закона­ми мира Unix это набор узкоспе­циали­зиро­ван­ных ути­лит коман­дной стро­ки. Их мож­но при­менять как порознь, так и вмес­те: одна ути­лита исполь­зует резуль­таты работы дру­гой.

В набор вхо­дит более десят­ка ути­лит. Вот некото­рые из них:

  • Radare2 — собс­твен­но глав­ная тул­за, она спо­соб­на откры­вать боль­шое количес­тво раз­ных источни­ков вво­да‑вывода подоб­но обыч­ным фай­лам: дис­ки, сетевые соеди­нения, драй­веры, про­цес­сы под отладкой. Поз­воля­ет при помощи коман­дной стро­ки переме­щать­ся по фай­лу и занимать­ся дизас­сем­бли­рова­нием, поис­ком, ана­лизом, изме­нени­ем и срав­нени­ем дан­ных с воз­можностью визу­али­зации. Любой про­цесс под­дает­ся скрип­тингу на мно­гих язы­ках, сре­ди которых JavaScript, Ruby, Python и Lua.
  • Rax2 — ана­лиза­тор выраже­ний. Уме­ет делать базовые пре­обра­зова­ния меж­ду раз­ными фор­матами: стро­ками, зна­чени­ями с пла­вающей запятой, шес­тнад­цатерич­ными чис­лами и про­чими. Так­же под­держи­вает изме­нение поряд­ка сле­дова­ния бай­тов.
  • Rafind2 — поз­воля­ет вос­поль­зовать­ся биб­лиоте­кой r_search для поис­ка строк или бай­тов по мас­ке.
  • Rabin2 — показы­вает всю информа­цию о дво­ичном фай­ле: све­дения о сек­циях, заголов­ках, импорти­рован­ных дан­ных и про­чее. Понима­ет мно­го фор­матов исполня­емых фай­лов: PE, ELF, Mach-O, Java и дру­гие. С помощью пла­гинов этот спи­сок мож­но рас­ширить, пос­ле чего Rabin2 будет отоб­ражать сим­волы импорта и экспор­та, биб­лиотеч­ные зависи­мос­ти, стро­ки, адре­са точек вхо­да и тип архи­тек­туры.
  • Rarun2 — поз­воля­ет нас­тро­ить сре­ду для выпол­нения или отладки при­ложе­ний. Поз­воля­ет менять нас­трой­ки окру­жения, не зат­рагивая работу ОС. Осо­бен­но час­то исполь­зует­ся для пере­опре­деле­ния потока вывода отла­жива­емой с помощью Radare2 прог­раммы.
  • Rasm2 — встро­енный ассем­блер/дизас­сем­блер. Пер­воначаль­но инс­тру­мент был раз­работан для вне­сения изме­нений в бинар­ные фай­лы. Его основная фун­кция — получить бай­ты, соот­ветс­тву­ющие задан­ному опко­ду машин­ной инс­трук­ции. Rasm2 под­держи­вает пла­гины, что поз­воля­ет ему работать с фай­лами для раз­ных архи­тек­тур.
  • Radiff2 — тул­за для срав­нения дво­ичных фай­лов, подоб­но тому, как это дела­ет diff с тек­сто­выми фай­лами. Radiff2 исполь­зует раз­ные алго­рит­мы для поис­ка и срав­нения содер­жимого фай­лов.
  • Ragg2 — ком­пилиру­ет прог­раммы, написан­ные на собс­твен­ном язы­ке высоко­го уров­ня, в кро­шеч­ные бинар­ники для архи­тек­тур x86, x86-64 и ARM. Поз­воля­ет орга­низо­вать базовый блок для соз­дания переме­щаемых фраг­ментов кода, которые будут исполь­зовать­ся для внед­рения в целевые про­цес­сы при экс­плу­ата­ции. Хотя по умол­чанию Ragg2 ком­пилиру­ет свой собс­твен­ный язык Ragg2, так­же мож­но ском­пилиро­вать код на язы­ке C, исполь­зуя шелл‑коды GCC или Clang.
  • Rahash2 — c помощью боль­шого чис­ла алго­рит­мов под­счи­тыва­ет кон­троль­ную сум­му любых фай­лов, дис­ков или строк. Тул­за так­же спо­соб­на кодиро­вать и декоди­ровать дан­ные, исполь­зуя прос­тые опе­рации, такие как Base64, XOR и про­чие.
  • Rodeco — написан­ный на Rust деком­пилятор с ассем­бле­ра, получа­емо­го от Rasm2, на псев­до-C. К сожале­нию, до сих пор нежиз­неспо­собен: резуль­таты его работы край­не скром­ные. Поэто­му ути­лита не вклю­чена в стан­дар­тную пос­тавку фрей­мвор­ка.

Так как Radare2 — Unix-ори­енти­рован­ный фрей­мворк, все ути­литы в базовом вари­анте исполня­ются в коман­дной стро­ке. Одна­ко с Radare2 мож­но работать не толь­ко в кон­соль­ной сре­де: к услу­гам хакера есть нес­коль­ко гра­фичес­ких обо­лочек, объ­еди­няющих все инс­тру­мен­ты фрей­мвор­ка в мощ­ную инте­рак­тивную сре­ду. Сре­ди них осо­бую популяр­ность заво­ева­ли iaito и Сutter. Они очень похожи, пос­коль­ку вто­рой — форк пер­вого.

Инс­тру­мен­ты, вхо­дящие в Radare2, мож­но исполь­зовать в самых раз­ных ОС и иссле­довать код для раз­ных про­цес­сорных архи­тек­тур. Под­держи­вают­ся x86-64, ARM, MIPS, PowerPC, SPARC, Z80, MOS 6502 и байт‑код раз­ных вир­туаль­ных машин. Ана­лизи­ровать мож­но PE32, PE32+, ELF, ROM-фай­лы игро­вых прис­тавок и мно­гое дру­гое.

Хо­тя сами ути­литы Radare2 где толь­ко не работа­ют, инте­рак­тивные сре­ды под­держи­вают­ся лишь в основных дес­ктоп­ных ОС. Одна­ко даже кон­соль­ные ути­литы Radare2 удоб­ны в работе, если ты уме­ешь с ними обра­щать­ся. Так­же управлять Radare2 мож­но из веб‑обо­лоч­ки.

Изу­чив основные све­дения, перехо­дим к прак­тике, а точ­нее — к уста­нов­ке.

 

Установка

В отли­чие от прош­лой статьи, где я исполь­зовал Ubuntu, орга­низо­вывать экспе­римен­ты сегод­ня я буду в Debian Linux.

Пе­ред уста­нов­кой Radare2 в Debian мне пот­ребова­лось уста­новить gnu make, по умол­чанию его в дис­три­бути­ве не было. Луч­ше сра­зу уста­новить build-essential:

sudo apt-get install build-essential

Хо­тя мно­гие дис­три­бути­вы Linux содер­жат готовые к инстал­ляции пакеты Radare2, вер­сия из менед­жера пакетов может быть не самой новой, поэто­му можешь ска­чать пос­леднюю вер­сию с GitHub (заметим, что и обновлять в таком слу­чае даль­ше при­дет­ся вруч­ную):

git clone https://github.com/radareorg/radare2.git

За­пус­тим уста­нов­ку:

cd radare2
sudo sys/install.sh

Внут­ри под­катало­га binr находят­ся под­папки со все­ми перечис­ленны­ми выше ути­лита­ми.

Содержимое подкаталога binr
Со­дер­жимое под­катало­га binr

За­одно уста­новим vim, если его нет в сис­теме:

sudo apt install vim

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

 

Объект анализа

Итак, пред­ста­вим, что наш Linux находит­ся в далекой‑пре­дале­кой галак­тике и нам, геро­ям, нуж­но взло­мать сер­вак зло­дея‑работор­говца Джаб­бы Хат­та. Прог­рамма на этом сер­вере работа­ет на C, потому что Джаб­ба пред­почита­ет олд­скул.

Я пред­лагаю тебе ска­чать исходный код и, не изу­чая его, что­бы не под­гля­дывать в раз­гадку, сра­зу ском­пилиро­вать. Пер­вым делом кло­нируй репози­торий с мо­его GitHub. Далее ком­пилируй сер­вер для 64-бит­ной плат­формы, так как этот вари­ант для нас явно инте­рес­нее.

На­ходясь в катало­ге с исходни­ком нашего сер­вера, выпол­ним ком­пиляцию и сбор­ку:

gcc server.c -o server64.elf

На выходе получа­ем исполня­емый ELF-файл, над которым мы будем работать на про­тяже­нии статьи.

 

Запуск

Мы не зна­ем, что дела­ет утя­нутый у Джаб­бы исполня­емый файл, поэто­му вна­чале прос­то запус­тим его и пос­мотрим. Неиз­вес­тные фай­лы луч­ше все­го выпол­нять в изо­лиро­ван­ной сре­де, ведь в реаль­ной жиз­ни что толь­ко не при­ходит­ся отла­живать. Поэто­му я работаю в вир­туаль­ной машине, которая не содер­жит никаких цен­ных дан­ных, что рекомен­дую и тебе.

Итак, из катало­га HackThisServer запус­тим наш сер­вер:

./server64.elf

Ни­чего видимо­го не про­исхо­дит: веро­ятно, прог­рамма ждет обра­щения.

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

nc localhost 14884

В резуль­тате нас встре­тит экран авто­риза­ции.

Система канализации Джаббы
Сис­тема канали­зации Джаб­бы

Поп­робу­ем ввес­ти xakep. Сер­вер отве­тит: «These are not the droids you are looking for!». При этом сеанс netcat будет завер­шен.

 

Исследование: статический анализ

Ис­поль­зование Radare2 из коман­дной стро­ки похоже на работу с отладчи­ком GDB. Что­бы луч­ше усво­ить коман­ды R2, пред­лагаю пер­вое вре­мя исполь­зовать имен­но кон­соль­ный вари­ант, не при­бегая к помощи визу­аль­ных обо­лочек. Давай пос­мотрим, как из коман­дной стро­ки про­водить ста­тичес­кое иссле­дова­ние и динами­чес­кий ана­лиз бинар­ника.

 

Этап первый — подготовительный

Ос­тава­ясь в катало­ге с ELF-фай­лом, нат­равим на него дизас­сем­блер:

r2 server64.elf

Все пос­леду­ющие коман­ды будут выпол­нять­ся над ука­зан­ным фай­лом, поэто­му его имя боль­ше вво­дить не понадо­бит­ся.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии