Будет ли для вас новостью, или нет, всё ищу свободное время и новые форматы в которых смогу быть полезен вам. Недавно по мимо твиттера я завел телеграмм канал, но как и любая вещь где мы храним заметки и кучу ссылок на память, на посмотреть, оно накапливается и надо это все подытожить.
В сети множество описаний crackme, а может чуть подробных инструкций по работе с радаром. Но всё время чего то не хватает. Наверное потому что как новичок ничего не понимаю в терминах и методологии. Поэтому тут небольшой перевод с моими дополнениями.
Как обычно мы работаем на опенсорсе без ida pro и прочего, не жили хорошо не надо и начинать)
Но мне всегда было интересно как люди реверсят программы, именно реверс не кряк, а полноценное восстановление утерянного, или запрятанного алгоритма.
Table of Contents
- Перевод шпаргалки
- Мои заметки
- Словарик
- Выводы
Перевод шпаргалки
Свежую версию шпоры вы можете найти 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>» добавить новый коммент, обратите внимание на кавычки, надо ими выделять не только текст, но и команду — особенность парсера радара
- СС- удалить комментарий
Пример маркировки данных
Пример, добавляем строку, в нашем примере взят hex file в отличие от elf в нем мало доп информации, и анализатор к тому же сам не выделил строки в секции данных. При визуальном осмотре видно что px показывает строку. Давайте зададим её командой Cs 24 , теперь вы можете поместить метку или флаг на указанный адрес f str.product 24 а также сохранить измения в файле проекта Ps
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"
Странный пример загруженный файл также располагается в памяти в результате если не просмотреть адреса и вручную все правильно не расставить ,так как адрес в памяти отличается от того что загружен. + команды перехода 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
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
Описание того что изображено на экране обычно указано в команде наверху там например режим ниже выводится командой 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
Цвета и подсветка
По поводу цветов и раскрасок, чтобы понять какой цвет чему соответствует а также настроить этот параметр , понадобиться команда ec
Графический интерфейс
webgui
Если запустить сервер разработки(=h) и отправится http://localhost:9090/ то мы увидим окно выбора
Непонятно для планшетов для кого сделано, а интерфейсов 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 недопиленные
Вот это основное webgui www-m на которое вас перекидывает по умолчанию оно странное, особенно эти кружки для консоли ^ и $
Это относительно работающее www-enyo GUI. В некоторых пунктах честно сказано что это ещё нереализовано
Из красивых вещей реализованных в интерфейсе, которые здорово было бы увидеть в консоли, вывод общего графа вызовов в удобной интерпретации.
www-p Это самое дизайнерски и интерфейсно красивое, но увы неработающее, а так как оно ещё и связано с проектом Qt GUI для radare, то я подозреваю проблема в моей сборке радара и нарушениях.
Но честно мне все равно, юнит тесты пусть делают.
Вот так должен выглядеть в идеале panel интерфейс. http://radare.today/posts/the-new-web-interface/
www-t А это tile интерфейс, не знаю нелюбитель, тайловый интерфейс в браузере это по мне изврат, естьж е консоль?
iatio
Динамично развивающейся gui которому нужен последний Qt 5.6 а может и больше, в общем когда у меня был 5.5, я его собирал, но он не смог показать вывод дизассемблера. Может из-за того что он базируется на gui www-panel а там у меня дизассемблера не получилось.
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 ассемблер в код на выбранном языке.
Пример простой ассемблерной программы
Листинг 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, опять переведем руководство и дополним.
Да эта статья не памятник она редактируется, так что если что устарело пишите в комментариях. Надо будет ещё какой обратной канал связи придумать… если это кому интересно.