GNU/Linux >> Znalost Linux >  >> Linux

Prozkoumejte binární soubory pomocí tohoto plně vybaveného nástroje Linux

V 10 způsobech analýzy binárních souborů v systému Linux Vysvětlil jsem, jak používat bohatou sadu nativních nástrojů Linuxu k analýze binárních souborů. Pokud však chcete svůj binární soubor prozkoumat dále, potřebujete nástroj, který je pro binární analýzu vytvořen na míru. Pokud jste nováčkem v binární analýze a většinou jste pracovali se skriptovacími jazyky, 9 základních nástrojů GNU binutils vám pomůže začít se učit proces kompilace a to, co tvoří binární soubor.

Proč potřebuji další nástroj?

Další zdroje pro Linux

  • Cheat pro příkazy Linuxu
  • Cheat sheet pro pokročilé příkazy systému Linux
  • Bezplatný online kurz:Technický přehled RHEL
  • Síťový cheat pro Linux
  • Cheat sheet SELinux
  • Cheat pro běžné příkazy pro Linux
  • Co jsou kontejnery systému Linux?
  • Naše nejnovější články o Linuxu

Je přirozené se ptát, proč potřebujete další nástroj, když stávající nástroje nativní pro Linux dělají podobné věci. Je to ze stejných důvodů, proč používáte svůj mobilní telefon jako budík, k psaní poznámek, jako fotoaparát, k poslechu hudby, surfování na internetu a příležitostně k telefonování a přijímání hovorů. Dříve tyto funkce zvládaly samostatná zařízení a nástroje – jako fyzická kamera pro pořizování snímků, malý poznámkový blok pro psaní poznámek, budík u postele k probuzení a tak dále. Mít jedno zařízení k provádění více (ale souvisejících) věcí je pohodlné pro uživatele. Killer funkcí je také interoperabilita mezi jednotlivými funkcemi.

Podobně, i když mnoho linuxových nástrojů má specifický účel, mít podobnou (a lepší) funkcionalitu spojenou do jediného nástroje je velmi užitečné. Proto si myslím, že Radare2 by měl být vaším oblíbeným nástrojem, kdykoli potřebujete pracovat s binárními soubory.

Radare2 (také známý jako r2) je podle jeho profilu GitHub „rámec zpětného inženýrství a sada nástrojů příkazového řádku podobný Unixu“. „2“ v názvu je způsobeno tím, že tato verze byla přepsána od začátku, aby byla modulárnější.

Proč Radare2?

Existuje spousta (nepřirozených) linuxových nástrojů, které se používají pro binární analýzu, tak proč byste si měli vybrat Radare2? Moje důvody jsou jednoduché.

Za prvé, je to open source projekt s aktivní a zdravou komunitou. Pokud hledáte úhledné, nové funkce nebo dostupnost oprav chyb, na tom hodně záleží.

Za druhé, Radare2 lze použít na příkazovém řádku a má bohaté prostředí grafického uživatelského rozhraní (GUI) nazvané Cutter pro ty, kterým vyhovuje GUI. Jako dlouholetý uživatel Linuxu se lépe živím shellem. I když je zde mírná křivka učení, než se seznámit s příkazy Radare2, přirovnal bych to k učení Vim. Nejprve se naučíte základní věci, a jakmile je zvládnete, přejdete k pokročilejším věcem. V žádném okamžiku se to stane druhou přirozeností.

Za třetí, Radare2 má dobrou podporu pro externí nástroje prostřednictvím pluginů. Například nedávno otevřený nástroj pro binární analýzu a reverzaci Ghidra je oblíbený pro svou funkci dekompilátoru, která je kritickým prvkem softwaru pro reverzaci. Dekompilátor Ghidra můžete nainstalovat a používat přímo z konzole Radare2, což je úžasné a poskytuje vám to nejlepší z obou světů.

Začínáme s Radare2

Chcete-li nainstalovat Radare2, jednoduše naklonujte repo a spusťte user.sh skript. Možná budete muset nainstalovat některé nezbytné balíčky, pokud ještě ve vašem systému nejsou. Po dokončení instalace spusťte r2 -v příkaz, abyste zjistili, zda byl Radare2 správně nainstalován:

$ git klon https://github.com/radareorg/radare2.git
$ cd radare2
$ sys/user.sh

# verze

$ r2 -v
radare2 4.6.0-git 25266 @ linux-x86-64 git.4.4.0-930-g48047b317
commit:28047b3171e6ed0480a3431a:01_0606d0480a753a010 :03
$

Získat ukázkový binární test

Nyní, když je nainstalován r2, potřebujete ukázkový binární soubor, abyste to mohli vyzkoušet. Můžete použít jakýkoli binární systém (ls , bash , a tak dále), ale aby byly věci v tomto tutoriálu jednoduché, zkompilujte následující program C:

$ cat adder.c 
#include

int adder(int num) {
        return num + 1;
}

int main() {
        int res, num1 =100;
        res =adder(num1);
        printf("Číslo je nyní  :%d\n", res);
        return 0;
}
$
$
$ gcc adder.c -o adder
$
$ file adder
adder:ELF 64bitový LSB spustitelný soubor, x86-64, verze 1 (SYSV), dynamicky propojený, interpret /lib64/ld-linux-x86-64.so.2, pro GNU/Linux 3.2.0, BuildID [sha1]=9d4366f7160e1ffb46b14466e8e0d70f10de2240, neodstraněno
$
$ ./adder
Číslo je nyní  :101
$

Načíst binární soubor

Chcete-li analyzovat binární soubor, musíte jej načíst do Radare2. Načtěte jej zadáním souboru jako argumentu příkazového řádku do r2 příkaz. Jste vhozeni do samostatné konzoly Radare2 odlišné od vašeho shellu. Chcete-li ukončit konzolu, můžete napsat Quit nebo Konec nebo stiskněte Ctrl +D :

$ r2 ./adder
 -- Naučte se palačinky, jako byste byli radar!
[0x004004b0]> ukončit
$

Analyzujte binární soubor

Než budete moci prozkoumat binární soubor, musíte požádat r2, aby to za vás analyzoval. Můžete to udělat spuštěním aaa příkaz v konzole r2;

$ r2 ./adder
 -- Je nám líto, u radare2 došlo k interní chybě.
[0x004004b0]>
[0x004004b0]>
[0x004004b0]> aaa
[x] Analyzuje všechny příznaky začínající na sym. a položka0 (aa)
[x] Analýza volání funkcí (aac)
[x] Analýza délky bajtů instrukcí pro odkazy (aar)
[x] Kontrola vtables
[ x] Analýza shody typu pro všechny funkce (aaft)
[x] Šíření informací o noreturn
[x] K provedení další experimentální analýzy použijte -AA nebo aaaa.
[0x004004b0]>

To znamená, že pokaždé, když vyberete binární soubor pro analýzu, musíte zadat další příkaz do aaa po načtení binárního souboru. Můžete to obejít voláním r2 pomocí -A následovaný binárním názvem; to říká r2, aby za vás automaticky analyzoval binární soubor:

$ r2 -A ./adder
[x] Analyzujte všechny příznaky začínající na sym. a položka0 (aa)
[x] Analýza volání funkcí (aac)
[x] Analýza délky bajtů instrukcí pro odkazy (aar)
[x] Kontrola vtables
[ x] Analýza shody typu pro všechny funkce (aaft)
[x] Šíření informací o noreturn
[x] K provedení další experimentální analýzy použijte -AA nebo aaaa.
 -- Již up-to- datum.
[0x004004b0]>

Získejte základní informace o binárním systému

Než začnete analyzovat binární soubor, potřebujete výchozí bod. V mnoha případech to může být formát souboru binárního souboru (ELF, PE atd.), architektura, pro kterou byl binární soubor vytvořen (x86, AMD, ARM atd.), a zda je binární soubor 32bitový nebo 64bitový. . Praktický iI od R2 příkaz může poskytnout požadované informace:

[0x004004b0]> iI
arch     x86
baddr    0x400000
binsz    14724
bintype  elf
bity     64
kanárská třída EL  false
kompilátor GCC:(GNU) 8.3.1 20190507 (Red Hat 8.3.1-4)
crypto   false
endian   little
havecode true
intrp    /lib64/ld -linux-x86-64.so.2
laddr    0x0
lang     c
linenum  true
lsyms    true
stroj  architektura AMD x86-64
maxopsz  16
minopsz  1
nx       true
os       linux
pcalign  0
pic      false
relocs   true
relro    částečné
rpath    NONE
sanitiz  false
static   false
stripped false
subsys   linux
va       true

[0x004004b0]>
[0x004004b0]>

Import a export

Často, jakmile víte, s jakým druhem souboru máte co do činění, chcete vědět, jaké standardní funkce knihovny binární soubor používá, nebo se chcete naučit potenciální funkce programu. V ukázkovém programu C v tomto tutoriálu je jedinou funkcí knihovny printf vytisknout zprávu. Můžete to vidět spuštěním ii příkaz, který zobrazuje všechny importy binárního souboru:

[0x004004b0]> ii
[Import]
nth vaddr      bind   typ   název knihovny
―――――――――――――――――――――――― -----------------
1 0x00000000 Slabý notype _itm_deregistertmclonetable
2 0x004004A0 globální func printf
3 0x0000000000 globální func __libc_start_main
4 0x00000000 slabý NOTYPE     __gmon_start__
5   0x00000000 SLABÝ   NOTYPE     _ITM_registerTMCloneTable

Binární soubor může mít také své vlastní symboly, funkce nebo data. Tyto funkce jsou obvykle zobrazeny pod Exports . Testovací binární soubor má dvě funkce – hlavní a sčítací – které se exportují. Zbývající funkce jsou přidány ve fázi kompilace, kdy je sestavován binární soubor. Zavaděč je potřebuje k načtení binárního souboru (prozatím se o ně příliš nestarejte):

[0x004004b0]> 
[0x004004b0]> iE
[Export]

nth paddr       vaddr      bind   typ   velikost název knihovny
――――― ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――> 82 0x00000650 0x00400650 Global Func 5 __libc_csu_fini
85 ---------- 0x00601024 Global Notype 0 _edata
86 0x00000658 0x00400658 Global Func 0 _fini
89 0x00001020 0x00601020 Global Notype 0 __data_start
90 0x00000596 0x00400596 Global Func 15 ADDER
92 0x00000670 0x00400670 Globální obj 0 __dso_handle
93 0x00000668 0x0040066880.20400668 Global obj 4 _io_stdin_used
94 0x000005E0 0x004005E0 globální func 101 __libc_csu_init
95 - ---------- 0x00601028 Global Notype 0 _end
96 0x000004E0 0x004004E0 Global Func 5 _DL_RELOKE_STATIC_PIE
97 0x000004b0 0x004004b0 Global Func 47 _start
98 --------- - 0x00601024 GLOBAL NOTYPE 0        __bss_start
99   0x00000 5A5 0x004005A5 Global Func 55 Hlavní
100 ---------- 0x00601028 Globální obj 0 __tmc_end__
102 0x00000468 0x00400468 globální func 0 _init

[0x004004b0]>

Informace o hash

Jak poznáte, že jsou dvě dvojhvězdy podobné? Nemůžete přesně otevřít binární soubor a zobrazit zdrojový kód v něm. Ve většině případů se k jednoznačné identifikaci binárního kódu používá hash – md5sum, sha1, sha256. Binární hash můžete najít pomocí it příkaz:

 [0x004004b0]> to 
MD5 7e6732f2b11dec4a0c7612852cede670
sha1 d5fa848c4b53021f6570dd9b18d115595a2290ae
sha256 13dd5a492219dac1443a816ef5f91db8d149e8edbf26f24539c220861769e1c2
[0x004004b0]>

Funkce

Kód je seskupen do funkcí; Chcete-li zobrazit seznam funkcí, které jsou v binárním systému přítomny, spusťte afl příkaz. Následující seznam ukazuje hlavní a doplňkové funkce. Obvykle funkce, které začínají sym.imp jsou importovány ze standardní knihovny (v tomto případě glibc):

 [0x004004b0]> AFL 
0x004004b0 1 46 Entry0
0x004004f0 4 41 -> 34 SYM.DEGEGIREGISTER_TM_CLONES
0x00400520 4 57 -> 51 Sym.Register_tm_clones
0x00400560 3 33 -> 32 SYM .__ DO_GLOBAL_DTORS_AUX
0x00400590 1 6 entry.init0
0x00400650 1 5 SYM. 4 101 loc..annobin_elf_init.c
0x004004E0 1 5 loc..annobin_static_reloc.c
0x004005A5 1 55 Hlavní
0x004004A0 1 6 SYM.IMP.PRINTF
0x00400468 3 27 SYM. _init
[0x004004b0]>

Křížové odkazy

V C je hlavní funkcí místo, kde program zahajuje své provádění. V ideálním případě jsou další funkce volány z main a po ukončení programu vrátí hlavní funkce operačnímu systému stav ukončení. To je patrné ve zdrojovém kódu; ale co binární? Jak můžete zjistit, kde se volá funkce sčítačky?

Můžete použít axt příkaz následovaný názvem funkce, abyste viděli, kde se volá funkce sčítačky; jak vidíte níže, volá se z hlavní funkce. Toto je známé jako křížové odkazy. Co však nazývá samotnou hlavní funkci? axt main funkce níže ukazuje, že je volána entry0 (Poučení o entry0 nechám jako cvičení pro čtenáře):

[0x004004b0]> axt sym.adder
hlavní 0x4005b9 [CALL] volání sym.adder
[0x004004b0]>
[0x004004b0]> axt hlavní
vstup04 04 0x4 ] mov rdi, main
[0x004004b0]>

Vyhledat místa

Při práci s textovými soubory se často pohybujete v souboru odkazem na číslo řádku následované číslem řádku nebo sloupce; v binárním formátu používáte adresy. Toto jsou hexadecimální čísla začínající 0x následuje adresa. Chcete-li zjistit, kde se v binárním kódu nacházíte, spusťte s příkaz. Chcete-li se přesunout na jiné místo, použijte s příkaz následovaný adresou.

Názvy funkcí jsou jako štítky, které jsou interně reprezentovány adresami. Pokud je název funkce v binárním tvaru (není odstraněn), můžete použít s příkaz následovaný názvem funkce pro skok na adresu konkrétní funkce. Podobně, pokud chcete přeskočit na začátek binárního souboru, napište s 0 :

[0x004004b0]> s
0x4004b0
[0x004004b0]>
[0x004004b0]> s hlavní
[0x004005a5]>
[0x004005a5] />0x4005a5
[0x004005a5]>
[0x004005a5]> s sym.adder
[0x00400596]>
[0x00400596]> s
0x400596 0x00400596]>
[0x00400596]> s 0
[0x00000000]>
[0x00000000]> s
0x0
[0x00000000]>

Hexadecimální zobrazení

Surová binární soustava často nedává smysl. Může pomoci zobrazit binární soubor v hexadecimálním režimu spolu s ekvivalentní reprezentací ASCII:

[0x004004b0]> s hlavní
[0x004005a5]>
[0x004005a5]> px
- offset -   0 1  2 3  4 5  6 7  8 9  A B  CD 2 7 9 FAB  CD 2 7>0x004005a5  5548 89e5 4883 ec10 c745 fc64 0000 008b  UH..H....E.d....
0x004005b5  45fc 89c7 e8d89 ffff ..8. .
0x004005c5  c6bf 7806 4000 b800 0000 00e8 cbfe ffff  ..x.@...........
0x004005d5  b800 0000 00c9 f401f ....... [email protected]
0x004005e5  5749 89d7 4156 4989 f641 5541 89fd 4154  WI..AVI..AUA..AT
0x004005f5  4c8005f5  4c8005f5  4c808d 25% 25 0.048080 %.25 0.0.0.0.0. .UH.-.. .S
0x00400605  4c29 e548 83ec 08e8 57fe ffff 48c1 fd03  L).H....W...H...
0x00400615  741f 08 08 08c t.1........L..L.
0x00400625  f644 89ef 41ff 14dc 4883 c301 4839 dd75  .D..A...H...H9.u
0x004006835  ea45 83c4 085b 5d41 5c41 5d41 5e41 5fc3  .H...[]A\A]A^A_.
0x00400645  9066 2e0f 1f84 0000 0000 00f10f3 fa3............. .
0x00400655  0000 00f3 0f1e fa48 83ec 0848 83c4 08c3 .......H...H....
0x00400665  0000 0001 0002 0000 0000 0000 0000 0000  ................
0x00400675  0000 004e 756d 6265 7220 6e6f 7720 6973  ...Číslo nyní je
0x00400685  2020
[0x004005a5]>

Demontáž

Pokud pracujete s kompilovanými binárními soubory, neexistuje žádný zdrojový kód, který byste si mohli prohlédnout. Kompilátor překládá zdrojový kód do instrukcí strojového jazyka, kterým může CPU rozumět a provádět je; výsledkem je binární nebo spustitelný soubor. Můžete si však prohlédnout montážní pokyny (mnemotechnické prvky), abyste pochopili, co program dělá. Pokud například chcete vidět, co dělá hlavní funkce, můžete vyhledat adresu hlavní funkce pomocí s main a poté spusťte pdf příkaz k zobrazení pokynů k demontáži.

Abyste porozuměli pokynům k sestavení, musíte si prostudovat příručku k architektuře (v tomto případě x86), její binární rozhraní aplikace (její ABI nebo konvence volání) a mít základní znalosti o tom, jak zásobník funguje:

[0x004004b0]> s hlavní
[0x004005a5]>
[0x004005a5]> s
0x4005a5
[0x004005a5]>
[0x004005a5]>pdf
/>           ; DATA XREF ze záznamu0 @ 0x4004d1
┌ 55:int main (int argc, char **argv, char **envp);
│          ; var int64_t var_8h @ rbp-0x8
│          ; VAR INT64_T VAR_4H @ RBP-0x4
│ 0x004005A5 55 Push RBP
│ 0x004005A6 4889E5 MOV RBP, RSP
│ 0x004005A9 4883EC10 Sub RSP, 0x10
│ 0x004005ad C745FC640000. mov dword [var_4h], 0x64    ; 'd'; 100
│ 0x004005B4 8B45FC MOV EAX, DWORD [VAR_4H]
│ 0x004005b7 89c7 mOV EDI, EAX
│ 0x004005b9 E8D8FFFFFFFF SYM.Adder
│ 0x004005BE 8945f8 MOV DWORD [VAR_8H], eAX
│ 0x004005c1 8b45f8 mOV eAX, DWORD [VAR_8H]
│ 0x004005c4 89C6 MOV ESI, EAX
│ 0x004005c6 BF78064000 MOV EDI, STR.number_now_is __:__ D; 0x400678; "Číslo je nyní  :%d\n"; const char *format
│           0x004005cb      b800000000     mov eax, 0
│           0 0x004005d0 0x004005d0 0x004005d0 0x004005d0 0x004005d0 imp. INT Printf (CONST Char * formát)
│ 0x004005d5 B80000000000 mOV eAX, 0
│ 0x004005DA c9 opustit
└ 0x004005db C3 ret
[0x004005A5]>

Zde je rozebrání funkce sčítačky:

[0x004005a5]> s sym.adder
[0x00400596]>
[0x00400596]> s
0x400596
[0x00400596]>
[05x004>pdf
           ; CALL XREF from main @ 0x4005b9
┌ 15:sym.adder (int64_t arg1);
│          ; var int64_t var_4h @ rbp-0x4
│          ; arg int64_t arg1 @ rdi
│ 0x00400596 55 push rbp
│ 0x00400597 4889E5 mOV RBP, RSP
│ 0x0040059a 897dfc MOV DWORD [VAR_4H], EDI; Arg1
│ 0x0040059d 8B45FC MOV EAX, DWORD [VAR_4H]
│ 0x004005A0 83c001 Přidat EAX, 1
│ 0x004005A3 5D POP RBP
└ 0x004005A4 C3 Ret
[0x00400596]>

Řetězce

Sledování toho, které řetězce jsou přítomny v binárním systému, může být výchozím bodem pro binární analýzu. Řetězce jsou napevno zakódovány do binárního kódu a často poskytují důležité rady, jak přesunout vaši pozornost k analýze určitých oblastí. Spusťte iz příkaz v binárním souboru pro výpis všech řetězců. Testovací binární soubor má v binárním kódu pevně zakódovaný pouze jeden řetězec:

[0x004004b0]> iz
[Strings]
nth paddr      vaddr      velikost čočky typ sekce  string
――――――――――――――――――― -------------------------------------
0 0x00000678 0x00400678 20 21 .Rodata ASCII číslo nyní je  :%d\n

[0x004004b0]>

Řetězce křížových odkazů

Stejně jako u funkcí můžete na řetězce odkazovat, abyste viděli, odkud se tisknou, a porozuměli kódu kolem nich:

[0x004004b0]> ps @ 0x400678
Číslo je nyní  :%d

[0x004004b0]>
[0x004004b0]> axt 0x400678
[0x004004b0]>

Vizuální režim

Když je váš kód komplikovaný s více volanými funkcemi, je snadné se ztratit. Může být užitečné mít grafický nebo vizuální pohled na to, které funkce jsou volány, které cesty se používají na základě určitých podmínek atd. Vizuální režim r2 můžete prozkoumat pomocí VV příkaz po přechodu na funkci zájmu. Například pro funkci sčítačky:

[0x004004b0]> s sym.adder
[0x00400596]>
[0x00400596]> VV

Ladicí program

Doposud jste prováděli statickou analýzu – pouze se díváte na věci v binárním systému, aniž byste to spouštěli. Někdy je potřeba spustit binární soubor a analyzovat různé informace v paměti za běhu. Interní debugger r2 vám umožňuje spouštět binární soubory, vkládat body přerušení, analyzovat hodnoty proměnných nebo vypisovat obsah registrů.

Spusťte ladicí program pomocí -d příznak a přidejte -A příznak k provedení analýzy binárních zatížení. Body přerušení můžete nastavit na různých místech, jako jsou adresy funkcí nebo paměti, pomocí db <function-name> příkaz. Chcete-li zobrazit existující body přerušení, použijte dbi příkaz. Jakmile umístíte body přerušení, začněte spouštět binární soubor pomocí dc příkaz. Zásobník můžete zobrazit pomocí dbt příkaz, který zobrazuje volání funkcí. Nakonec můžete obsah registrů vypsat pomocí drr příkaz:

$ r2 -d -A ./adder
Proces s PID 17453 byl zahájen...
=připojit 17453 17453
bin.baddr 0x00400000
Pomocí 0x400000
asm.bits 64
[x] Analyzujte všechny příznaky začínající na sym. a položka0 (aa)
[x] Analýza volání funkcí (aac)
[x] Analýza délky bajtů instrukcí pro odkazy (aar)
[x] Kontrola vtables
[ x] Analýza shody typu pro všechny funkce (aaft)
[x] Šíření informací o noreturn
[x] K provedení další experimentální analýzy použijte -AA nebo aaaa.
 -- git checkout hamster
[0x7f77b0a28030]>
[0x7f77b0a28030]> db main
[0x7f77b0a28030]>
[0x7f77b0a28030]> db sym.adder<8x7f]2a070707007007007007 ]> dbi
0 0x004005a5 E:1 T:0
1 0x00400596 E:1 T:0
[0x7f77b0a28030]>
[0x7f77b0a28030]> afl | grep main
0x004005a5    1 55           main
[0x7f77b0a28030]>
[0x7f77b0a28030]> afl | grep sym.adder
0x00400596    1 15           sym.adder
[0x7f77b0a28030]>
[0x7f77b0a28030]> dc
přestávka
05 5x /> [0x004005A5]> DBT
0 0x4005A5 SP:0x0 0 [Hlavní] Hlavní sym.Adder + 15
1 0x7F77B0687873 SP:0x7FFE35FF6858 0 [??] Sekce.
2  0x7f77b0a36e0a     sp:0x7ffe35ff68e8      144  [??]  map.usr_lib64_ld_2.28.so.r_x+65034
[0x0040 05/09] bod
[0x00406 5/09] 09/509 05/05> DBT
0 0x400596 SP:0x0 0 [SYM.Adder] RIP Entry.init0 + 6
1 0x4005BOE SP:0x7FRFE35FRF6838 0 [Hlavní] Hlavní + 25
2 0x7F777B0687873 SP:0x7FRFE35FF6858 32 ??]  section..gnu.build.attributes-1345820597
3  0x7f77b0a36e0a     sp:0x7ffe35ff68e8      144  [??]  map.usr_lib64>038
[0x00400596]> dr
rax =0x00000064
rb x =0x00000000
rcx =0x7f77b0a21738
rdx =0x7ffe35ff6948
r8 =0x7f77b0a22da0
r9 =0x7f77b0br> 01x00 =0
01x010 =0
01010 =0101010 =0x004004b0
r13 =0x7ffe35ff6930
r14 =0x00000000
r15 =0x00000000
rsi =0x7ffe35ff6938
rip =0x00400596
rflags =0x00000202
orax =0xffffffffffffffff
[0x00400596]>

Dekompilátor

Být schopen porozumět montáži je předpokladem binární analýzy. Jazyk symbolických instrukcí je vždy svázán s architekturou, na které je binární soubor postaven a na kterém má běžet. Nikdy neexistuje mapování 1:1 mezi řádkem zdrojového kódu a kódem sestavení. Jeden řádek zdrojového kódu C často vytváří několik řádků sestavení. Čtení kódu montáže řádek po řádku tedy není optimální.

Zde přichází na řadu dekompilátory. Snaží se rekonstruovat možný zdrojový kód na základě montážních pokynů. Toto NIKDY není přesně stejné jako zdrojový kód použitý k vytvoření binárního souboru; jde o blízkou reprezentaci zdroje na základě sestavení. Počítejte také s tím, že optimalizace kompilátoru, které generují různé assemblerové kódy pro urychlení, zmenšení velikosti binárního souboru atd., ztíží práci dekompilátoru. Autoři malwaru také často záměrně zatemňují kód, aby odradili analytika malwaru.

Radare2 poskytuje dekompilátory prostřednictvím zásuvných modulů. Můžete nainstalovat jakýkoli dekompilátor, který Radare2 podporuje. Zobrazte aktuální pluginy pomocí r2pm -l příkaz. Nainstalujte ukázku r2dec dekompilátor s r2pm install příkaz:

$ r2pm  -l
$
$ r2pm nainstalovat r2dec
Klonování do 'r2dec'...
vzdálené:Výčet objektů:100, hotovo.
vzdálené :Počítání objektů:100 % (100/100), hotovo.
dálkové:Komprese objektů:100 % (97/97), hotovo.
dálkové ovládání:Celkem 100 (delta 18), znovu použité 27 (delta 1), pack-reused 0
Příjem objektů:100 % (100/100), 1,01 MiB | 1,31 MiB/s, hotovo.
Rozdělení rozdílů:100 % (18/18), hotovo.
Instalace Hotovo pro r2dec
gmake:Vstup do adresáře '/root/.local/share/radare2 /r2pm/git/r2dec/p'
[CC] duktape/duktape.o
[CC] duktape/duk_console.o
[CC] core_pdd.o
[CC] core_pdd.so
gmake:Opuštění adresáře '/root/.local/share/radare2/r2pm/git/r2dec/p'
$
$ r2pm  -l
r2dec
$

Zobrazení dekompilátoru

Chcete-li dekompilovat binární soubor, načtěte binární soubor v r2 a automaticky jej analyzujte. Přejděte na funkci zájmu – v tomto příkladu sčítačka – pomocí s sym.adder a poté použijte pdda příkaz k zobrazení sestavení a dekompilovaného zdrojového kódu vedle sebe. Čtení tohoto dekompilovaného zdrojového kódu je často jednodušší než čtení montážního řádku po řádku:

$ r2 -A ./adder
[x] Analyzujte všechny příznaky začínající na sym. a položka0 (aa)
[x] Analýza volání funkcí (aac)
[x] Analýza délky bajtů instrukcí pro odkazy (aar)
[x] Kontrola vtables
[ x] Analýza shody typu pro všechny funkce (aaft)
[x] Šíření informací o noreturn
[x] K provedení další experimentální analýzy použijte -AA nebo aaaa.
 -- Co chcete ladit dnes?
[0x004004b0]>
[0x004004b0]> s sym.adder
[0x00400596]>
[0x00400596]> s
0x400596
[ 0x00400596]>
[0x00400596]> pdda
   ; montáž                               | /* Výstup pseudo kódu r2dec */
                                             | /* ./adder @ 0x400596 */
                                             | #include
                                             |
   ; (fcn) sym.adder ()                     | int32_t adder (int64_t arg1) {
                                             | int64_t var_4h;
                                             | rdi =arg1;
    0x00400596 push rbp                      |
    0x00400597 mov rbp, rsp                  |
    0x0040059a mov dword [rbp - 4], edi      | *((rbp - 4)) =edi;
    0x0040059d mov eax, dword [rbp - 4]      | eax =*((rbp - 4));
    0x004005a0 přidat eax, 1                    | eax++;
    0x004005a3 pop rbp                       |
    0x004005a4 ret                           | return eax;
                                             | }
[0x00400596]>

Konfigurovat nastavení

Jak se s Radare2 více zorientujete, budete chtít změnit jeho konfiguraci, abyste jej vyladili podle toho, jak pracujete. Výchozí konfigurace r2 můžete zobrazit pomocí e příkaz. Chcete-li nastavit konkrétní konfiguraci, přidejte config = value za e příkaz:

[0x004005a5]> e | wc -l
593
[0x004005a5]> e | grep syntax
asm.syntax =intel
[0x004005a5]>
[0x004005a5]> e asm.syntax =att
[0x004005a5]>
[0x004005a5]> e | syntaxe grep
asm.syntax =att
[0x004005a5]>

Aby byly změny konfigurace trvalé, umístěte je do spouštěcího souboru s názvem .radare2rc že r2 čte při spuštění. Tento soubor se obvykle nachází ve vašem domovském adresáři; pokud ne, můžete si jej vytvořit. Některé ukázkové možnosti konfigurace zahrnují:

$ cat ~/.radare2rc 
e asm.syntax =att
e scr.utf8 =true
eco solarized
e cmd.stack =true
e stack.size =256
$

Prozkoumat více

Už jste viděli dostatek funkcí Radare2, abyste se v tomto nástroji zorientovali. Protože Radare2 dodržuje filozofii Unixu, i když z jeho konzole můžete dělat různé věci, ke svým úkolům používá samostatnou sadu binárních souborů pod ním.

Prozkoumejte samostatné binární soubory uvedené níže, abyste viděli, jak fungují. Například binární informace zobrazené v konzole s iI příkaz lze také nalézt pomocí rabin2 <binary> příkaz:

$ cd bin/
$
$ ls
předpona  r2agent    r2pm  rabin2   radiff2  ragg2    rarun2   rasm2
r2      r2-odrážka  r2r  2brash

Co si myslíš o Radare2? Podělte se o svůj názor v komentářích.


Linux
  1. Prohlédněte si možnosti binárních souborů ELF pomocí tohoto nástroje s otevřeným zdrojovým kódem

  2. Provádějte forenzní analýzu paměti Linuxu pomocí tohoto nástroje s otevřeným zdrojovým kódem

  3. Používání nástroje GNOME Screenshot Tool v Linuxu jako profesionál

  1. Sdílení souborů s otevřeným zdrojovým kódem s tímto nástrojem Linux

  2. Ladění Linuxu pomocí ProcDump

  3. Jak porovnat tři soubory v Linuxu pomocí nástroje diff3

  1. Získejte statistiky využití paměti pomocí tohoto nástroje příkazového řádku systému Linux

  2. Jak nakonfigurovat herní myš v systému Linux pomocí nástroje Piper GUI Tool

  3. Jak obnovit smazané soubory v systému Linux pomocí nástroje pro obnovu dat Scalpel?