Выбрать главу

| psu[zj] print utf16 unicode (json)

| psw[j] print 16bit wide string

| psW[j] print 32bit wide string

| psx show string with escaped chars

| psz[j] print zero-terminated string

Most strings are zero-terminated. Below there is an example using the debugger to continue the execution of a program until it executes the 'open' syscall. When we recover the control over the process, we get the arguments passed to the syscall, pointed by %ebx. In the case of the 'open' call, it is a zero terminated string which we can inspect using psz.

[0x4A13B8C0]> dcs open

0x4a14fc24 syscall(5) open ( 0x4a151c91 0x00000000 0x00000000 ) = 0xffffffda

[0x4A13B8C0]> dr

eax 0xffffffda esi 0xffffffff eip 0x4a14fc24

ebx 0x4a151c91 edi 0x4a151be1 oeax 0x00000005

ecx 0x00000000 esp 0xbfbedb1c eflags 0x200246

edx 0x00000000 ebp 0xbfbedbb0 cPaZstIdor0 (PZI)

[0x4A13B8C0]>

[0x4A13B8C0]> psz @ 0x4a151c91

/etc/ld.so.cache

It is also possible to print various packed data types using the pf command:

[0xB7F08810]> pf xxS @ rsp

0x7fff0d29da30 = 0x00000001

0x7fff0d29da34 = 0x00000000

0x7fff0d29da38 = 0x7fff0d29da38 -> 0x0d29f7ee /bin/ls

This can be used to look at the arguments passed to a function. To achieve this, simply pass a 'format memory string' as an argument to pf, and temporally change the current seek position/offset using @. It is also possible to define arrays of structures with pf. To do this, prefix the format string with a numeric value. You can also define a name for each field of the structure by appending them as a space-separated arguments list.

[0x4A13B8C0]> pf 2*xw pointer type @ esp

0x00404888 [0] {

pointer :

(*0xffffffff8949ed31) type : 0x00404888 = 0x8949ed31

0x00404890 = 0x48e2

}

0x00404892 [1] {

(*0x50f0e483) pointer : 0x00404892 = 0x50f0e483

type : 0x0040489a = 0x2440

}

A practical example for using pf on a binary of a GStreamer plugin:

$ radare2 /usr/lib/gstreamer-1.0/libgstflv.so

[0x00006020]> aa; pdf @ sym.gst_plugin_flv_get_desc

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

sym.gst_plugin_flv_get_desc ();

[...]

0x00013830 488d0549db0000 lea rax, section..data.rel.ro ; 0x21380

0x00013837 c3 ret

[0x00006020]> s section..data.rel.ro

[0x00021380]> pf ii*z*zp*z*z*z*z*z*z major minor name desc init version license source package origin release_datetime

major : 0x00021380 = 1

minor : 0x00021384 = 18

name : (*0x19cf2)0x00021388 = "flv"

desc : (*0x1b358)0x00021390 = "FLV muxing and demuxing plugin"

init : 0x00021398 = (qword)0x0000000000013460

version : (*0x19cae)0x000213a0 = "1.18.2"

license : (*0x19ce1)0x000213a8 = "LGPL"

source : (*0x19cd0)0x000213b0 = "gst-plugins-good"

package : (*0x1b378)0x000213b8 = "GStreamer Good Plugins (Arch Linux)"

origin : (*0x19cb5)0x000213c0 = "https://www.archlinux.org/"

release_datetime : (*0x19cf6)0x000213c8 = "2020-12-06"

The pd command is used to disassemble code. It accepts a numeric value to specify how many instructions should be disassembled. The pD command is similar but instead of a number of instructions, it decompiles a given number of bytes.

   • d : disassembly N opcodes count of opcodes

   • D : asm.arch disassembler bsize bytes

[0x00404888]> pd 1

;-- entry0:

0x00404888 31ed xor ebp, ebp

The architecture flavor for the disassembler is defined by the asm.arch eval variable. You can use e asm.arch=?? to list all available architectures.

[0x00005310]> e asm.arch=??

_dAe _8_16 6502 LGPL3 6502/NES/C64/Tamagotchi/T-1000 CPU

_dAe _8 8051 PD 8051 Intel CPU

_dA_ _16_32 arc GPL3 Argonaut RISC Core

a___ _16_32_64 arm.as LGPL3 as ARM Assembler (use ARM_AS environment)

adAe _16_32_64 arm BSD Capstone ARM disassembler

_dA_ _16_32_64 arm.gnu GPL3 Acorn RISC Machine CPU

_d__ _16_32 arm.winedbg LGPL2 WineDBG's ARM disassembler

adAe _8_16 avr GPL AVR Atmel

adAe _16_32_64 bf LGPL3 Brainfuck

_dA_ _32 chip8 LGPL3 Chip8 disassembler

_dA_ _16 cr16 LGPL3 cr16 disassembly plugin

_dA_ _32 cris GPL3 Axis Communications 32-bit embedded processor

adA_ _32_64 dalvik LGPL3 AndroidVM Dalvik

ad__ _16 dcpu16 PD Mojang's DCPU-16

_dA_ _32_64 ebc LGPL3 EFI Bytecode

adAe _16 gb LGPL3 GameBoy(TM) (z80-like)

_dAe _16 h8300 LGPL3 H8/300 disassembly plugin

_dAe _32 hexagon LGPL3 Qualcomm Hexagon (QDSP6) V6

_d__ _32 hppa GPL3 HP PA-RISC

_dAe _0 i4004 LGPL3 Intel 4004 microprocessor

_dA_ _8 i8080 BSD Intel 8080 CPU

adA_ _32 java Apache Java bytecode

_d__ _32 lanai GPL3 LANAI

...

There are multiple options which can be used to configure the output of the disassembler. All these options are described in e? asm.

[0x00005310]> e? asm.

asm.anaclass="underline" Analyze code and refs while disassembling (see anal.strings)

asm.arch: Set the arch to be used by asm

asm.assembler: Set the plugin name to use when assembling

asm.bbline: Show empty line after every basic block

asm.bits: Word size in bits at assembler

asm.bytes: Display the bytes of each instruction

asm.bytespace: Separate hexadecimal bytes with a whitespace

asm.calls: Show callee function related info as comments in disasm

asm.capitalize: Use camelcase at disassembly

asm.cmt.coclass="underline" Column to align comments

asm.cmt.flgrefs: Show comment flags associated to branch reference

asm.cmt.fold: Fold comments, toggle with Vz

...

Currently there are 136 asm. configuration variables so we do not list them all.

The asm.syntax variable is used to change the flavor of the assembly syntax used by a disassembler engine. To switch between Intel and AT&T representations:

e asm.syntax = intel

e asm.syntax = att

You can also check asm.pseudo, which is an experimental pseudocode view, and asm.esil which outputs ESIL ('Evaluable Strings Intermediate Language'). ESIL's goal is to have a human-readable representation of every opcode semantics. Such representations can be evaluated (interpreted) to emulate effects of individual instructions.

Flags are conceptually similar to bookmarks. They associate a name with a given offset in a file. Flags can be grouped into 'flag spaces'. A flag space is a namespace for flags, grouping together flags of similar characteristics or type. Examples for flag spaces: sections, registers, symbols.

To create a flag: