diff --git a/doc/2.1_vm.md b/doc/2.1_vm.md index ee82dd8..7086552 100644 --- a/doc/2.1_vm.md +++ b/doc/2.1_vm.md @@ -19,7 +19,7 @@ skanlite cantata kdenlive konversation libreoffice-still thunderbird-kde k3b cup yaourt -S: -virtualbox tree git ipython ipython2 gdb google-chrome tcpdump vim wireshark-qt edb ssdeep wps-office strace metasploit pwntools peda oh-my-zsh-git radare2 binwalk burpsuite checksec netcat +virtualbox tree git ipython ipython2 gdb google-chrome tcpdump vim wireshark-qt edb ssdeep wps-office strace metasploit pwntools peda oh-my-zsh-git radare2 binwalk burpsuite checksec netcat wxhexeditor pip3/pip2 install: diff --git a/doc/2.5_radare2.md b/doc/2.5_radare2.md index bc8a14c..1d82e7c 100644 --- a/doc/2.5_radare2.md +++ b/doc/2.5_radare2.md @@ -13,11 +13,11 @@ - [rarun2](#rarun2) - [rax2](rax2) - [交互式使用方法](#交互式使用方法) - - [分析(analyze)](#分析analysis) + - [分析(analyze)](#分析analyze) - [Flags](#flags) - [定位(seeking)](#定位seeking) - - [信息(information)](#信息(information)) - - [打印(print) & 反汇编(disassembling)](#打印print反汇编disassembling) + - [信息(information)](#信息information) + - [打印(print) & 反汇编(disassembling)](#打印print--反汇编disassembling) - [写入(write)](#写入write) - [视图模式](#视图模式) - [Web 界面使用](#web-界面使用) @@ -58,7 +58,7 @@ Radare2 在命令行下有一些小工具可供使用: - rahash2:基于块的哈希工具。 - radiff2:二进制文件或代码差异比对。 - rafind2:查找字节模式。 -- ragg2:r_egg 的前端,将以简单高级语言编写的程序编译成x86、x86-64和ARM的二进制文件。 +- ragg2:r_egg 的前端,将高级语言编写的简单程序编译成x86、x86-64和ARM的二进制文件。 - rarun2:用于在不同环境中运行程序。 - rax2:数据格式转换。 @@ -166,6 +166,20 @@ Usage: rabin2 [-AcdeEghHiIjlLMqrRsSvVxzZ] [-@ at] [-a arch] [-b bits] [-B addr] -Z guess size of binary program ``` +当我们拿到一个二进制文件时,第一步就是获取关于它的基本信息,这时候就可以使用 rabin2。rabin2 可以获取包括 ELF、PE、Mach-O、Java CLASS 文件的区段、头信息、导入导出表、数据段字符串、入口点等信息,并且支持多种格式的输出。 + +下面介绍一些常见的用法:(我还会列出其他实现类似功能工具的用法,你可以对比一下它们的输出) +- `-I`:最常用的参数,它可以打印出二进制文件信息,其中我们需要重点关注其使用的安全防护技术,如 canary、pic、nx 等。(`file`、`chekcsec -f`) +- `-e`:得到二进制文件的入口点。(`readelf -h`) +- `-i`:获得导入符号表,RLT中的偏移等。(`readelf -r`) +- `-E`:获得全局导出符号表。 +- `-s`:获得符号表。(`readelf -s`) +- `-l`:获得二进制文件使用到的动态链接库。(`ldd`) +- `-z`:从 ELF 文件的 .rodare 段或 PE 文件的 .text 中获得字符串。(`strings -d`) +- `-S`:获得完整的段信息。(`readelf -S`) +- `-c`:列出所有类,在分析 Java 程序是很有用。 + +最后还要提到的一个参数 `-r`,它可以将我们得到的信息以 radare2 可读的形式输出,在后续的分析中可以将这样格式的信息输入 radare2,这是非常有用的。 #### rasm2 ```text @@ -197,6 +211,37 @@ Usage: rasm2 [-ACdDehLBvw] [-a arch] [-b bits] [-o addr] [-s syntax] -q quiet mode ``` +rasm2 是一个内联汇编、反汇编程序。它的主要功能是获取给定机器指令操作码对应的字节。 + +下面是一些重要的参数: +- `-L`:列出目标体系结构所支持的插件,输出中的第一列说明了插件提供的功能(a=asm, d=disasm, A=analyze, e=ESIL)。 +- `-a`:知道插件的名字后,就可以使用 -a` 来进行设置。 +- `-b`:设置CPU寄存器的位数。 +- `-d`:反汇编十六进制对字符串。 +- `-D`:反汇编并显示十六进制对和操作码。 +- `-C`:汇编后以 C 语言风格输出。 +- `-f`:从文件中读入汇编代码。 + +例子: +``` +$ rasm2 -a x86 -b 32 'mov eax,30' +b81e000000 +$ rasm2 -a x86 -b 32 'mov eax,30' -C +"\xb8\x1e\x00\x00\x00" + +$ rasm2 -d b81e000000 +mov eax, 0x1e +$ rasm2 -D b81e000000 +0x00000000 5 b81e000000 mov eax, 0x1e +$ rasm2 -a x86 -b 32 -d 'b81e000000' +mov eax, 0x1e + +$ cat a.asm +mov eax,30 +$ rasm2 -f a.asm +b81e000000 +``` + #### rahash2 ```text $ rahash2 -h @@ -223,6 +268,37 @@ Usage: rahash2 [-rBhLkv] [-b S] [-a A] [-c H] [-E A] [-s S] [-f O] [-t O] [file] -v show version information ``` +rahash2 用于计算检验和,支持字节流、文件、字符串等形式和多种算法。 + +重要参数: +- `-a`:指定算法。默认为 sha256,如果指定为 all,则使用所有算法。 +- `-b`:指定块的大小(而不是整个文件) +- `-B`:打印处每个块的哈希 +- `-s`:指定字符串(而不是文件) +- `-a entropy`:显示每个块的熵(`-B -b 512 -a entropy`) + - ``` + $ rahash2 -B -b 1024 a.out + 0x00000000-0x000003ff sha256: 1fd71dfb92c2c1290c3f6a09e477b470a625aef4ab262e18127e6db790c47487 + 0x00000400-0x000007ff sha256: e4829aeb02e97585d663ace279a04d51e39964367943519e4136ab23f43b642a + 0x00000800-0x00000bff sha256: 9ace05fc25ac536646f116d1030fbe03a958bc0ee3ae0af4b378e7549553bf5d + 0x00000c00-0x00000fff sha256: d7f185a66987ff7ba0ac0813ff473c5f75e988c5904399f3e24994cade489f81 + 0x00001000-0x000013ff sha256: 1c24ed40e088544cd39ec974b7ebc6f6fb57a71f7d56455625ffe4f259825671 + 0x00001400-0x000017ff sha256: 9acbb50272925734fb1d1feca94e493dcdcd213c815f6680eecd22cba17a2494 + 0x00001800-0x00001bff sha256: c202fd18e976abdae80e4519f156aa5d7ad1623cd183d85429abdb388910b88b + 0x00001c00-0x00001fff sha256: 7e23808d6acc635b763ef5b9171af1eb39a428a314e8edbdc02fd985abf19918 + 0x00002000-0x00002097 sha256: a44370a272c40becac05c369467dea4e7444dab674d7db029ff0b8be99330ba0 + $ rahash2 -B -b 1024 -a entropy a.out + 0x00000000-0x000003ff 2.820547: 35% [###############------------------------------] + 0x00000400-0x000007ff 4.855878: 60% [###########################------------------] + 0x00000800-0x00000bff 0.222447: 2% [---------------------------------------------] + 0x00000c00-0x00000fff 0.810801: 10% [####-----------------------------------------] + 0x00001000-0x000013ff 1.672678: 20% [#########------------------------------------] + 0x00001400-0x000017ff 3.942760: 49% [######################-----------------------] + 0x00001800-0x00001bff 3.153171: 39% [#################----------------------------] + 0x00001c00-0x00001fff 1.325161: 16% [#######--------------------------------------] + 0x00002000-0x00002097 0.942890: 11% [####-----------------------------------------] + ``` + #### radiff2 ```text $ radiff2 -h @@ -256,6 +332,15 @@ Usage: radiff2 [-abcCdjrspOxuUvV] [-A[A]] [-g sym] [-t %] [file] [file] -z diff on extracted strings ``` +radiff2 是一个基于偏移的比较工具。 + +重要参数: +- `-s`:计算文本距离并得到相似度。 +- `-AC`:这两个参数通常一起使用,从函数的角度进行比较。 +- `-g`:得到给定的符号或两个偏移的图像对比。 + - 如:`radiff2 -g main a.out b.out | xdot -`(需要安装xdot) +- `-c`:计算不同点的数量。 + #### rafind2 ```text $ rafind2 -h @@ -279,6 +364,14 @@ Usage: rafind2 [-mXnzZhv] [-a align] [-b sz] [-f/t from/to] [-[m|s|S|e] str] [-x -Z show string found on each search hit ``` +rafind2 用于在二进制文件中查找字符模式。 + +重要参数: +- `-s`:查找特定字符串。 +- `-e`:使用正则匹配。 +- `-z`:搜索以`\0`结束的字符串。 +- `-x`:查找十六进制字符串。 + #### ragg2 ```text $ ragg2 -h @@ -317,12 +410,80 @@ Usage: ragg2 [-FOLsrxhvz] [-a arch] [-b bits] [-k os] [-o file] [-I path] -z output in C string syntax ``` +ragg2 可以将高级语言编写的简单程序编译成 x86、x86-64 或 ARM 的二进制文件。 + +重要参数: +- `-a`:设置体系结构。 +- `-b`:设置体系结构位数(32/64)。 +- `-P`:生成某种模式的字符串,常用于输入到某程序中并寻找溢出点。 +- `-r`:使用原始字符而不是十六进制对。 + - ragg2 -P 50 -r` +- `-i`:生成指定的 shellcode。查看 `-L`。 + - `ragg2 -a x86 -b 32 -i exec` +- `-e`:使用指定的编码器。查看 `-L`。 + #### rarun2 ```text $ rarun2 -h Usage: rarun2 -v|-t|script.rr2 [directive ..] +program=/bin/ls +arg1=/bin +# arg2=hello +# arg3="hello\nworld" +# arg4=:048490184058104849 +# arg5=:!ragg2 -p n50 -d 10:0x8048123 +# arg6=@arg.txt +# arg7=@300@ABCD # 300 chars filled with ABCD pattern +# system=r2 - +# aslr=no +setenv=FOO=BAR +# unsetenv=FOO +# clearenv=true +# envfile=environ.txt +timeout=3 +# timeoutsig=SIGTERM # or 15 +# connect=localhost:8080 +# listen=8080 +# pty=false +# fork=true +# bits=32 +# pid=0 +# pidfile=/tmp/foo.pid +# #sleep=0 +# #maxfd=0 +# #execve=false +# #maxproc=0 +# #maxstack=0 +# #core=false +# #stdio=blah.txt +# #stderr=foo.txt +# stdout=foo.txt +# stdin=input.txt # or !program to redirect input to another program +# input=input.txt +# chdir=/ +# chroot=/mnt/chroot +# libpath=$PWD:/tmp/lib +# r2preload=yes +# preload=/lib/libfoo.so +# setuid=2000 +# seteuid=2000 +# setgid=2001 +# setegid=2001 +# nice=5 ``` +rarun2 是一个可以使用不同环境、参数、标准输入、权限和文件描述符的启动器。 + +常用的参数设置: +- `program` +- `arg1`, `arg2`,... +- `setenv` +- `stdin`, `stdout` + +例子: +- `rarun2 program=a.out arg1=$(ragg2 -P 300 -r)` +- `rarun2 program=a.out stdin=$(python a.py)` + #### rax2 ```text $ rax2 -h @@ -367,6 +528,14 @@ Usage: rax2 [options] [expr ...] -v version ; rax2 -v ``` +rax2 是一个格式转换工具,在二进制、八进制、十六进制数字和字符串之间进行转换。 + +重要参数: +- `-e`:交换字节顺序。 +- `-s`:十六进制->字符 +- `-S`:字符->十六进制 +- `-D`, `-E`:base64 解码和编码 + ## 交互式使用方法 当我们进入到 Radare2 的交互式界面后,就可以使用交互式命令进行操作。