обзор на rizin. Обзор некоторых функций часть1

обзор на rizin. Обзор некоторых функций часть1

c17179n

Всем привет. Хочу рассказать про такой инструмент как 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

[x] Analyze all flags starting with sym. and entry0 (aa)

[x] Analyze function calls (aac)

[x] find and analyze function preludes (aap)

[x] Analyze len bytes of instructions for references (aar)

[x] Check for classes

[x] Type matching analysis for all functions (aaft)

[x] Propagate noreturn information

[x] Use -AA or aaaa to perform additional experimental analysis.

[x] Enable constraint types analysis for variables

ахуенно, давайте погоняем наш бинарь по различным функциям и на этом закончим.

ft - анализ соответсвия типов для всех функций

fs

env

string

threads

network

dylib

alloc

time

process

stdout

r - анализ длины функции

63

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












Report Page