Гид по реверсу. Тренируемся анализировать бинарные файлы на примере libexif

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

  • Примерный порядок действий для бинарного ресерча
  • Сбор информации о таргете и знакомство с бинарем
  • Фаззинг
  • Установка AFL++
  • Реверс
  • Eclipse-CDT
  • GDB
  • IDA Pro
  • Выводы

Ког­да я толь­ко начал вли­вать­ся в мир хакерс­тва, мне дико не хва­тало информа­ции, ее при­ходи­лось собирать по кру­пицам. В этом матери­але я пос­тарал­ся изло­жить то, чего мне тог­да не дос­тавало, — всю информа­цию по ревер­су в сжа­том и сис­темати­зиро­ван­ном виде. А для наг­ляднос­ти мы с тобой раз­берем боевую задачу — реверс прог­раммы libexif.

Эта статья нацеле­на на людей, которые пос­тепен­но вырас­тают из тас­ков на CTF катего­рии PWN и Reverse, хотят пощупать реаль­ные прог­раммы и понять, что такое нас­тоящий ана­лиз бинаря. Ресер­чи, которые пишут спе­циалис­ты извес­тных ком­паний, хороши, но боль­шинс­тво нович­ков не зна­ют, с чего начинать делать такое иссле­дова­ние, как тре­ниро­вать­ся и как заполу­чить стенд. Сегод­ня мы с тобой это испра­вим.

warning

Статья име­ет озна­коми­тель­ный харак­тер и пред­назна­чена для спе­циалис­тов по безопас­ности, про­водя­щих тес­тирова­ние в рам­ках кон­трак­та. Автор и редак­ция не несут ответс­твен­ности за любой вред, при­чинен­ный с при­мене­нием изло­жен­ной информа­ции. Рас­простра­нение вре­донос­ных прог­рамм, наруше­ние работы сис­тем и наруше­ние тай­ны перепис­ки прес­леду­ются по закону.

 

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

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

  • Сбор информа­ции о тар­гете:
    • что за бинарь, для чего он пред­назна­чен, для какой плат­формы, есть ли исходный код в откры­том дос­тупе, или это «чер­ный ящик»;
    • как собирать бинарь — есть ли setup.sh или install.sh, может, нуж­но прос­то ском­пилить при помощи GCC;
    • как им поль­зовать­ся: пос­мотреть воз­можнос­ти прог­раммы, что она дела­ет и как с ней вза­имо­дей­ству­ет поль­зователь.
  • Зна­комс­тво с бинарем — при­мене­ние средств пер­вично­го ана­лиза. Вот самые ходовые тул­зы:
    • file — сис­темная ути­лита, которая поз­воля­ет узнать тип дан­ных внут­ри фай­ла;
    • checksec — ути­лита, которая про­веря­ет пер­вичные средс­тва безопас­ности в бинаре;
    • xxd — отоб­ража­ет файл в виде шес­тнад­цатерич­ных кодов или выпол­няет обратное пре­обра­зова­ние;
    • strings — ути­лита, при­меня­емая для поис­ка печата­емых строк в дво­ичных фай­лах;
    • VirusTotal — бес­плат­ная служ­ба, ана­лизи­рующая подоз­ритель­ные фай­лы и ссыл­ки на пред­мет наличия вирусов, чер­вей, тро­янов и все­воз­можных вре­донос­ных прог­рамм;
    • DIE — ути­лита для опре­деле­ния типов фай­лов. Кто читал кни­гу «Вскры­тие покажет! Прак­тичес­кий ана­лиз вре­донос­ного ПО», тот дол­жен знать ути­литу.
  • Фаз­зинг прог­раммы (если это тре­бует­ся). Это тех­ника поис­ка потен­циаль­ных уяз­вимос­тей в авто­мати­чес­ком или полу­авто­мати­чес­ком режиме. Здесь нам помогут:
    • AFL++ — собира­ет информа­цию о пок­рытии для каж­дого изме­нен­ного вход­ного зна­чения и помога­ет обна­ружить новые пути выпол­нения и потен­циаль­ные баги;
    • LibFuzzer — фрей­мворк для обна­руже­ния оши­бок в коде, соз­данный в основном для тес­тирова­ния прог­рамм на C/C++, но под­держи­вает и дру­гие язы­ки;
    • са­мопис­ный фаз­зер — этот метод исполь­зует­ся, ког­да прог­рамма спе­цифич­ная или исполь­зовать извес­тные фаз­зеры не име­ет смыс­ла или нет воз­можнос­ти. При­мер можешь пос­мотреть в пос­те на codeby.net;
    • руч­ной фаз­зинг — по сути, прос­то тыкание прог­раммы, как в тас­ках на CTF. Ресер­чер прос­то пода­ет слу­чай­ные дан­ные прог­рамме вруч­ную.
  • Ре­верс. Этот шаг важен, и думаю, что пояс­нения тут не нуж­ны. Информа­ции в интерне­те пол­но, смот­ри, нап­ример, под­борку ста­тей «Ре­верс мал­вари». Здесь же перечис­лю основные ути­литы:
    • IDA Pro — это самая извес­тная прог­рамма для дизас­сем­бли­рова­ния, в пред­став­лении она не нуж­дает­ся. Как ей поль­зовать­ся, мож­но почитать, нап­ример, в кни­ге Рикар­до Нар­вахи The IDA Pro Book (дос­тупен лю­битель­ский перевод);
    • ImmunityDBG — отладчик прог­рамм для ОС Windows. Ска­чать мож­но на офи­циаль­ном сай­те;
    • EDB Debugger — кросс‑плат­формен­ный отладчик для AArch32/x86/x86-64. В дан­ный момент офи­циаль­но дос­тупен толь­ко на Linux, но уже готовят­ся пор­ты для FreeBSD, OpenBSD, macOS и Windows;
    • GDB Debugger — перено­симый отладчик про­екта GNU, работа­ет на мно­гих UNIX-подоб­ных сис­темах и помога­ет отла­живать мно­гие язы­ки прог­рамми­рова­ния, вклю­чая C/C++, Free Pascal, FreeBASIC, Ada, фор­тран и Rust;
    • Ghidra — этот фрей­мворк для ревер­са соз­дан в АНБ США и вклю­чает в себя набор пол­нофун­кци­ональ­ных высокок­лас­сных инс­тру­мен­тов ана­лиза прог­рамм. Работа­ет на Windows, macOS и Linux. Под­робнее о нем мож­но про­честь в стать­ях «Ghidra vs IDA Pro» и «Ghidra vs crackme»;
    • radare2 — сво­бод­ный кросс‑плат­формен­ный фрей­мворк для реверс‑инжи­нирин­га, вклю­чает дизас­сем­блер, шес­тнад­цатерич­ный редак­тор, ана­лиза­тор кода и про­чие полез­ности. Исполь­зует­ся при ревер­се, отладке вре­донос­ного ПО и про­шивок. Ска­чать мож­но с GitHub;
    • Eclipse-CDT — это прог­рамма для ревер­са, в которой мож­но пос­мотреть мес­то падения прог­раммы в исходном коде по фай­лу, который вызыва­ет краш.
  • На­писа­ние экс­пло­ита. Пишем код, который будет экс­плу­ати­ровать уяз­вимость. Здесь все зависит от тво­их уме­ний и пред­почте­ний, а так­же от того, что мы экс­плу­ати­руем и на какой плат­форме.
  •  

    Сбор информации о таргете и знакомство с бинарем

    Из наз­вания статьи ты уже зна­ешь, что будем пыв­нить libexif вер­сии 0.6.14. Давай поз­накомим­ся с нашим тар­гетом поб­лиже.

    Libexif — это биб­лиоте­ка для раз­бора, редак­тирова­ния и сох­ранения дан­ных EXIF, то есть зашитых в некото­рые изоб­ражения метадан­ных.

    Да­вай теперь най­дем какую‑нибудь прог­рамму с этой биб­лиоте­кой на роль подопыт­ного. Бла­го на прос­торах GitHub это­го доб­ра сколь­ко угод­но. Один из самых прос­тых вари­антов — прог­рамма exif. Это неболь­шая ути­лита коман­дной стро­ки для отоб­ражения информа­ции EXIF. Написа­на она как раз для того, что­бы демонс­три­ровать воз­можнос­ти libexif.

    Для начала ска­чаем и соберем тар­гет:

    mkdir libexif && cd libexif/ wget https://github.com/libexif/libexif/archive/refs/tags/libexif-0_6_14-release.tar.gz tar -xzvf libexif-0_6_14-release.tar.gz

    Со­бира­ем и уста­нав­лива­ем libexif:

    cd libexif-libexif-0_6_14-release/ sudo apt-get install autopoint libtool gettext libpopt-dev autoreconf -fvi./configure --enable-shared=no --prefix="$PWD/fuzzing_libexif/install/"make make install

    Биб­лиоте­ка готова, теперь ска­чаем и соберем исполь­зующую ее прог­рамму:

    cd $PWD/fuzzing_libexif wget https://github.com/libexif/exif/archive/refs/tags/exif-0_6_15-release.tar.gz tar -xzvf exif-0_6_15-release.tar.gz

    Со­бира­ем exif:

    cd exif-exif-0_6_15-release/ autoreconf -fvi./configure --enable-shared=no --prefix="$PWD/fuzzing_libexif/install/" PKG_CONFIG_PATH=$PWD/fuzzing_libexif/install/lib/pkgconfig make make install

    Пос­ле сбор­ки мож­но запус­кать прог­рамму.

    Да­вай поп­робу­ем и пос­мотрим, как прог­рамма работа­ет. Из опи­сания понят­но, что на вход нуж­но подать кар­тинку, поэто­му ска­чаем из того же репози­тория при­меры кар­тинок.

    mkdir in; mkdir out; cd inwget https://github.com/ianare/exif-samples/archive/refs/heads/master.zip unzip master.zip

    Ко­ман­да mkdir in; mkdir out; cd in соз­даст две дирек­тории: /in и /out, а затем перей­дет в дирек­торию /in. Эти пап­ки потом понадо­бят­ся нам при фаз­зинге.

    За­пус­каем прог­рамму:

    ./exif Canon_400.jpg

    И видим резуль­тат ее работы.

    От­лично! С работой прог­раммы разоб­рались.

     

    Фаззинг

    Те­перь нас­тало вре­мя фаз­зинга. Он поможет нам напасть на след потен­циаль­ных багов.

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

    Ответить

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