日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Linux下radare2使用方法

radare2是一個(gè)開(kāi)源的逆向工程和二進(jìn)制分析框架,包括反匯編、分析數(shù)據(jù)、打補(bǔ)丁、比較數(shù)據(jù)、搜索、替換、虛擬化等等,同時(shí)具備超強(qiáng)的腳本加載能力,它可以運(yùn)行在幾乎所有主流的平臺(tái)(GNU/Linux, .Windows *BSD, iOS, OSX, Solaris…),下面為大家詳細(xì)講解一下Linux下radare2使用方法。

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的崖州網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

為什么選擇 Radare2?

有大量(非原生的)Linux 工具可用于二進(jìn)制分析,為什么要選擇 Radare2 呢?我的理由很簡(jiǎn)單。

首先,它是一個(gè)開(kāi)源項(xiàng)目,有一個(gè)活躍而健康的社區(qū)。如果你正在尋找新穎的功能或提供著 bug 修復(fù)的工具,這很重要。

其次,Radare2 可以在命令行上使用,而且它有一個(gè)功能豐富的圖形用戶(hù)界面(GUI)環(huán)境,叫做 Cutter,適合那些對(duì) GUI 比較熟悉的人。作為一個(gè)長(zhǎng)期使用 Linux 的用戶(hù),我對(duì)習(xí)慣于在 shell 上輸入。雖然熟悉 Radare2 的命令稍微有一點(diǎn)學(xué)習(xí)曲線,但我會(huì)把它比作 學(xué)習(xí) Vim。你可以先學(xué)習(xí)基本的東西,一旦你掌握了它們,你就可以繼續(xù)學(xué)習(xí)更高級(jí)的東西。很快,它就變成了肌肉記憶。

第三,Radare2 通過(guò)插件可以很好的支持外部工具。例如,最近開(kāi)源的 Ghidra 二進(jìn)制分析和逆向工具reversing tool很受歡迎,因?yàn)樗姆淳幾g器功能是逆向軟件的關(guān)鍵要素。你可以直接從 Radare2 控制臺(tái)安裝 Ghidra 反編譯器并使用,這很神奇,讓你兩全其美。

開(kāi)始使用 Radare2

要安裝 Radare2,只需克隆其存儲(chǔ)庫(kù)并運(yùn)行 user.sh 腳本。如果你的系統(tǒng)上還沒(méi)有一些預(yù)備軟件包,你可能需要安裝它們。一旦安裝完成,運(yùn)行 r2 -v 命令來(lái)查看 Radare2 是否被正確安裝:

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

# version

$ r2 -v
radare2 4.6.0-git 25266 @ linux-x86-64 git.4.4.0-930-g48047b317
commit: 48047b3171e6ed0480a71a04c3693a0650d03543 build: 2020-11-17__09:31:03
$

獲取二進(jìn)制測(cè)試樣本

現(xiàn)在 r2 已經(jīng)安裝好了,你需要一個(gè)樣本二進(jìn)制程序來(lái)試用它。你可以使用任何系統(tǒng)二進(jìn)制文件(ls、bash 等),但為了使本教程的內(nèi)容簡(jiǎn)單,請(qǐng)編譯以下 C 程序:

$ cat adder.c
#include  

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

int main() {
int res, num1 = 100;
res = adder(num1);
printf("Number now is : %d\n", res);
return 0;
}
$ gcc adder.c -o adder
$ file adder
adder: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=9d4366f7160e1ffb46b14466e8e0d70f10de2240, not stripped
$ ./adder
Number now is : 101

加載二進(jìn)制文件

要分析二進(jìn)制文件,你必須在 Radare2 中加載它。通過(guò)提供文件名作為 r2 命令的一個(gè)命令行參數(shù)來(lái)加載它。你會(huì)進(jìn)入一個(gè)獨(dú)立的 Radare2 控制臺(tái),這與你的 shell 不同。要退出控制臺(tái),你可以輸入 QuitExit 或按 Ctrl+D

$ r2 ./adder
-- Learn pancake as if you were radare!
[0x004004b0]> quit
$

分析二進(jìn)制

在你探索二進(jìn)制之前,你必須讓 r2 為你分析它。你可以通過(guò)在 r2 控制臺(tái)中運(yùn)行 aaa 命令來(lái)實(shí)現(xiàn):

$ r2 ./adder
-- Learn pancake as if you were radare!
[0x004004b0]> quit
$

這意味著每次你選擇一個(gè)二進(jìn)制文件進(jìn)行分析時(shí),你必須在加載二進(jìn)制文件后輸入一個(gè)額外的命令 aaa。你可以繞過(guò)這一點(diǎn),在命令后面跟上 -A 來(lái)調(diào)用 r2;這將告訴 r2 為你自動(dòng)分析二進(jìn)制:

$ r2 -A ./adder
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze function calls (aac)
[x] Analyze len bytes of instructions for references (aar)
[x] Check for vtables
[x] Type matching analysis for all functions (aaft)
[x] Propagate noreturn information
[x] Use -AA or aaaa to perform additional experimental analysis.
-- Already up-to-date.
[0x004004b0]>

獲取一些關(guān)于二進(jìn)制的基本信息

在開(kāi)始分析一個(gè)二進(jìn)制文件之前,你需要一些背景信息。在許多情況下,這可以是二進(jìn)制文件的格式(ELF、PE 等)、二進(jìn)制的架構(gòu)(x86、AMD、ARM 等),以及二進(jìn)制是 32 位還是 64 位。方便的 r2 的 iI 命令可以提供所需的信息:

[0x004004b0]> iI
arch x86
baddr 0x400000
binsz 14724
bintype elf
bits 64
canary false
class ELF64
compiler 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
machine AMD x86-64 architecture
maxopsz 16
minopsz 1
nx true
os linux
pcalign 0
pic false
relocs true
relro partial
rpath NONE
sanitiz false
static false
stripped false
subsys linux
va true

[0x004004b0]>
[0x004004b0]>

導(dǎo)入和導(dǎo)出

通常情況下,當(dāng)你知道你要處理的是什么樣的文件后,你就想知道二進(jìn)制程序使用了什么樣的標(biāo)準(zhǔn)庫(kù)函數(shù),或者了解程序的潛在功能。在本教程中的示例 C 程序中,唯一的庫(kù)函數(shù)是 printf,用來(lái)打印信息。你可以通過(guò)運(yùn)行 ii 命令看到這一點(diǎn),它顯示了該二進(jìn)制所有導(dǎo)入的庫(kù):

[0x004004b0]> ii
[Imports]
nth vaddr bind type lib name
―――――――――――――――――――――――――――――――――――――
1 0x00000000 WEAK NOTYPE _ITM_deregisterTMCloneTable
2 0x004004a0 GLOBAL FUNC printf
3 0x00000000 GLOBAL FUNC __libc_start_main
4 0x00000000 WEAK NOTYPE __gmon_start__
5 0x00000000 WEAK NOTYPE _ITM_registerTMCloneTable

該二進(jìn)制也可以有自己的符號(hào)、函數(shù)或數(shù)據(jù)。這些函數(shù)通常顯示在 Exports 下。這個(gè)測(cè)試的二進(jìn)制導(dǎo)出了兩個(gè)函數(shù):main 和 adder。其余的函數(shù)是在編譯階段,當(dāng)二進(jìn)制文件被構(gòu)建時(shí)添加的。加載器需要這些函數(shù)來(lái)加載二進(jìn)制文件(現(xiàn)在不用太關(guān)心它們):

[0x004004b0]>
[0x004004b0]> iE
[Exports]

nth paddr vaddr bind type size lib name
――――――――――――――――――――――――――――――――――――――――――――――――――――――
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 GLOBAL OBJ 0 __dso_handle
93 0x00000668 0x00400668 GLOBAL OBJ 4 _IO_stdin_used
94 0x000005e0 0x004005e0 GLOBAL FUNC 101 __libc_csu_init
95 ---------- 0x00601028 GLOBAL NOTYPE 0 _end
96 0x000004e0 0x004004e0 GLOBAL FUNC 5 _dl_relocate_static_pie
97 0x000004b0 0x004004b0 GLOBAL FUNC 47 _start
98 ---------- 0x00601024 GLOBAL NOTYPE 0 __bss_start
99 0x000005a5 0x004005a5 GLOBAL FUNC 55 main
100 ---------- 0x00601028 GLOBAL OBJ 0 __TMC_END__
102 0x00000468 0x00400468 GLOBAL FUNC 0 _init

[0x004004b0]>

哈希信息

如何知道兩個(gè)二進(jìn)制文件是否相似?你不能只是打開(kāi)一個(gè)二進(jìn)制文件并查看里面的源代碼。在大多數(shù)情況下,二進(jìn)制文件的哈希值(md5sum、sha1、sha256)是用來(lái)唯一識(shí)別它的。你可以使用 it 命令找到二進(jìn)制的哈希值:

[0x004004b0]> itmd5 7e6732f2b11dec4a0c7612852cede670sha1 d5fa848c4b53021f6570dd9b18d115595a2290aesha256 13dd5a492219dac1443a816ef5f91db8d149e8edbf26f24539c220861769e1c2[0x004004b0]>

函數(shù)

代碼按函數(shù)分組;要列出二進(jìn)制中存在的函數(shù),請(qǐng)運(yùn)行afl 命令。下面的列表顯示了main函數(shù)和adder函數(shù)。通常,以sym.imp開(kāi)頭的函數(shù)是從標(biāo)準(zhǔn)庫(kù)(這里是 glibc)中導(dǎo)入的:

[0x004004b0]> afl0x004004b0    1 46           entry00x004004f0    4 41   -> 34   sym.deregister_tm_clones0x00400520    4 57   -> 51   sym.register_tm_clones0x00400560    3 33   -> 32   sym.__do_global_dtors_aux0x00400590    1 6            entry.init00x00400650    1 5            sym.__libc_csu_fini0x00400658    1 13           sym._fini0x00400596    1 15           sym.adder0x004005e0    4 101          loc..annobin_elf_init.c0x004004e0    1 5            loc..annobin_static_reloc.c0x004005a5    1 55           main0x004004a0    1 6            sym.imp.printf0x00400468    3 27           sym._init[0x004004b0]>

交叉引用

[0x004004b0]> axt sym.addermain 0x4005b9 [CALL] call sym.adder[0x004004b0]>[0x004004b0]> axt mainentry0 0x4004d1 [DATA] mov rdi, main[0x004004b0]>

尋找定位

在處理文本文件時(shí),你經(jīng)常通過(guò)引用行號(hào)和行或列號(hào)在文件內(nèi)移動(dòng);在二進(jìn)制文件中,你需要使用地址。這些是以 0x 開(kāi)頭的十六進(jìn)制數(shù)字,后面跟著一個(gè)地址。要找到你在二進(jìn)制中的位置,運(yùn)行 s 命令。要移動(dòng)到不同的位置,使用 s 命令,后面跟上地址。

函數(shù)名就像標(biāo)簽一樣,內(nèi)部用地址表示。如果函數(shù)名在二進(jìn)制中(未剝離的),可以使用函數(shù)名后面的 s 命令跳轉(zhuǎn)到一個(gè)特定的函數(shù)地址。同樣,如果你想跳轉(zhuǎn)到二進(jìn)制的開(kāi)始,輸入 s 0:

[0x004004b0]> s0x4004b0[0x004004b0]>[0x004004b0]> s main[0x004005a5]>[0x004005a5]> s0x4005a5[0x004005a5]>[0x004005a5]> s sym.adder[0x00400596]>[0x00400596]> s0x400596[0x00400596]>[0x00400596]> s 0[0x00000000]>[0x00000000]> s0x0[0x00000000]>

十六進(jìn)制視圖

通常情況下,原始二進(jìn)制沒(méi)有意義。在十六進(jìn)制模式下查看二進(jìn)制及其等效的 ASCII 表示法會(huì)有幫助:

[0x004004b0]> s main[0x004005a5]>[0x004005a5]> px- offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF0x004005a5  5548 89e5 4883 ec10 c745 fc64 0000 008b  UH..H....E.d....0x004005b5  45fc 89c7 e8d8 ffff ff89 45f8 8b45 f889  E.........E..E..0x004005c5  c6bf 7806 4000 b800 0000 00e8 cbfe ffff  ..x.@...........0x004005d5  b800 0000 00c9 c30f 1f40 00f3 0f1e fa41  .........@.....A0x004005e5  5749 89d7 4156 4989 f641 5541 89fd 4154  WI..AVI..AUA..AT0x004005f5  4c8d 2504 0820 0055 488d 2d04 0820 0053  L.%.. .UH.-.. .S0x00400605  4c29 e548 83ec 08e8 57fe ffff 48c1 fd03  L).H....W...H...0x00400615  741f 31db 0f1f 8000 0000 004c 89fa 4c89  t.1........L..L.0x00400625  f644 89ef 41ff 14dc 4883 c301 4839 dd75  .D..A...H...H9.u0x00400635  ea48 83c4 085b 5d41 5c41 5d41 5e41 5fc3  .H...[]A\A]A^A_.0x00400645  9066 2e0f 1f84 0000 0000 00f3 0f1e fac3  .f..............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  ...Number now is0x00400685  2020 3a20 2564 0a00 0000 0001 1b03 3b44    : %d........;D0x00400695  0000 0007 0000 0000 feff ff88 0000 0020  ...............[0x004005a5]>

反匯編

如果你使用的是編譯后的二進(jìn)制文件,則無(wú)法查看源代碼。編譯器將源代碼轉(zhuǎn)譯成 CPU 可以理解和執(zhí)行的機(jī)器語(yǔ)言指令;其結(jié)果就是二進(jìn)制或可執(zhí)行文件。然而,你可以查看匯編指令(的助記詞)來(lái)理解程序正在做什么。例如,如果你想查看 main 函數(shù)在做什么,你可以使用 s main 尋找 main 函數(shù)的地址,然后運(yùn)行 pdf 命令來(lái)查看反匯編的指令。

要理解匯編指令,你需要參考體系結(jié)構(gòu)手冊(cè)(這里是 x86),它的應(yīng)用二進(jìn)制接口(ABI,或調(diào)用慣例),并對(duì)堆棧的工作原理有基本的了解:

[0x004004b0]> s main[0x004005a5]>[0x004005a5]> s0x4005a5[0x004005a5]>[0x004005a5]> pdf           ; DATA XREF from entry0 @ 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      e8d8ffffff     call 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 ; "Number now is  : %d\n" ; const char *format│           0x004005cb      b800000000     mov eax, 0│           0x004005d0      e8cbfeffff     call sym.imp.printf         ; int printf(const char *format)│           0x004005d5      b800000000     mov eax, 0│           0x004005da      c9             leave└           0x004005db      c3             ret[0x004005a5]>這是 adder 函數(shù)的反匯編結(jié)果:[0x004005a5]> s sym.adder[0x00400596]>[0x00400596]> s0x400596[0x00400596]>[0x00400596]> 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         add eax, 1│           0x004005a3      5d             pop rbp└           0x004005a4      c3             ret[0x00400596]>

字符串

查看二進(jìn)制中存在哪些字符串可以作為二進(jìn)制分析的起點(diǎn)。字符串是硬編碼到二進(jìn)制中的,通常會(huì)提供重要的提示,可以讓你將重點(diǎn)轉(zhuǎn)移到分析某些區(qū)域。在二進(jìn)制中運(yùn)行 iz 命令來(lái)列出所有的字符串。這個(gè)測(cè)試二進(jìn)制中只有一個(gè)硬編碼的字符串:

[0x004004b0]> iz[Strings]nth paddr      vaddr      len size section type  string―――――――――――――――――――――――――――――――――――――――――――――――――――――――0   0x00000678 0x00400678 20  21   .rodata ascii Number now is  : %d\n[0x004004b0]>

交叉引用字符串

和函數(shù)一樣,你可以交叉引用字符串,看看它們是從哪里被打印出來(lái)的,并理解它們周?chē)拇a:

[0x004004b0]> ps @ 0x400678Number now is  : %d[0x004004b0]>[0x004004b0]> axt 0x400678main 0x4005c6 [DATA] mov edi, str.Number_now_is__:__d[0x004004b0]>

可視模式

當(dāng)你的代碼很復(fù)雜,有多個(gè)函數(shù)被調(diào)用時(shí),很容易迷失方向。如果能以圖形或可視化的方式查看哪些函數(shù)被調(diào)用,根據(jù)某些條件采取了哪些路徑等,會(huì)很有幫助。在移動(dòng)到感興趣的函數(shù)后,可以通過(guò) VV 命令來(lái)探索 r2 的可視化模式。例如,對(duì)于 adder 函數(shù):

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

全功能的二進(jìn)制文件分析工具 Radare2全功能的二進(jìn)制文件分析工具 Radare2

調(diào)試器

到目前為止,你一直在做的是靜態(tài)分析 —— 你只是在看二進(jìn)制文件中的東西,而沒(méi)有運(yùn)行它,有時(shí)你需要執(zhí)行二進(jìn)制文件,并在運(yùn)行時(shí)分析內(nèi)存中的各種信息。r2 的內(nèi)部調(diào)試器允許你運(yùn)行二進(jìn)制文件、設(shè)置斷點(diǎn)、分析變量的值、或者轉(zhuǎn)儲(chǔ)寄存器的內(nèi)容。

用 -d 標(biāo)志啟動(dòng)調(diào)試器,并在加載二進(jìn)制時(shí)添加 -A 標(biāo)志進(jìn)行分析。你可以通過(guò)使用 db 命令在不同的地方設(shè)置斷點(diǎn),比如函數(shù)或內(nèi)存地址。要查看現(xiàn)有的斷點(diǎn),使用 dbi 命令。一旦你放置了斷點(diǎn),使用 dc 命令開(kāi)始運(yùn)行二進(jìn)制文件。你可以使用 dbt 命令查看堆棧,它可以顯示函數(shù)調(diào)用。最后,你可以使用 drr 命令轉(zhuǎn)儲(chǔ)寄存器的內(nèi)容:

$ r2 -d -A ./adderProcess with PID 17453 started...= attach 17453 17453bin.baddr 0x00400000Using 0x400000asm.bits 64[x] Analyze all flags starting with sym. and entry0 (aa)[x] Analyze function calls (aac)[x] Analyze len bytes of instructions for references (aar)[x] Check for vtables[x] Type matching analysis for all functions (aaft)[x] Propagate noreturn information[x] Use -AA or aaaa to perform additional experimental analysis.-- git checkout hamster[0x7f77b0a28030]>[0x7f77b0a28030]> db main[0x7f77b0a28030]>[0x7f77b0a28030]> db sym.adder[0x7f77b0a28030]>[0x7f77b0a28030]> dbi0 0x004005a5 E:1 T:01 0x00400596 E:1 T:0[0x7f77b0a28030]>[0x7f77b0a28030]> afl | grep main0x004005a5    1 55           main[0x7f77b0a28030]>[0x7f77b0a28030]> afl | grep sym.adder0x00400596    1 15           sym.adder[0x7f77b0a28030]>[0x7f77b0a28030]> dchit breakpoint at: 0x4005a5[0x004005a5]>[0x004005a5]> dbt0  0x4005a5           sp: 0x0                 0    [main]  main sym.adder+151  0x7f77b0687873     sp: 0x7ffe35ff6858      0    [??]  section..gnu.build.attributes-13458205972  0x7f77b0a36e0a     sp: 0x7ffe35ff68e8      144  [??]  map.usr_lib64_ld_2.28.so.r_x+65034[0x004005a5]> dchit breakpoint at: 0x400596[0x00400596]> dbt0  0x400596           sp: 0x0                 0    [sym.adder]  rip entry.init0+61  0x4005be           sp: 0x7ffe35ff6838      0    [main]  main+252  0x7f77b0687873     sp: 0x7ffe35ff6858      32   [??]  section..gnu.build.attributes-13458205973  0x7f77b0a36e0a     sp: 0x7ffe35ff68e8      144  [??]  map.usr_lib64_ld_2.28.so.r_x+65034[0x00400596]>[0x00400596]>[0x00400596]> drrax = 0x00000064rbx = 0x00000000rcx = 0x7f77b0a21738rdx = 0x7ffe35ff6948r8 = 0x7f77b0a22da0r9 = 0x7f77b0a22da0r10 = 0x0000000fr11 = 0x00000002r12 = 0x004004b0r13 = 0x7ffe35ff6930r14 = 0x00000000r15 = 0x00000000rsi = 0x7ffe35ff6938rdi = 0x00000064rsp = 0x7ffe35ff6838rbp = 0x7ffe35ff6850rip = 0x00400596rflags = 0x00000202orax = 0xffffffffffffffff[0x00400596]>

反編譯器

能夠理解匯編是二進(jìn)制分析的前提。匯編語(yǔ)言總是與二進(jìn)制建立和預(yù)期運(yùn)行的架構(gòu)相關(guān)。一行源代碼和匯編代碼之間從來(lái)沒(méi)有 1:1 的映射。通常,一行 C 源代碼會(huì)產(chǎn)生多行匯編代碼。所以,逐行讀取匯編代碼并不是最佳的選擇。

這就是反編譯器的作用。它們?cè)噲D根據(jù)匯編指令重建可能的源代碼。這與用于創(chuàng)建二進(jìn)制的源代碼絕不完全相同,它是基于匯編的源代碼的近似表示。另外,要考慮到編譯器進(jìn)行的優(yōu)化,它會(huì)生成不同的匯編代碼以加快速度,減小二進(jìn)制的大小等,會(huì)使反編譯器的工作更加困難。另外,惡意軟件作者經(jīng)常故意混淆代碼,讓惡意軟件的分析人員望而卻步。

Radare2 通過(guò)插件提供反編譯器。你可以安裝任何 Radare2 支持的反編譯器。使用 r2pm -l 命令可以查看當(dāng)前插件。使用 r2pm install 命令來(lái)安裝一個(gè)示例的反編譯器 r2dec:

$ r2pm  -l$$ r2pm install r2decCloning into 'r2dec'...remote: Enumerating objects: 100, done.remote: Counting objects: 100% (100/100), done.remote: Compressing objects: 100% (97/97), done.remote: Total 100 (delta 18), reused 27 (delta 1), pack-reused 0Receiving objects: 100% (100/100), 1.01 MiB | 1.31 MiB/s, done.Resolving deltas: 100% (18/18), done.Install Done For r2decgmake: Entering directory '/root/.local/share/radare2/r2pm/git/r2dec/p'[CC] duktape/duktape.o[CC] duktape/duk_console.o[CC] core_pdd.o[CC] core_pdd.sogmake: Leaving directory '/root/.local/share/radare2/r2pm/git/r2dec/p'$$ r2pm  -lr2dec$

反編譯器視圖

要反編譯一個(gè)二進(jìn)制文件,在 r2 中加載二進(jìn)制文件并自動(dòng)分析它。在本例中,使用 s sym.adder 命令移動(dòng)到感興趣的 adder 函數(shù),然后使用 pdda 命令并排查看匯編和反編譯后的源代碼。閱讀這個(gè)反編譯后的源代碼往往比逐行閱讀匯編更容易:

$ r2 -A ./adder[x] Analyze all flags starting with sym. and entry0 (aa)[x] Analyze function calls (aac)[x] Analyze len bytes of instructions for references (aar)[x] Check for vtables[x] Type matching analysis for all functions (aaft)[x] Propagate noreturn information[x] Use -AA or aaaa to perform additional experimental analysis.-- What do you want to debug today?[0x004004b0]>[0x004004b0]> s sym.adder[0x00400596]>[0x00400596]> s0x400596[0x00400596]>[0x00400596]> pdda   ; assembly                               | /* r2dec pseudo code output */                                            | /* ./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 add eax, 1                    |     eax++;   0x004005a3 pop rbp                       |       0x004005a4 ret                           |     return eax;                                            | }[0x00400596]> 

配置設(shè)置

隨著你對(duì) Radare2 的使用越來(lái)越熟悉,你會(huì)想改變它的配置,以適應(yīng)你的工作方式。你可以使用 e 命令查看 r2 的默認(rèn)配置。要設(shè)置一個(gè)特定的配置,在 e 命令后面添加 config = value:

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

要使配置更改永久化,請(qǐng)將它們放在 r2 啟動(dòng)時(shí)讀取的名為 .radare2rc 的啟動(dòng)文件中。這個(gè)文件通常在你的主目錄下,如果沒(méi)有,你可以創(chuàng)建一個(gè)。一些示例配置選項(xiàng)包括:

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

探索更多

你已經(jīng)看到了足夠多的 Radare2 功能,對(duì)這個(gè)工具有了一定的了解。因?yàn)?Radare2 遵循 Unix 哲學(xué),即使你可以從它的主控臺(tái)做各種事情,它也會(huì)在下面使用一套獨(dú)立的二進(jìn)制來(lái)完成它的任務(wù)。

探索下面列出的獨(dú)立二進(jìn)制文件,看看它們是如何工作的。例如,用 iI 命令在控制臺(tái)看到的二進(jìn)制信息也可以用 rabin2 命令找到:

$ cd bin/
$
$ ls
prefix  r2agent    r2pm  rabin2   radiff2  ragg2    rarun2   rasm2
r2      r2-indent  r2r   radare2  rafind2  rahash2  rasign2  rax2
$

分享名稱(chēng):Linux下radare2使用方法
鏈接地址:http://www.dlmjj.cn/article/cdjegig.html