Управление гневом. Изучаем Angr — фреймворк символической эмуляции

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

  • Основные концепции
  • Базовые блоки
  • Управление симуляцией
  • Автоматический выбор путей
  • Символическое исполнение
  • Символические функции
  • Восстановление серийного номера
  • Выводы

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 timen"); } }}

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

import sysimport angrimport claripyproject = 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_outputsimulation = 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

Ответить

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