Всем привет. Хочу рассказать про такой инструмент как rizin. Я хочу рассмотреть его возможность на примере простойго бинарника . Rizin основан на radare2, это форк ориентированный на чистоту кода, его стабильност и оттестированный API. В заметке разберем особенности rizin и его функционал.
Просто аниме картинка
Проект Rizin представляет собой набор небольших утилит командной строки, которые можно использовать вместе или по отдельности.Также его можно использовать как библиотеку, например вот https://github.com/rizinorg/rizin/tree/dev/test/integration
давайте его для начала поставим, это делается в несколько команд
$ git clone https://github.com/rizinorg/rizin
клонируем репу, а остальные команды его компилят
$ meson build
$ ninja -C build
$ sudo ninja -C build install
Или если вы используете Linux Arch и при этом используете репрозиторий BlackArch, то у вас это делоется так
sudo
blackman -g blackarch-debugger
и уже выбираете rizin.
Rizin состоит из следующих утилит:
1.rizin
Основной инструмент всего фреймворка. Он использует ядро шестнадцатеричного редактора и отладчика. rizin позволяет вам открывать ряд источников ввода/вывода, как если бы они были простыми файлами, включая диски, сетевые подключения, драйверы ядра, отлаживаемые процессы и так далее.
Он реализует расширенный интерфейс командной строки для перемещения по файлу, анализа данных, дизассемблирования, исправления двоичных файлов, сравнения данных, поиска, замены и визуализации. Он может быть написан на различных языках, включая Python, Haskell, OCaml, JavaScript и другие.
2.rz-bin
Программа для извлечения информации из исполняемых двоичных файлов, таких как ELF, PE, Java CLASS, Mach-O, а также любого формата, поддерживаемого плагинами rizin. rz-bin используется ядром для получения таких данных, как экспортированные символы, импорт, информация о файлах, перекрестные ссылки (xrefs), зависимости библиотек и разделы.
3.rz-asm
Ассемблер и дизассемблер командной строки для нескольких архитектур (включая Intel x86 и x86-64, MIPS, ARM, PowerPC, Java и множество других).
4.rz-hash
Реализация блочного хеш-инструмента. От небольших текстовых строк до больших дисков, rz-hash поддерживает несколько алгоритмов, включая MD4, MD5, CRC16, CRC32, SHA1, SHA256 и другие. rz-hash можно использовать для проверки целостности или отслеживания изменений больших файлов, дампов памяти или дисков.
5.rz-diff
Утилита для сравнения двоичных файлов, которая реализует несколько алгоритмов. Он поддерживает сравнение на уровне байтов или дельта для двоичных файлов, а также сравнение на основе анализа кода для поиска изменений в базовых блоках кода, полученных в результате анализа кода rizin.
6.rz-find
Программа для поиска байтовых шаблонов в файлах.
7.rz-egg
Интерфейс для r_egg. rz-egg компилирует программы, написанные на простом языке высокого уровня, в крошечные двоичные файлы для x86, x86-64 и ARM.
8.rz-run
Средство запуска для запуска программ в разных средах с разными аргументами, разрешениями, каталогами и переопределенными файловыми дескрипторами по умолчанию. rz-run полезен для:
- Решаем кряки
- Фаззинг
- Наборы тестов
9.rz-ax
Минималистичный оценщик математических выражений для оболочки, который полезен для базовых преобразований между значениями с плавающей запятой, шестнадцатеричными представлениями, шестнадцатеричными строками в ASCII, восьмеричными в целые и т. д. Он также поддерживает настройки порядка байтов и может использоваться в качестве интерактивной оболочки, если не заданы аргументы.
давайте пока рассмотрим стандартный rizin, на примере простой проги.
Итак приступим. Для начала нппишем простую программу на языке С.
#include <stdio.h>
int main() {
printf("Hello, World!");
}
да стандартный хелло ворлд
теперь скомпилируем ее используя GCC стандартный компилятор С
gcc -w hello_world.c -o hello_word
после чего делоем следующее
rizin -nw helloworld.c
после чего получаем вот такую вот штуку
[0x00000000]>
теперь можем повставлять разные флаги ( а могли бы хуй гыы, но нам как байтоебам это не светит)
гыы, афтар шутит про хуи, вот убогий
На сегодня я предлагаю взять и потестить несколько флагов из командной строки. Давайте используем стандартный аааа и посмотрим чо получилось.
[0x00000000]> aaaa
ахуенно, давайте погоняем наш бинарь по различным функциям и на этом закончим.
ft - анализ соответсвия типов для всех функций
fs
env
string
threads
network
dylib
alloc
time
process
stdout
r - анализ длины функции
c - анализ вызова функций
Usage: c[?dfx] [argument] # Compare
| c [string] Compare a plain with escaped chars string
| c* [string] Same as above, but printing rizin commands instead
| c1 [addr] Compare 8 bits from current offset
| c2 [value] Compare a word from a math expression
| c4 [value] Compare a doubleword from a math expression
| c8 [value] Compare a quadword from a math expression
| cat [file] Show contents of file (see pwd, ls)
| cc [at] Compares in two hexdump columns of block size
| ccc [at] Same as above, but only showing different lines
| ccd [at] Compares in two disasm columns of block size
| cd [dir] chdir
| cf [file] Compare contents of file at current seek
| cg[?] [o] [file] Graphdiff current file and [file]
| cl|cls|clear Clear screen, (clear0 to goto 0, 0 only)
| cu[?] [addr] @at Compare memory hexdumps of $$ and dst in unified diff
| cud [addr] @at Unified diff disasm from $$ and given address
| cv[1248] [hexpairs] @at Compare 1,2,4,8-byte (silent return in $?)
| cV[1248] [addr] @at Compare 1,2,4,8-byte address contents (silent, return in $?)
| cw[?] [us?] [...] Compare memory watchers
| cx [hexpair] Compare hexpair string (use '.' as nibble wildcard)
| cx* [hexpair] Compare hexpair string (output rizin commands)
| cX [addr] Like 'cc' but using hexdiff output
p- поиск и анализ функциональных прелюдий
Usage: p[=68abcdDfiImrstuxz] [arg|len] [@addr]
| p[b|B|xb] [len] ([S]) bindump N bits skipping S bytes
| p[iI][df] [len] print N ops/bytes (f=func) (see pi? and pdi)
| p[kK] [len] print key in randomart (K is for mosaic)
| p-[?][jh] [mode] bar|json|histogram blocks (mode: e?search.in)
| p2 [len] 8x8 2bpp-tiles
| p6[de] [len] base64 decode/encode
| p8[?][j] [len] 8bit hexpair list of bytes
| p=[?][bep] [N] [L] [b] show entropy/printable chars/chars bars
| pa[edD] [arg] pa:assemble pa[dD]:disasm or pae: esil from hex
| pA[n_ops] show n_ops address and type
| pb[?] [n] bitstream of N bits
| pB[?] [n] bitstream of N bytes
| pc[?][p] [len] output C (or python) format
| pC[aAcdDxw] [rows] print disassembly in columns (see hex.cols and pdi)
| pd[?] [sz] [a] [b] disassemble N opcodes (pd) or N bytes (pD)
| pf[?][.nam] [fmt] print formatted data (pf.name, pf.name $<expr>)
| pF[?][apx] print asn1, pkcs7 or x509
| pg[?][x y w h] [cmd] create new visual gadget or print it (see pg? for details)
| ph[?][=|hash] ([len]) calculate hash for a block
| pi[?][bdefrj] [num] print instructions
| pI[?][iI][df] [len] print N instructions/bytes (f=func)
| pj[?] [len] print as indented JSON
| pm[?] [magic] print libmagic data (see pm? and /m?)
| po[?] hex print operation applied to block (see po?)
| pp[?][sz] [len] print patterns, see pp? for more help
| pq[?][is] [len] print QR code with the first Nbytes
| pr[?][glx] [len] print N raw bytes (in lines or hexblocks, 'g'unzip)
| ps[?][pwz] [len] print pascal/wide/zero-terminated strings
| pt[?][dn] [len] print different timestamps
| pu[?][w] [len] print N url encoded bytes (w=wide)
| pv[?][jh] [mode] show variable/pointer/value in memory
| pwd display current working directory
| px[?][owq] [len] hexdump of N bytes (o=octal, w=32bit, q=64bit)
| pz[?] [len] print zoom view (see pz? for help)
Давайте рассмотрим какие флаги мы рассмотрели
aap
aac
aar
aaft
А на сегодня все.
Источники
https://rizin.re/ офф сайт
https://book.rizin.re/ мануал на софт
https://github.com/rizinorg/rizin гитхаб, там же есть инструкции по установке.
пишу сюда всякое https://t.me/c4nc7