radare2-tm.jpg

Будет ли для вас новостью, или нет, всё ищу свободное время и новые форматы в которых смогу быть полезен вам. Недавно по мимо твиттера я завел телеграмм канал, но как и любая вещь где мы храним заметки и кучу ссылок на память, на посмотреть, оно накапливается и надо это все подытожить.

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

Как обычно мы работаем на опенсорсе без ida pro и прочего, не жили хорошо не надо и начинать)

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

Перевод шпаргалки

Свежую версию шпоры вы можете найти https://github.com/radare/radare2/blob/master/doc/intro.md

Radare2

Опции командной строки

-L
Список поддерживаемых плагинов для Ввода/Вывод
-q
Выйти после выполнения команд
-w
Разрешить запись
-i [file]
Запустить r2 сценарий(набор команд r2)
-A
Проанализировать исполняемый файл во время загрузки (xrefs, и.т.д.)
-n
Простая загрузка. Не загружать информацию о исполняемом файле как вводную (Он не проанализирует не поищет функции s и f команды пустые)
-c ‘cmds’
Запустить r2 и выполнить команды (т.е.: r2 -wqc’wx 3c @ main’)
-p [prj]
Создать проект для файла который будет анализироваться (CC добавить коммент когда файл откроется как проект)
Открыть r2 используя malloc плагин, который дает область в 512 байт где можно играться (размер может быть изменен) Схоже с r2 malloc://512

Опции конфигурации

Они могут использоваться в вычисления:? ${asm.tabs}

e
Возвращает все опции конфигурации
e <свойство>
Проверить значение определенного свойства: e asm.tabs => false
e <свойство>=<значение>
Изменить значение свойства: e asm.arch=ppc
e?
получить справку о указанной команде или свойстве : e? cmd.stack

Возможно вы захотите прописать понравившиеся вам опции в ~/.radare2rc тогда каждая линия прописанная там будет интерпретироваться в начале каждой сессии. Мои собственные для примера:

# Показывать комментарии справа от ывода дизассемблера если они вписываются в экран.
e asm.cmtright=true

# Показывать псевдокод в выводе дизассемблера. Т.е. mov eax, str.ok станет eax = str.ok
e asm.pseudo = true

# Solarized theme
eco solarized

# Использовать UTF-8 
# чтобы показывать крутые стрелочки в ASCII режиме
e scr.utf8 = true

Упрощенный интерфейс доступен из Визуального режима, просто введите Ve в консоли.

Основные команды

Синтаксис команд: [.][times][cmd][~grep][@[@iter]addr!size][|>pipe]

times — сколько раз повторить команду

;
Последовательность команд: x 3;s+3;pi 3;s+3;pxo 4;
|
Перенаправление команд оболочки: pd | less
!
Запуск команд оболочки: !cat /etc/passwd
!!
Выходит в командную оболочку, выполняет команду и отправляет вывод в буфер radare

Примечание: Двойной восклицательный знак говорит radare пропустить поиск в списки плагинов Вввода-Вывода привязки для данной команды и запустить её напрямую. Одиночный восклицательный знак смотрит список плагинов перед запуском.

`
Выполнение Radare команд: wx `!ragg2 -i exec`
~
Сокращение для grep
~!
Сокращение для grep -v
~[n]
выберает n-ый столбец вывода afl~[0]
~:n
выбирает n строк afl~:0
pi~mov,eax  		  ; линии с mov или eax
pi~mov&eax  		  ; линии с mov и eax
pi~mov,eax:6  		  ; 6 первых строк с mov или eax
pd 20~call[0]:0           ; из дизассемблированных 20 инструкций, выбрать первую колонку первой строки  содержащщей 'call'
.cmd
Выполнит вывод команды
is* Напечатает символы
.is* Вывполнит вывод команды и задаст символы в radare (обычно они уже заданы если только r2 не запускался с опцией -n)
..
Повторяет последние команды (аналогично вводу \n), странно он себя ведет
(
Используется для задания макросов
$
Используется для задания псевдонимом(alias)
$$
Раскрывается как текущий адрес курсора
@
Смещение является абсолютным, вы можете использовать $$ для относительного смещения @ $$+4
?
Вычислить выражение
[0x00000000]> ? 33 +2
35 0x23 043 0000:0023 35 00100011 35.0 0.000000

Примечание: | и & должны быть экранированы

?$?
Справка по переменной используемой в выражении
$$
Адрес текущего расположения
$s
Размер файла в байтах(шестнадцатеричный вывод)
$b
Размер блока в байтах
$l
Длинна опкода в байтах
$j
Если $$ это jmp, $j это адрес куда произойдет перемещение после jump
$f
Тоже что jmp на адрес невыполнения условной инструкции
$m
Адрес памяти используемый в опкоде (т.е. mov eax,[0x10] => 0x10)
???
Справка для команды ?
?i
Берет все что пришло со стандартного потока ввода. Т.е. аналог считывания значений введенных пользователем ?i username
??
Результат предыдущих операций
?s from to [step]
Генерирует последовательность от(from) до(to) с шагом(step): ?s 1 10 2 => 1 3 5 7 9
?p
Получить физический адрес для данного виртуального адреса
?P
Получить виртуальный адрес для данного физического адреса
?v
Показать шестнадцетеричное значение математического выражения

Предположу что ?p ?P применимы в режиме отладки когда программа загружена и выполняется на устройстве а значит у неё есть виртуальные и реальные адреса.

?v 0x1625d4ca ^ 0x72ca4247 = 0x64ef968d
?v 0x4141414a - 0x41414140  = 0xa

?l str: Вернет длину строки @@: Используется для последовательностей

wx ff @@10 20 30      Запишет ff на адреса смещенные на 10, 20 и 30
wx ff @@`?s  1 10 2`  Запишет ff на адреса смещенные на 1 3 5 7 9
wx 90 @@ sym.*        Записывает nop на место каждого символа(у меня не сработало)

Позиционирование

s адрес: Переместить курсор к адресу или символу

  • s-5 (5 байт назад)
  • s- (undo)отменить перемещение
  • s+ (redo)повторить перемещение

Размер блока

Размер блока это значение по умолчание для того что отображает radare. Все команды работаю с этим ограничением, но вы всегда можете временно изменить размер блока задав числовой аргумент ,например для команды print, (px 20)

b size : Изменит размер блока

Вывод в JSON

Большинство команд таких как (i)nfo и (p)rint принимают аргумент j для преобразования их вывода в json

[0x100000d78]> ij
{"bin":{"type":"mach0","class":"MACH064","endian":"little","machine":"x86 64 all","arch":"x86","os":"osx","lang":"c","pic":true,"canary":false,"nx":false,"crypto":false,"va":true,"bits":64,"stripped":true,"static":false,"linenums":false,"syms":false,"relocs":false},"core":{"type":"Executable file","os":"osx","arch":"x86 64 all","bits":64,"endian":"little","file":"/bin/ls","fd":6,"size":34640,"mode":"r--","block":256,"uri":"/bin/ls","format":"mach064"}}

Анализ

aa
Проанализировать все (fcns + bbs) тож что запустить r2 с -A
ahl <length> <range>
подменить длину(length) опкода для диапазона байтов
ad
Проанализировать данные ad@rsp (проанализировать стек)

Анализ функций (в терминале)

af
Анализ функций
afl
Список всех функций количество всех функций: afl~?
afi
Возвращает информацию о функции в которой мы находимся в данный момент
afr
Переименовать функцию: меняет структуру и метку
afr off
Восстановить функции им на то что присвоил при анализе r2
afn
Переименовать функцию afn strlen 0x080483f0
af-
Удалить метаданные генерированные при анализе функции
af+
Задать функцию вручную задав стартовый адрес и длину af+ 0xd6f 403 checker_loop
axt
Возвращает внешние(перекресные)ссылки которые ссылаются на функцию (xref to)
axf
Возвращает внешние(перекресные)ссылки на которые ссылается функция (xref from)

Анализ функций (в визуальном режиме)

  • d, f: Анализ функций
  • d, u: Удалить метаданные генерированные при анализе функции

Анализ опкодов:

ao x
Проанализировать x опкодов с указанного смещения
a8 bytes
Проанализировать инструкции указанные в заданных байтах

Информация

iI
Информация о файле(сходна с выводом rabin)
iz
Строки в секции данных
izz
Строки во всем бинарнике
iS
Список секций iS~w возвращает список редактируемых секций
is
Идентификаторы(Symbols) is~FUNC показывает функции, хотя у меня на примере функций через afl было на одну больше чем чере is возможно дело в inline функции
il
Слинкованные(связанные) библиотеки
ii
Импорты(импортированные функции)
ie
Точка входа

Mitigations:

  • i~pic : проверяем на наличие position-independent-code
  • i~nx : проверяем на наличие non-executable stack
  • i~canary : проверяем на наличие канареек

Настоящая проверка производится на этапе анализа это лишь проверка вывода i

Получаем адрес функции в GOT:

pd 1 @ sym.imp<funct>

Вернет jmp [addr] где addr это адрес функции в the GOT. Тоже самое что выполнить

objdump -R | grep <func>

Print/Вывод информации

psz n @ offset
Вывести n нуль-терминированных строк
px n @ offset
Вывести hexdump (или просто x) n байт
pxw n @ offset
Вывести hexdump n машинных слов (n — это байты) pxw size@offset печатает шестнадцетеричные слова по адресу
pd n @ offset
Вывести n дизассемблированных опкодов
pD n @ offset
Вывести n дизассемблированных байт
pi n @ offset
Вывести n дизассемблированных инструкций (без адресов, ссылок, комментов, только инструкции)
pdf @ offset
Вывести дизассемблированную функцию pdf~XREF (grep :: XREFs) pdf~call (grep :: calls)
pcp n @ offset
Напечатать n байт в виде строки на python

pcp 0x20@0x8048550
import struct
buf = struct.pack ("32B",
0x55,0x89,0xe5,0x83,0xzz,0xzz,0xzz,0xzz,0xf0,0x00,0x00,
0x00,0x00,0xc7,0x45,0xf4,0x00,0x00,0x00,0x00,0xeb,0x20,
0xc7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xzz,0xzz)
p8 n @ offset
Вывести n байт (8бит) (только байты ни строк, ни адресов)
pv
Вывести столько байт, сколько записано в asm.bits (автоматически определяется)
pt
Интерпретировать байты как даты
pf
Вывести байты согласно заданному формату(структуры всякие с полями)
pf.
Вывести список заданных форматов
p=
Вывести граф энтропии (непонятно описание гласит как показать байты текущего блока в виде столбцов, это довольно странная инструкция в webgui есть анализ всего файла на процент данных и кода а это непонятно как применять)

Запись

wx
Записать шестнадцетеричное значение с указанного смещения wx 123456 wx ff @ 4
wa
Записать ассемблер wa jnz 0x400d24
wc
Работает с изменениями, занося их в кеш, который может быть записан. Для работы необходимо установить параметр io.cache=true
wv
Записывает значение выбранного размера(1,2,4,8 байт)
wo[x]
Записать результат выполнения математической операции wow 11223344 @102!10 записать закольцованное значение от адреса 102 до 102+10 результат ниже 0x00000066 1122 3344 1122 3344 1122 0000 0000 0000 wox 0x90 Произвести XOR текущего блока и 0x90. Эквивалентно записи wox 0x90 $$!$b (записывать с текущей позиции и на весь блок) wox 67 @4!10 Произвести XOR байтов с 4 по 10 с числом 67
wf file
Записывает содержание файла с текущего адреса или смещения (только ASCII символы)
wF file
Записывает содержание файла с текущего адреса или смещения
wt file [sz]
Записать в файл (с текущего положения, блок или указанное количество байт) Т.е.: Сдампить в ELF файлы куски поиска wt @@ hit0* (т.е. результаты поиска ELF заголовков: \x7fELF)
woO 41424344
get the index in the De Bruijn Pattern of the given word -слишком криптоанализ

Флаги

Флаги это метки для смещений. Они могут быть сгруппированы в пространства имен, такие как sym для символов, obj для объектов итд …

f
Список флагов
f label @ offset
Задать метку `label` по указанному смещению f str.pass_len @ 0x804999c
f -label
Удалить метку
fr
Переименовать метку
fd
Показывает какой флаг установлен по текущей позиции или указанному адресу/смещению
fs
Показывает все пространства имен для флагов
fs flagspace
Выбрать или создать пространство имен для флагов(меток), перемещение меток производится командой fsm

yank & paste

y n
Копирует n байт с указанной позиции в спец буфер
y
Просмотр того что скопировано в буфер с указанием адресов и размера блоков которые были скопированы.
yp
Напечатать содержание буфера обмена
yy offset
Вставить содержание буфера обмена по указанному смещению
yt n target @ source
Скопировать n байт из source в target адрес

Визуальный режим:

V войти в визуальный режим

q
Выйти из визуального режима
hjkl
перемещение(или HJKL) (left-down-up-right)
o
перейти на выбранное смещение (либо абсолютный перенос относительный +10)
?
Справка
.
Seek EIP seek to program counter (для режима отладки? )
<enter>
Перейти по адресу указанного в текущей инструкции jump/call
:cmd:
Ввести radare команды. Т.е.: x @ esi
d[f?]
Задайте то что находиться под курсором как строку, данные, код, функцию или просто удалите существующее определние dr: Переименовать функцию df: Проанализировать функцию
v
Перейти в меню визуального анализа кода для того чтобы поближе рассмотреть/отредактировать текущую функцию.
p/P
Смена режимов визуализации

  • hex, шестнадцетеричное представление
  • disasm, дизассемблированный код Используйте числа в [] для перемещения к позиции где заканчивается jump Используйте «u» чтобы вернуться обратно
  • debug, режим дебагера
  • words, буфер представления в виде шестнадцетеричных слов
  • annotated, шестнадцетеричное представление с комментариями
c
Переводит в режим курсора или выходит из него

  • Shift+[hjkl] : Выделение
  • i: Перевести в режим правки
  • a: Ввести ассемблер одной строкой(команды разделяются запятыми)
  • A: Ввести ассемблер в визуальном режиме(удобнее рассчитывать слова, и показывает изменения в коде)
  • y: Копировать
  • Y: Вставить
  • f: Создает флаг в месте где расположен курсор
  • <tab> в шестнадцетеричном виде перемещение между гексагональным окном и окном с колонками строк
V
Показывает блочный граф текущей функции в консоли
x, X
XREFs текущей функции. («u» вернуться обратно), то ли оно плохо работает то ли у меня примеры так себе.
t
Справка по символам, здесь показано как pf понимает типы данных (нужно для задания структур)
gG
Начало или конец файла
;[-]cmt
Добавить/удалить коммент
m<char>
Задать закладку(работает глючно)
‘<char>
Переместится к указанной закладке

HUD

— _
Показать HUD
backspace
Выйти HUD

Вы можете добавлять свои команды в HUD прописав их в: radare2/shlr/hud/main

ROP

ROP — подробнее, о нем и о гаджетах в словаре.

/R
показывает куски кода которые можно использовать для ROP атак
/R opcodes
Ищет опкоды среди доступных кусков кода. /R pop
/Rl opcodes
Ищет опкоды и возвращает их в виде линии разделенным ; команд ассемблера /Rl jmp eax,call ebx
pda
Возвращает библиотеку гаджетов которые можно использовать. Эти гаджеты получаются путем разборки бинарного файла побайтово, вместо того чтобы использовать стандартные для архитектуры длины опкодов(Мы можем использовать адрес любого байта а не обязательно кратный, как в выводе /R)

Глубина поиска может быть настроена следующим свойством:

e search.roplen = 4  (измените глубину поиска, чтобы его ускорить)

Поиск

/ bytes
Искать байты /x 7fELF
/a
Искать указанную инструкцию ассемблера /a jmp eax

Пример: Поиск начала функции:

push ebp
mov ebp, esp

Опкоды этих инструкций: 5589e5

/x 5589e5
	[# ]hits: 54c0f4 < 0x0804c600  hits = 1
	0x08049f70 hit0_0 5589e557565383e4f081ec
	0x0804c31a hit0_1 5589e583ec18c704246031
	0x0804c353 hit0_2 5589e583ec1889442404c7
	0x0804c379 hit0_3 5589e583ec08e87cffffff
	0x0804c3a2 hit0_4 5589e583ec18c70424302d

pi 5 @@hit* (Показать 5 первых инструкций от каждого результата поиска)

Также возможно запускать команду для каждого результата поиска. Используйте свойство cmd.hit :

e cmd.hit=px

Комментарии и определения

Эти команды советую использовать вместе с командами работы с проектами P? Об этом ниже.

Cd [size]
Задать указанные байты как данные
C- [size]
Убрать то что задано как данные и пометить как код
Cs [size]
Задать как строку
Cf [size]
Задать как структуру, подробнее смотреть команду pf Вы можете задать структуру которая будет отображаться в выводе дизассемблера.
CC
Список всех определений или комментариев, или добавить комментарий в консольном режиме

  • C* Показать все комментарии/метаданные
  • «CC <comment>» добавить новый коммент, обратите внимание на кавычки, надо ими выделять не только текст, но и команду — особенность парсера радара
  • СС- удалить комментарий

Пример маркировки данных

radare-px-detect.png

radare-pd-before.png

Пример, добавляем строку, в нашем примере взят hex file в отличие от elf в нем мало доп информации, и анализатор к тому же сам не выделил строки в секции данных. При визуальном осмотре видно что px показывает строку. Давайте зададим её командой Cs 24 , теперь вы можете поместить метку или флаг на указанный адрес f str.product 24 а также сохранить измения в файле проекта Ps

radare-pd-after.png

Magic files

Определение типов файлов, libmagic определяет тип файлов находя определенные последовательности, «магических чисел» специфичных для данных файлов.

pm: Вывести данные на основе анализа Magic файлов. [0x00000000]> pm 0x00000000 1 ELF 32-bit LSB executable, Intel 80386, version 1

Тоже поиск всяких волшебных числе и прочего помогающего анализа magic numbers

/m [magicfile]
Поиск заголовков магических чисел с libmagic сверяя загруженный файл и указанный в команде.

Поиск можно контролировать следующими свойствами:

search.align
search.from (0 = beginning)
search.to (0 = end)
search.asmstr
search.in

Yara

Что такое Yara описано здесь ,на случай если потеряется «инструмент для помощи исследователям малвари в идентификации и классификации вредоносных семплов. Исследователь может создать описания для разного типа зловредов, используя текстовые или бинарные паттерны, в которых описываются формализованные признаки малвари. Таким образом получаются сигнатуры. »

Yara также может быть использована для определения типов файлов, типов компиляторов, выявления шелкодов, защит итд.

:yara scan

Zignatures

Zignatures используются для работы с обрезанными/вычищенными бинарниками. Вы можете взять не вычищенный бинарник, запустить zignatures на нем и добавить вывод к другому бинарнику который статически скомпилирован с теми же библиотеками.

zg <language> <output file>
Сгенерировать сигнатуры т.е :: zg go go.z

Запустить сгенерированный скрипт для загрузки сигнатур т.е :: . go.z

z
Просмотр загруженных сигнатур

Сигнатуры добавляются в виде коментов:

r2-(pid2)> pd 35 @ 0x08049adb-10
|          0x08049adb   call fcn.0805b030
|             fcn.0805b030(unk, unk, unk, unk) ; sign.sign.b.sym.fmt.Println
|          0x08049ae0   add esp, 0xc
|          0x08049ae3   call fcn.08095580

Сравнение

Команда c служит для сравнения байтов, дизассемблерных команд и прочего. Так например можно сравнить файлы(но не нужно).

r2 -m 0xf00000 /etc/fstab	; Открыть исходный файл с смещением адресов 0xf00000
o /etc/issue  			; Открыть file2 со смещением 0
o  							; Список файлов.
- 0 6 crackme0x02 @ 0xf00000 ; r size=7499 
- 1 8 ./02 @ 0x0 ; r size=7499
cc offset: Сравнение шестнадцетеричного представление между блоком взятым с текущим положением и указанным смещением "offset"

radare-compare-bytes.png

Странный пример загруженный файл также располагается в памяти в результате если не просмотреть адреса и вручную все правильно не расставить ,так как адрес в памяти отличается от того что загружен. + команды перехода jmp call тоже сбиваются, так как размещены в памяти.

Графы

Простые блок диаграммы. Нужен graphviz и xdot на linux.

af
Проанализировать функцию
ag $$ > a.dot
Занести граф сформированный на dot(Graphviz) в файл
ag $$ | xdot
Показать данный граф в утилите xdot(не работает), можете !xdot a.dot сделать

Граф вызовов

af
Проанализировать функцию
agc $$ > b.dot
Показывает граф кого вызывает эта функция
agC $$ > b.dot
Показывает показывает все вызовы программ между собой

Преобразование .dot в .png

dot -Tpng -o /tmp/b.png b.dot

Создание графа функции main файла:

radiff2 -g main crackme.bin crackme.bin > /tmp/a
xdot /tmp/a

Отладчик

Запустить r2 в режиме отладчика. r2 запустит программу и подсоединиться к ней

r2 -d [pid|cmd|ptrace] (если команда запуска содержит пробелы, используйте кавычки: r2 -d «ls /»)

ptrace://pid (не уведомлять бэкэнд отладчика, а только получить доступ к памяти к загруженной памяти)

Передать программе аргументы:

r2 -d rarun2 program=pwn1 arg1=$(python exploit.py)

Передать программе поток ввода от:

r2 -d rarun2 program=/bin/ls stdin=$(python exploit.py)

Команды:

do
Переоткрыть программу для отладки
dp
Показать отлаживаемые процессы, процессы потомки и треды
dc
Завершить отладку(или продолжать до точки останова)
dcu <address or symbol>
Continue until symbol (sets bp in address, continua until bp and remove bp)
dc[sfcp]
Продолжать пока не произойдет системный вызов(т.е : чтение), форк, вызов call, адрес в программе (чтобы выйти из библиотеки)
ds
Перейти на шаг(инструкцию)
dso
Перейти поверх n инструкций(не заходя в функции call)
dss
Пропустить инструкций
dr register=value
Изменить значение в регистре
dr(=)?
Показать значение в регистрах
db address
Установить точку останова по указанному адресу
db sym.main добавить точку останова в sym.main
db 0x804800 добавить точку останова 
db -0x804800 удалить точку останова
dsi (условный шаг)
Т.е. «dsi eax==3,ecx>0»
dbt
Показать backtrace(см словаре)
drr
Отобразить в цветах и словах все ссылки из регистров или памяти
dm
Показывает карту памяти (* обозначает текущий раздел)
[0xb776c110]> dm
sys 0x08048000 - 0x08062000 s r-x /usr/bin/ls
sys 0x08062000 - 0x08064000 s rw- /usr/bin/ls
sys 0xb776a000 - 0xb776b000 s r-x [vdso]
sys 0xb776b000 * 0xb778b000 s r-x /usr/lib/ld-2.17.so
sys 0xb778b000 - 0xb778d000 s rw- /usr/lib/ld-2.17.so
sys 0xbfe5d000 - 0xbfe7e000 s rw- [stack]

Следить за процессами потомками в forks (set-follow-fork-mode в gdb)

dcf
продолжать пока не случиться форк

затем используйте dp для выбора процесса что вы собираетесь отладить

Отладка в стиле PEDA: drr;pd 10@-10;pxr 40@esp

Отладка в визуальном режиме

  • Поставить/убрать точку останова F2
  • Шаг вперед F7 (s)
  • Шаг через(т.е. если вызвана функция он отработает и шагнет дальше)F8 (S)
  • Продолжать до останова F9

radare-visual-debug.png

WebGUI (Enyo)

Есть поддержка Webgui

  • -c=h: Запустить сервер
  • -c=H: Запустить сервер и открыть процесс в браузере

Мои заметки

Про полный анализ

Вот кстати что происходит при запуске полного анализа

> aaaa
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze len bytes of instructions for references (aar)
[x] Analyze function calls (aac)
[x] Emulate code to find computed references (aae)
[x] Analyze consecutive function (aat)
[aav: using from to 0x8048000 0x8049d9c
Using vmin 0x8048000 and vmax 0x804a020
aav: using from to 0x8048000 0x8049d9c
Using vmin 0x8048000 and vmax 0x804a020
[x] Analyze value pointers (aav)
[Deinitialized mem.0x100000_0xf0000 functions (afta)unc.* functions (aan)
[x] Type matching analysis for all functions (afta)
[x] Type matching analysis for all functions (afta)

В общем помните, каждый из этих анализов это отдельный ,»плагин» так что не факт что он написан под вашу архитектуру и формат бинарного файла.

Пакетный менеджер

Он есть в нем много всего но это много может просто не поставится и не заработать Прежде чем работать после установки radare из git вы должны активировать пакетный менеджер

r2pm init
r2pm -i www-p # поставить программу
r2pm -u www-p # удалить программу
r2pm -s # список всех программ
r2pm -l # список установленных программ

Интерфейс ASCII + commandline

radare-ascii-interface.gif

Описание того что изображено на экране обычно указано в команде наверху там например режим ниже выводится командой pxA После чего надо посмотреть справку по данному режиму pxA?

[0x080483d0]> pxA?
Usage: pxA [len]   # f.ex: pxA 4K
 mv    move,lea,li
 ->    push
 <-    pop
 io    in/out ops
 $$    int/swi/trap/new
 ..    nop
 +-*/  math ops
 |&^   bin ops
 <<>>  shift ops
 _J    jump
 cJ    conditional jump
 _C    call
 _R    ret
 ==    cmp/test
 XX    invalid

Вот так выглядит режим псевдографов, между блоками можно перемещаться клавише TAB

radare-ascii-graph.gif

Цвета и подсветка

По поводу цветов и раскрасок, чтобы понять какой цвет чему соответствует а также настроить этот параметр , понадобиться команда ec

Графический интерфейс

webgui

Если запустить сервер разработки(=h) и отправится http://localhost:9090/ то мы увидим окно выбора

radare-web-gui-switch.png

Непонятно для планшетов для кого сделано, а интерфейсов 4 штуки, ниже показаны их названия в пакетном менеджере, а также проблемы которые возникли при установке www-p

r2pm init
www-enyo     	 [r2-www] The enyo WebUI of /m
www-m     	 [r2-www] The Material WebUI of /m
www-p     	 [r2-www] The panel WebUI of /p
www-t     	 [r2-www] The tiled WebUI of /t

r2pm -i www-p
# /usr/bin/env: ‘node’: No such file or directory
sudo ln -s /usr/bin/nodejs /usr/bin/node
cd /home/user/.config/radare2/r2pm/git/radare2-webui/www/p/
npm install merge-stream
r2pm -i www-p

Все gui недопиленные

radare-web-gui.png

Вот это основное webgui www-m на которое вас перекидывает по умолчанию оно странное, особенно эти кружки для консоли ^ и $

radare-web-gui-enyo.png

Это относительно работающее www-enyo GUI. В некоторых пунктах честно сказано что это ещё нереализовано

radare-web-gui-callgraph.png

Из красивых вещей реализованных в интерфейсе, которые здорово было бы увидеть в консоли, вывод общего графа вызовов в удобной интерпретации.

radare-web-gui-panel.png

www-p Это самое дизайнерски и интерфейсно красивое, но увы неработающее, а так как оно ещё и связано с проектом Qt GUI для radare, то я подозреваю проблема в моей сборке радара и нарушениях.

Но честно мне все равно, юнит тесты пусть делают.

Вот так должен выглядеть в идеале panel интерфейс. http://radare.today/posts/the-new-web-interface/

radare-web-gui-tile.png

www-t А это tile интерфейс, не знаю нелюбитель, тайловый интерфейс в браузере это по мне изврат, естьж е консоль?

iatio

radare-iaito-interface.png

Динамично развивающейся gui которому нужен последний Qt 5.6 а может и больше, в общем когда у меня был 5.5, я его собирал, но он не смог показать вывод дизассемблера. Может из-за того что он базируется на gui www-panel а там у меня дизассемблера не получилось.

https://github.com/hteso/iaito

r2pipe или скриптование

Скорее всего модуль привязки у вас есть ,если нет можно поставить привязку к выбранному языку через r2pm

Пример программы

import r2pipe
r2 = r2pipe.open('ihex://full.hex', ['-a', 'avr'])
r2.cmd('aa')
print r2.cmd('pdf')

Ну и мы видим что ничего особо заучивать не надо, вам доступна консоль r2 через команды cmd и cmdj, вторая выводится в json

Декомпиляция

Теоретически такая вещь как декомпиляция, в radare может появится пока проделан путь от преобразование вашего кода в некий универсальный ассемблер ESIL , также поддерживается отладка на этом языке.

Теоретически к radare пишется декомпилятор radeco который должен будет переводить ESIL ассемблер в код на выбранном языке.

По теме: https://xakep.ru/2016/01/27/esil-radeco-il/

Пример простой ассемблерной программы

Листинг 4.6 книга Искусство дизассемблирования Крис Касперски 2008

На x86_64 заработало после: apt-get install libc6-dev-i386

Компиляция: gcc -m32 demo-asm-libc.S -o demo-asm-libc

и ещё пришлось изменить data секцию

.text

.global main                    // Объявляем глобальную метку main


main:
        pushl   $len            // Длинна строки
        pushl   $msg            // Указатель на строку
        pushl   $1              // stdout
        call    write           // Функция записи
        addl    $12,%esp        // Выталкиваем аргумент из стека

        ret                     // Возвращаем стартовый код

.data
msg:    
        .ascii  "Hello world!\n" // Строка для вывода
        len = . - msg            // Вычисление длины строки

Словарик

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

 LDI Rd,K 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 PC ← PC + 1
16-bit Opcode:
1110 KKKK dddd KKKK

Операция перемещает напрямую в выбранный регистр с r16-r31 число от 0-255

xref — перекресные ссылки в самой программе(объекты , внешние вызовы)

pointers — указатели

Trampolines (sometimes referred to as indirect jump vectors) are memory locations holding addresses pointing to interrupt service routines, I/O routines, etc. Execution jumps into the trampoline and then immediately jumps out, or bounces, hence the term trampoline.

bbs — bytes blocks

ropВозвратно-ориентированное программирование в общем, своими словами различные методы заставить перезаписать адрес возврата функции и исполнить кода, вновь записанный или собранный из кусков слинкованных библиотек.

Получив контроль над стеком вызовов атакующий выполняет последовательность кусков кода гаджетов. Гаджет некий набор инструкций уже находящихся в коде и заканчивающийся символами возврата.

rop chain — В своём изначальном варианте для платформы x86, гаджеты представляют собой цепочки последовательно расположенных инструкций без переходов, завершающиеся инструкцией ближнего возврата.

disassembler — программа преобразующая бинарные коды в ассемблер, сразу файл дизассемблировать не удастся, сначала необходимо понять что это за файл на основе его сигнатур/волшебных числе(см ниже)

Sections — Тут зависит от типа файла и что он позволяет, для ELF файлов например вот.

Linked libraries — связанные(слинкованные) с программой библиотеки

Imports — внешне импортированные куски программы

Entrypoint — Точка входа — адрес в оперативной памяти, с которого начинается выполнение программы. Другими словами — адрес, по которому хранится первая команда программы. Однако не надо путать её с «первыми командами» программы на языке высокого уровня. Например программа на C++ начинает выполнение с функции «main()», на самом деле, программа в памяти начинается далеко не с первой команды функции «main()».

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

Типы адресов:

  • Реальный (англ. real address) — адрес местоположения данных в реальной памяти.
  • Виртуальный (англ. virtual address) — адрес в виртуальной памяти, при использовании преобразуется в реальный адрес.
  • Логический (англ. logical address) — адрес, определяемый программой путём преобразования ключа данных по некоторому алгоритму; адрес в виртуальной памяти.
  • Адрес устройства (англ. unit address) — логический адрес, состоящий из номера канала и номера устройства в канале.
  • Физический (англ. physical address) — число, идентифицирующее ячейку или область физической памяти; уникальное имя, однозначно определяющее конкретное внешнее устройство.

Программы

  • Адрес точки входа (англ. entry point address) — адрес команды либо сама команда, с которой начинается выполнение программы или процедуры.
  • Адрес вектора прерываний (англ. interrupt vector address) — уникальный адрес, указывающий на ячейки памяти, содержащие адрес программы обработки прерываний (и, возможно, дополнительные данные вроде приоритета обработки).

Машинный язык

  • Адрес перехода (англ. branching address) — адрес ячейки памяти, определяемый командой передачи управления.
  • Адрес возврата (англ. return address) — адрес в вызывающей программе, по которому передаётся управление после завершения вызываемой программы (см. также: Стек вызовов).
  • Адрес операнда (англ. source address) — адрес ячейки или области памяти, откуда извлекаются обрабатываемые данные.
  • Адрес результата (англ. result address) — адрес, куда записывается результат операции, выполняемой машинной командой.
  • Адрес регистра (англ. register adress) — порядковый номер либо символическое имя регистра, эквивалентное его номеру.
  • Исполнительный (действительный; англ. effective (executive) address) — адрес операнда команды, содержащийся в ней или вычисляемый на основе содержимого её полей.

Mitigations — Mitigation of Advanced Code Reuse Attacks код размещенный в бинарнике который злоумышленники могут использовать для совершения атак

pic — Код, не зависящий от адреса

nx — Не исполняемый стэк

Канарейка — Канарейка в стеке защищает его будучи помещенной в критические места памяти (около адресов возврата, которые являются критическими местами в стеке, указывая компьютеру какие команды выполнять после завершения текущей функции). Перед использованием адресов возврата программа проверяет в порядке ли «канарейка». Если «канарейка» уничтожена, программа завершает работу, сообщая об ошибке.

Идея использования «канареек» принадлежит группе разработчиков Linux, создавших версию Linux (Immunix.com), использующую Stackguard для встраивания «канареек» в операционную систему и прилагающиеся программы. Новый компилятор Microsoft для среды Visual C тоже имеет возможность добавлять «канареек» в стек.

GOT table — Global Offset Tables — глобальная таблица смещений. https://habrahabr.ru/post/106107/

PLT (Procedure Linkage Table) — это таблица компоновки процедур. Она присутствует в исполняемых и разделяемых модулях. Это массив заглушек, по одной на каждую импортируемую функцию.

Zero terminated String — Нуль-терминированная строка или C-строка (от названия языка Си) или ASCIZ-строка (от названия директивы ассемблера .asciz) — способ представления строк в языках программирования, при котором вместо введения специального строкового типа используется массив символов, а концом строки считается первый встретившийся специальный нуль-символ (код ASCII 0x00)

Symbolsтаблица символов, спец структура содержащая доп. сведения о переменных функциях и прочем в файле, может быть удалена или отсутствовать.

Магические числа — Другой способ определения формата файла, широко используемый в UNIX-подобных операционных системах, заключается в том, чтобы сохранить в самом файле некое «магическое число» (сигнатуру) — последовательность символов, по которой может быть опознан формат файла. Первоначально этот термин использовался для специального набора 2-байтовых идентификаторов, сохраняемых в начале файла (эта практика перекочевала и в другие ОС, например, MZ в MS-DOS), однако, любая последовательность символов, характерная для данного формата, может быть использована как «магическое число». Формат файла

Backtrace (так же называют «stack trace») — это список вызванных приложением функций во время сбоя приложения. Этот список может быть полезен при разрешении проблемы. Так как позволяет разработчикам узнать в какой функции произошёл сбой.

Выводы

radare динамично развивающийся хакерский софт, пишется он быстрее чем тестируется, поэтому какой-то документации вам будет не хватать, что-то будет глючить, api поменяется. Но выбора особо нет. (НЕТ?!)

Если Вы смогли собрать и завести все веб интерфейсы, сообщите как у Вас это вышло.

В следующий раз(в этой области) поговорим о radare avr, опять переведем руководство и дополним.

Да эта статья не памятник она редактируется, так что если что устарело пишите в комментариях. Надо будет ещё какой обратной канал связи придумать… если это кому интересно.