The Official Radare2 Book — страница 44 из 64

The -z option is used to list readable strings found in the .rodata section of ELF binaries, or the .text section of PE files. Example:

$ rabin2 -z /bin/ls | head

[Strings]

nth paddr vaddr len size section type string

―――――――――――――――――――――――――――――――――――――――――――――――――――――――

000 0x000160f8 0x000160f8 11 12 (.rodata) ascii dev_ino_pop

001 0x00016188 0x00016188 10 11 (.rodata) ascii sort_files

002 0x00016193 0x00016193 6 7 (.rodata) ascii posix-

003 0x0001619a 0x0001619a 4 5 (.rodata) ascii main

004 0x00016250 0x00016250 10 11 (.rodata) ascii ?pcdb-lswd

005 0x00016260 0x00016260 65 66 (.rodata) ascii # Configuration file for dircolors, a utility to help you set the

006 0x000162a2 0x000162a2 72 73 (.rodata) ascii # LS_COLORS environment variable used by GNU ls with the --color option.

007 0x000162eb 0x000162eb 56 57 (.rodata) ascii # Copyright (C) 1996-2018 Free Software Foundation, Inc.

008 0x00016324 0x00016324 70 71 (.rodata) ascii # Copying and distribution of this file, with or without modification,

009 0x0001636b 0x0001636b 76 77 (.rodata) ascii # are permitted provided the copyright notice and this notice are preserved.

With the -zr option, this information is represented as a radare2 commands list. It can be used in a radare2 session to automatically create a flag space called "strings" pre-populated with flags for all strings found by rabin2. Furthermore, this script will mark corresponding byte ranges as strings instead of code.

$ rabin2 -zr /bin/ls | head

fs stringsf str.dev_ino_pop 12 @ 0x000160f8

Cs 12 @ 0x000160f8

f str.sort_files 11 @ 0x00016188

Cs 11 @ 0x00016188

f str.posix 7 @ 0x00016193

Cs 7 @ 0x00016193

f str.main 5 @ 0x0001619a

Cs 5 @ 0x0001619a

f str.pcdb_lswd 11 @ 0x00016250

Cs 11 @ 0x00016250

Program Sections

Rabin2 called with the -S option gives complete information about the sections of an executable. For each section the index, offset, size, alignment, type and permissions, are shown. The next example demonstrates this:

$ rabin2 -S /bin/ls

[Sections]


nth paddr size vaddr vsize perm name

―――――――――――――――――――――――――――――――――――――――――――――――――――――

00 0x00000000 0 0x00000000 0 ----

01 0x00000238 28 0x00000238 28 -r-- .interp

02 0x00000254 32 0x00000254 32 -r-- .note.ABI_tag

03 0x00000278 176 0x00000278 176 -r-- .gnu.hash

04 0x00000328 3000 0x00000328 3000 -r-- .dynsym

05 0x00000ee0 1412 0x00000ee0 1412 -r-- .dynstr

06 0x00001464 250 0x00001464 250 -r-- .gnu.version

07 0x00001560 112 0x00001560 112 -r-- .gnu.version_r

08 0x000015d0 4944 0x000015d0 4944 -r-- .rela.dyn

09 0x00002920 2448 0x00002920 2448 -r-- .rela.plt

10 0x000032b0 23 0x000032b0 23 -r-x .init

11 0x000032d0 1648 0x000032d0 1648 -r-x .plt

12 0x00003940 24 0x00003940 24 -r-x .plt.got

13 0x00003960 73931 0x00003960 73931 -r-x .text

14 0x00015a2c 9 0x00015a2c 9 -r-x .fini

15 0x00015a40 20201 0x00015a40 20201 -r-- .rodata

16 0x0001a92c 2164 0x0001a92c 2164 -r-- .eh_frame_hdr

17 0x0001b1a0 11384 0x0001b1a0 11384 -r-- .eh_frame

18 0x0001e390 8 0x0021e390 8 -rw- .init_array

19 0x0001e398 8 0x0021e398 8 -rw- .fini_array

20 0x0001e3a0 2616 0x0021e3a0 2616 -rw- .data.rel.ro

21 0x0001edd8 480 0x0021edd8 480 -rw- .dynamic

22 0x0001efb8 56 0x0021efb8 56 -rw- .got

23 0x0001f000 840 0x0021f000 840 -rw- .got.plt

24 0x0001f360 616 0x0021f360 616 -rw- .data

25 0x0001f5c8 0 0x0021f5e0 4824 -rw- .bss

26 0x0001f5c8 232 0x00000000 232 ---- .shstrtab

With the -Sr option, rabin2 will flag the start/end of every section, and will pass the rest of information as a comment.

$ rabin2 -Sr /bin/ls | head

fs sections

"f section. 1 0x00000000"

"f section..interp 1 0x000002a8"

"f section..note.gnu.build_id 1 0x000002c4"

"f section..note.ABI_tag 1 0x000002e8"

"f section..gnu.hash 1 0x00000308"

"f section..dynsym 1 0x000003b8"

"f section..dynstr 1 0x00000fb8"

"f section..gnu.version 1 0x00001574"

"f section..gnu.version_r 1 0x00001678"

Radiff2

Radiff2 is a tool designed to compare binary files, similar to how regular diff compares text files.

$ radiff2 -h

Usage: radiff2 [-abBcCdjrspOxuUvV] [-A[A]] [-g sym] [-m graph_mode][-t %] [file] [file]

-a [arch] specify architecture plugin to use (x86, arm, ..)

-A [-A] run aaa or aaaa after loading each binary (see -C)

-b [bits] specify register size for arch (16 (thumb), 32, 64, ..)

-B output in binary diff (GDIFF)

-c count of changes

-C graphdiff code (columns: off-A, match-ratio, off-B) (see -A)

-d use delta diffing

-D show disasm instead of hexpairs

-e [k=v] set eval config var value for all RCore instances

-g [sym|off1,off2] graph diff of given symbol, or between two offsets

-G [cmd] run an r2 command on every RCore instance created

-i diff imports of target files (see -u, -U and -z)

-j output in json format

-n print bare addresses only (diff.bare=1)

-m [aditsjJ] choose the graph output mode

-O code diffing with opcode bytes only

-p use physical addressing (io.va=0)

-q quiet mode (disable colors, reduce output)

-r output in radare commands

-s compute edit distance (no substitution, Eugene W. Myers' O(ND) diff algorithm)

-ss compute Levenshtein edit distance (substitution is allowed, O(N^2))

-S [name] sort code diff (name, namelen, addr, size, type, dist) (only for -C or -g)

-t [0-100] set threshold for code diff (default is 70%)

-x show two column hexdump diffing

-X show two column hexII diffing

-u unified output (---+++)

-U unified output using system 'diff'

-v show version information

-V be verbose (current only for -s)

-z diff on extracted strings

-Z diff code comparing zignatures


Graph Output formats: (-m [mode])

Ascii art

s r2 commands

d Graphviz dot

g Graph Modelling Language (gml)

j json

J json with disarm

k SDB key-value

t Tiny ascii art

i Interactive ascii art

Binary Diffing

This section is based on the http://radare.today article "binary diffing"

Without any parameters, radiff2 by default shows what bytes are changed and their corresponding offsets:

$ radiff2 genuine cracked

0x000081e0 85c00f94c0 => 9090909090 0x000081e0

0x0007c805 85c00f84c0 => 9090909090 0x0007c805


$ rasm2 -d 85c00f94c0

test eax, eax

sete al

Notice how the two jumps are nop'ed.

For bulk processing, you may want to have a higher-level overview of differences. This is why radare2 is able to compute the distance and the percentage of similarity between two files with the -s option:

$ radiff2 -s /bin/true /bin/false

similarity: 0.97

distance: 743

If you want more concrete data, it's also possible to count the differences, with the -c option:

$ radiff2 -c genuine cracked

2

If you are unsure whether you are dealing with similar binaries, with -C flag you can check there are matching functions. It this mode, it will give you three columns for all functions: "First file offset", "Percentage of matching" and "Second file offset".

$ radiff2 -C /bin/false /bin/true

entry0 0x4013e8 | MATCH (0.904762) | 0x4013e2 entry0

sym.imp.__libc_start_main 0x401190 | MATCH (1.000000) | 0x401190 sym.imp.__libc_start_main

fcn.00401196 0x401196 | MATCH (1.000000) | 0x401196 fcn.00401196

fcn.0040103c 0x40103c | MATCH (1.000000) | 0x40103c fcn.0040103c

fcn.00401046 0x401046 | MATCH (1.000000) | 0x401046 fcn.00401046

fcn.000045e0 24 0x45e0 | UNMATCH (0.916667) | 0x45f0 24 fcn.000045f0

...

Moreover, we can ask radiff2 to perform analysis first - adding -A option will run aaa on the binaries. And we can specify binaries architecture for this analysis too using

$ radiff2 -AC -a x86 /bin/true /bin/false | grep UNMATCH

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

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

[x] Analyze function calls (aac)

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

[x] Constructing a function name for fcn.* and sym.func.* functions (aan))

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

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

[x] Analyze function calls (aac)

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

[x] Constructing a function name for fcn.* and sym.func.* functions (aan))

sub.fileno_500 86 0x4500 | UNMATCH (0.965116) | 0x4510 86 sub.fileno_510

sub.__freading_4c0 59 0x44c0 | UNMATCH (0.949153) | 0x44d0 59 sub.__freading_4d0

sub.fileno_440 120 0x4440 | UNMATCH (0.200000) | 0x4450 120 sub.fileno_450