Angr — эму­лятор на сте­роидах. Он кросс‑плат­формен­ный и под­держи­вает боль­шинс­тво популяр­ных архи­тек­тур: с ним на Linux мож­но искать уяз­вимос­ти в PE32, а на Windows — ковырять про­шив­ки роуте­ров. В этой статье я на при­мере работы в Linux покажу, как его исполь­зовать.

Сим­воличес­кий эму­лятор поз­воля­ет раз­вернуть поиск дыр на 180 гра­дусов. Фаз­зинг, ска­жем, через AFL про­бует все воз­можные вход­ные дан­ные. Angr же, нап­ротив, переби­рает все воз­можные пути исполне­ния, вос­созда­вая вход­ные дан­ные, при которых мы дос­тигли инте­ресу­юще­го нас учас­тка кода.

Нап­ример, возь­мем код из моей статьи про Intel Pin:

#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
if (argc == 2)
{
if (strcmp(argv[1], "secret") == 0)
{
printf("You did it!\n");
}
else
{
printf("Better luck next time\n");
}
}
}

Пол­ный перебор шес­ти сим­волов пот­ребу­ет 256 в 6-й сте­пени попыток. Для Angr есть все­го одна раз­вилка: пой­ти налево или нап­раво. И он пой­дет и туда, и туда! Нам оста­ется лишь ска­зать ему, в какой момент оста­новить­ся и под­счи­тать вход­ные дан­ные.

import sys
import angr
import claripy
project = angr.Project('get_pass.bin')
arg = claripy.BVS('arg', 8*10)
initial_state = project.factory.entry_state(args=['./a.out', arg])
initial_state.options.add('SYMBOL_FILL_UNCONSTRAINED_MEMORY')
def is_successful(state):
stdout_output = state.posix.dumps(sys.stdout.fileno())
return b'You did it' in stdout_output
simulation = project.factory.simgr(initial_state)
simulation.explore(find=is_successful)
if simulation.found:
solution_state = simulation.found[0]
solution = solution_state.solver.eval(arg, cast_to=bytes).decode()
print('Password:', solution)

За­пус­тив скрипт, за секун­ду получа­ем иско­мый пароль.

$ python angr_get_pass.py
Password: secret

Не перес­казывая всю до­кумен­тацию, объ­ясню, что необ­ходимо для стар­та.

Пер­вым делом ста­вим Angr (пот­ребу­ется Python 3.8 или новее):

pip install angr

Angr спро­екти­рован для работы из кон­соли. Докумен­тация зачас­тую не рас­кры­вает всех воз­можнос­тей, так что советую изу­чать инс­тру­мент «живь­ем». По каж­дому объ­екту в инте­рак­тивном режиме мож­но получить справ­ку из docstring коман­дой help(project) (или project?, если у тебя iPython).

Поль­зовать­ся справ­кой мож­но так же, как и man: управле­ние — на стрел­ках, выход через q.

Ну а смот­реть поля и методы клас­сов удоб­но через авто­допол­нение: допиши к наз­ванию клас­са точ­ку и пару раз наж­ми Tab.

 

Основные концепции

Все начина­ется с клас­са Project, его соз­дание — это начало вза­имо­дей­ствия с Angr. Про­ект отве­чает за заг­рузку и пер­вичный ана­лиз.

Пе­реда­ем путь до иссле­дуемо­го фай­ла и, что­бы начать симуля­цию со стар­та прог­раммы, соз­даем новое сос­тояние через factory.entry_state. Фаб­рика соз­дает экзем­пля­ры основных клас­сов. Сос­тояние — это объ­ект SimState, фак­тичес­ки — сни­мок вир­туаль­ной машины. Он содер­жит блок кода, память, регис­тры, стек вызовов и дру­гие вещи, реали­зуемые как пла­гины к SimState.

initial_state.regs.rip
<BV64 0x401080>

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

Су­щес­тву­ет два основных типа: BVV (bit-vector value) и BVS (bit-vector symbol). Пер­вый пред­став­ляет кон­крет­ные зна­чения чисел. Вто­рой содер­жит толь­ко имя и раз­мер. Это осно­ва сим­воличес­кого исполне­ния, кон­крет­ного зна­чения здесь нет.

 

Базовые блоки

Каж­дое сос­тояние свя­зано с кон­крет­ным бло­ком кода. Мес­тный базовый блок — это набор инс­трук­ций, который закан­чива­ется коман­дой переда­чи управле­ния. Каж­дый шаг эму­ляции переме­щает нас к сле­дующе­му бло­ку, соз­давая новое сос­тояние.

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

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

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

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

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

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

    Подписаться

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