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

wer data

-qq show less info (no offset/size for -z for ex.)

-Q show load address used by dlopen (non-aslr libs)

-r radare output

-R relocations

-s symbols

-S sections

-u unfiltered (no rename duplicated symbols/sections)

-v display version and quit

-V Show binary version information

-x extract bins contained in file

-X [fmt] [f] .. package in fat or zip the given files and bins contained in file

-z strings (from data section)

-zz strings (from raw bins [e bin.rawstr=1])

-zzz dump raw strings to stdout (for huge files)

-Z guess size of binary program

......

File Properties Identification

File type identification is done using -I. With this option, rabin2 prints information on a binary type, like its encoding, endianness, class, operating system:

$ rabin2 -I /bin/ls

arch x86

binsz 128456

bintype elf

bits 64

canary true

class ELF64

crypto false

endian little

havecode true

intrp /lib64/ld-linux-x86-64.so.2

lang c

linenum false

lsyms false

machine AMD x86-64 architecture

maxopsz 16

minopsz 1

nx true

os linux

pcalign 0

pic true

relocs false

relro partial

rpath NONE

static false

stripped true

subsys linux

va true

To make rabin2 output information in format that the main program, radare2, can understand, pass -Ir option to it:

$ rabin2 -Ir /bin/ls

e cfg.bigendian=false

e asm.bits=64

e asm.dwarf=true

e bin.lang=c

e file.type=elf

e asm.os=linux

e asm.arch=x86

e asm.pcalign=0

Code Entrypoints

The -e option passed to rabin2 will show entrypoints for given binary. Two examples:

$ rabin2 -e /bin/ls

[Entrypoints]

vaddr=0x00005310 paddr=0x00005310 baddr=0x00000000 laddr=0x00000000 haddr=0x00000018 type=program


1 entrypoints


$ rabin2 -er /bin/ls

fs symbols

f entry0 1 @ 0x00005310

f entry0_haddr 1 @ 0x00000018

s entry0

Imports

Rabin2 is able to find imported objects by an executable, as well as their offsets in its PLT. This information is useful, for example, to understand what external function is invoked by call instruction. Pass -i flag to rabin2 to get a list of imports. An example:

$ rabin2 -i /bin/ls

[Imports]

nth vaddr bind type lib name

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

1 0x000032e0 GLOBAL FUNC __ctype_toupper_loc

2 0x000032f0 GLOBAL FUNC getenv

3 0x00003300 GLOBAL FUNC sigprocmask

4 0x00003310 GLOBAL FUNC __snprintf_chk

5 0x00003320 GLOBAL FUNC raise

6 0x00000000 GLOBAL FUNC free

7 0x00003330 GLOBAL FUNC abort

8 0x00003340 GLOBAL FUNC __errno_location

9 0x00003350 GLOBAL FUNC strncmp

10 0x00000000 WEAK NOTYPE _ITM_deregisterTMCloneTable

11 0x00003360 GLOBAL FUNC localtime_r

12 0x00003370 GLOBAL FUNC _exit

13 0x00003380 GLOBAL FUNC strcpy

14 0x00003390 GLOBAL FUNC __fpending

15 0x000033a0 GLOBAL FUNC isatty

16 0x000033b0 GLOBAL FUNC sigaction

17 0x000033c0 GLOBAL FUNC iswcntrl

18 0x000033d0 GLOBAL FUNC wcswidth

19 0x000033e0 GLOBAL FUNC localeconv

20 0x000033f0 GLOBAL FUNC mbstowcs

21 0x00003400 GLOBAL FUNC readlink

...


Exports

Rabin2 is able to find exports. For example:

$ rabin2 -E /usr/lib/libr_bin.so | head

[Exports]


nth paddr vaddr bind type size lib name

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

210 0x000ae1f0 0x000ae1f0 GLOBAL FUNC 200 r_bin_java_print_exceptions_attr_summary

211 0x000afc90 0x000afc90 GLOBAL FUNC 135 r_bin_java_get_args

212 0x000b18e0 0x000b18e0 GLOBAL FUNC 35 r_bin_java_get_item_desc_from_bin_cp_list

213 0x00022d90 0x00022d90 GLOBAL FUNC 204 r_bin_class_add_method

214 0x000ae600 0x000ae600 GLOBAL FUNC 175 r_bin_java_print_fieldref_cp_summary

215 0x000ad880 0x000ad880 GLOBAL FUNC 144 r_bin_java_print_constant_value_attr_summary

216 0x000b7330 0x000b7330 GLOBAL FUNC 679 r_bin_java_print_element_value_summary

217 0x000af170 0x000af170 GLOBAL FUNC 65 r_bin_java_create_method_fq_str

218 0x00079b00 0x00079b00 GLOBAL FUNC 15 LZ4_createStreamDecode

Symbols (Exports)

With rabin2, the generated symbols list format is similar to the imports list. Use the -s option to get it:

rabin2 -s /bin/ls | head

[Symbols]


nth paddr vaddr bind type size lib name

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

110 0x000150a0 0x000150a0 GLOBAL FUNC 56 _obstack_allocated_p

111 0x0001f600 0x0021f600 GLOBAL OBJ 8 program_name

112 0x0001f620 0x0021f620 GLOBAL OBJ 8 stderr

113 0x00014f90 0x00014f90 GLOBAL FUNC 21 _obstack_begin_1

114 0x0001f600 0x0021f600 WEAK OBJ 8 program_invocation_name

115 0x0001f5c0 0x0021f5c0 GLOBAL OBJ 8 alloc_failed_handler

116 0x0001f5f8 0x0021f5f8 GLOBAL OBJ 8 optarg

117 0x0001f5e8 0x0021f5e8 GLOBAL OBJ 8 stdout

118 0x0001f5e0 0x0021f5e0 GLOBAL OBJ 8 program_short_name

With the -sr option rabin2 produces a radare2 script instead. It can later be passed to the core to automatically flag all symbols and to define corresponding byte ranges as functions and data blocks.

$ rabin2 -sr /bin/ls | head

fs symbols

f sym.obstack_allocated_p 56 0x000150a0

f sym.program_invocation_name 8 0x0021f600

f sym.stderr 8 0x0021f620

f sym.obstack_begin_1 21 0x00014f90

f sym.program_invocation_name 8 0x0021f600

f sym.obstack_alloc_failed_handler 8 0x0021f5c0

f sym.optarg 8 0x0021f5f8

f sym.stdout 8 0x0021f5e8

f sym.program_invocation_short_name 8 0x0021f5e0

List Libraries

Rabin2 can list libraries used by a binary with the -l option:

$ rabin2 -l `which r2`

[Linked libraries]

libr_core.so

libr_parse.so

libr_search.so

libr_cons.so

libr_config.so

libr_bin.so

libr_debug.so

libr_anal.so

libr_reg.so

libr_bp.so

libr_io.so

libr_fs.so

libr_asm.so

libr_syscall.so

libr_hash.so

libr_magic.so

libr_flag.so

libr_egg.so

libr_crypto.so

libr_util.so

libpthread.so.0

libc.so.6


22 libraries

Lets check the output with ldd command:

$ ldd `which r2`

linux-vdso.so.1 (0x00007fffba38e000)

libr_core.so => /usr/lib64/libr_core.so (0x00007f94b4678000)

libr_parse.so => /usr/lib64/libr_parse.so (0x00007f94b4425000)

libr_search.so => /usr/lib64/libr_search.so (0x00007f94b421f000)

libr_cons.so => /usr/lib64/libr_cons.so (0x00007f94b4000000)

libr_config.so => /usr/lib64/libr_config.so (0x00007f94b3dfa000)

libr_bin.so => /usr/lib64/libr_bin.so (0x00007f94b3afd000)

libr_debug.so => /usr/lib64/libr_debug.so (0x00007f94b38d2000)

libr_anal.so => /usr/lib64/libr_anal.so (0x00007f94b2fbd000)

libr_reg.so => /usr/lib64/libr_reg.so (0x00007f94b2db4000)

libr_bp.so => /usr/lib64/libr_bp.so (0x00007f94b2baf000)

libr_io.so => /usr/lib64/libr_io.so (0x00007f94b2944000)

libr_fs.so => /usr/lib64/libr_fs.so (0x00007f94b270e000)

libr_asm.so => /usr/lib64/libr_asm.so (0x00007f94b1c69000)

libr_syscall.so => /usr/lib64/libr_syscall.so (0x00007f94b1a63000)

libr_hash.so => /usr/lib64/libr_hash.so (0x00007f94b185a000)

libr_magic.so => /usr/lib64/libr_magic.so (0x00007f94b164d000)

libr_flag.so => /usr/lib64/libr_flag.so (0x00007f94b1446000)

libr_egg.so => /usr/lib64/libr_egg.so (0x00007f94b1236000)

libr_crypto.so => /usr/lib64/libr_crypto.so (0x00007f94b1016000)

libr_util.so => /usr/lib64/libr_util.so (0x00007f94b0d35000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f94b0b15000)

libc.so.6 => /lib64/libc.so.6 (0x00007f94b074d000)

libr_lang.so => /usr/lib64/libr_lang.so (0x00007f94b0546000)

libr_socket.so => /usr/lib64/libr_socket.so (0x00007f94b0339000)

libm.so.6 => /lib64/libm.so.6 (0x00007f94affaf000)

libdl.so.2 => /lib64/libdl.so.2 (0x00007f94afdab000)

/lib64/ld-linux-x86-64.so.2 (0x00007f94b4c79000)

libssl.so.1.0.0 => /usr/lib64/libssl.so.1.0.0 (0x00007f94afb3c000)

libcrypto.so.1.0.0 => /usr/lib64/libcrypto.so.1.0.0 (0x00007f94af702000)

libutil.so.1 => /lib64/libutil.so.1 (0x00007f94af4ff000)

libz.so.1 => /lib64/libz.so.1 (0x00007f94af2e8000)

If you compare the outputs of rabin2 -l and ldd, you will notice that rabin2 lists fewer libraries than ldd. The reason is that rabin2 does not follow and does not show dependencies of libraries. Only direct binary dependencies are shown.

Strings