前言


本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274


radare2 最近越来越流行,已经进入 github 前 25了,看到大佬们纷纷推荐,为了紧跟时代潮流,我也决定探究探究这款 神器 。下面画画重点,以便以后需要用了,可以方便查找。

正文

首先是安装 radare2 ,直接去官方 github 安照指示安装即可。先把源代码下载下来

https://github.com/radare/radare2

然后进入源码目录,执行

 sys/install.sh

radare2 支持各种各样的平台,文件格式,具体可以看官网描述。它有很多各组件分别进行不同的工作。这些组件是:

  • rax2 ---------> 用于数值转换
  • rasm2 -------> 反汇编和汇编
  • rabin2 -------> 查看文件格式
  • radiff2 ------> 对文件进行 diff
  • ragg2/ragg2­cc ------> 用于更方便的生成shellcode
  • rahash2 ------> 各种密码算法, hash算法
  • radare2 ------> 整合了上面的工具

rax2

数值转换,程序的 help 菜单很明确了:

比如输入rax2 -s 414141 ,会返回 AAAA

rabin2

对各种文件格式进行解析。

rabin2 -I hello_pwn 显示文件的信息

使用 -l 显示依赖库。

使用 -zz 显示字符串信息,可以显示 utf-8 等宽字节字符串。

可以看到显示了长度,所在位置等信息。

通过使用 -O 选项可以修改一些文件的信息。

haclh@ubuntu:~$ rabin2 -O?
Operation string:
Change Entrypoint: e/0x8048000
Dump Symbols: d/s/1024
Dump Section: d/S/.text
Resize Section: r/.data/1024
Remove RPATH: R
Add Library: a/l/libfoo.dylib
Change Permissions: p/.data/rwx
Show LDID entitlements: C

比如修改 section 的属性

haclh@ubuntu:~$ rabin2 -S a.out | grep text
idx=14 vaddr=0x00400430 paddr=0x00000430 sz=386 vsz=386 perm=--rwx name=.text
haclh@ubuntu:~$ rabin2 -O p/.text/r a.out
wx 02 @ 0x1d60
haclh@ubuntu:~$ rabin2 -S a.out | grep text
idx=14 vaddr=0x00400430 paddr=0x00000430 sz=386 vsz=386 perm=--r-- name=.text

rasm2

这个工具用于进行各种平台的汇编和反汇编。该工具的主要选项有。

-a 设置汇编和反汇编的架构(比如x86,mips, arm...)
-L 列举支持的架构。
-b 设置 位数
-d,-D 反汇编 提供的 16进制字符串。

使用示例:

首先列举支持的架构(使用 head 只列举前面几项)

haclh@ubuntu:~$ rasm2 -L | head
_dAe 8 16 6502 LGPL3 6502/NES/C64/Tamagotchi/T-1000 CPU
_dA_ 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 (by pancake, nibble) v4.0.0
_dA_ 16 cr16 LGPL3 cr16 disassembly plugin

使用 arm 插件,汇编 三条 nop 指令

haclh@ubuntu:~$ rasm2 -a arm "nop;nop;nop;"
0000a0e10000a0e10000a0e1

然后我们使用 -d 把它反汇编出来

haclh@ubuntu:~$ rasm2 -a arm -d 0000a0e10000a0e10000a0e1
mov r0, r0
mov r0, r0
mov r0, r0

我可以在命令后面加上 -r 打印出在 radare2中实现对应的功能,需要使用的命令( wa 命令的作用是,汇编给出的指令,并把汇编得到的数据写到相应位置,默认是当前位置)。

haclh@ubuntu:~$ rasm2 -a arm -d 0000a0e10000a0e10000a0e1 -r
e asm.arch=arm
e asm.bits=32
"wa mov r0, r0;mov r0, r0;mov r0, r0;"

ragg2/ragg2·cc

radare2 自己实现的 c 编译器,可以方便的写 shellcode .

示例一:

代码如下

int main() { write (1,"hi\n", 3); exit(0); }

使用下面的命令,把它编译成x86 32位代码:

ragg2-cc -a x86 -b 32 -d -o test test.c

可以生成正常的 elf 文件用于测试,可以使用 -c 只编译出 shellcode

生成的 shellcode 存在于 test.c.text 文件里面,下面是用 radare2 反汇编得到的代码,可以看到使用了 系统调用来实现代码的功能。

使用 ragg2-cc 生成的 shellcode 可以使用 ragg2中的 xor 编码器来编码字符,绕过一些字符限制,比如 \x00

首先生成shellcode 的16进制表示。

ragg2-cc -a x86 -b 32 -d -x test.c

然后使用 rasm2 验证下

代码和上面的是一样的。

然后使用 ragg2 使用 xor 编码器编码 shellcode

就是在 shellcode 执行前使用 xor 指令把shellcode 还原。这样就可以消除掉一些坏字符。

ragg2 也有自己 编写 shellcode 的语法。下面是一个示例,具体请看官方文档。

使用这种方式,我们就能使用最接近 汇编 的类c语言 来编写跨平台 shellcode

rahash2

用于使用加密算法,hash算法等计算值

使用-L 可以列举支持的算法,比如算算 md5

haclh@ubuntu:~$ rahash2 -a md5 -s admin
0x00000000-0x00000004 md5: 21232f297a57a5a743894a0e4a801fc3

radare2

最常用的工具了。整合了上面所有的工具。直接使用 r2 target_bin 进入程序。使用-d 选项进入调试模式。

radare2 中的命令格式为

[.][times][cmd][~grep][@[@iter]addr!size][|>pipe] ;

px表示打印16进制数,默认从当前位置开始。参数控制打印的字节数,下面这张图应该就可以大概解释上面的格式了。

@ addr 表示该命令从 addr 开始执行。addr 不一定是 地址也可以是 radare2 中识别的符号,比如 main

还有一个重要的东西要记得,在命令的后面加个 ? ,就可以查看帮助。直接输入? 可以查看所有的命令。

下面按照我们在 ida 中使用的功能,来介绍 radare2

首先在 用 ida 分析程序时,在 ida 加载程序后默认会对程序进行分析。radare2 相应的功能是以 a 开头的。

注释很简明了。我们使用 aaa 就可以进行完整分析了。

分析前 radare2 识别不了函数,分析后就可以正常打印函数代码了(pdf 打印函数代码)

有时候我们不需要分析整个 二进制文件,或者有个函数 radare2没有识别出来我们可以 af 来分析该函数。

我们可以使用 s 跳转到想要跳转的位置。

跳转到 main 函数,并 定义该函数,然后打印函数代码

pd 类命令用于打印汇编信息。

具体看帮助。

  • 使用 VV 进入 图形化模式(需要是函数范围内)。

  • 在图形化模式下,输入 ? 可以查看图形化模式的帮助。

  • 使用 hjkl 来移动图形

  • 使用 p/P 切换图形模式

  • 在图形模式下使用 : 可以输入radare2 命令

  • 输入 ! , 在调试的时候应该很有用

  • 使用 空格 ,切换图形模式和文本模式

  • 在文本模式模式下也可以使用 p 来切换视图。

剩下的看帮助。

下面介绍如何使用 radare2 patch程序。首先需要在打开文件时使用 r2 -w 来以可写模式打开文件,这样 pathch 才能应用到文件 ( 或者在 radare2 下使用 e io.cache=true, 来允许进行 patch, 不过这样的话文件的修改不会影响原文件 )

w 系列命令用于修改文件。

使用 wa 可以使用 汇编指令进行 patch

使用 "wa nop;nop;nop;nop;" 可以同时写入多条指令。

双引号不能省

或者可以使用 wx 写入 16进制数据

其他的请看 w? ,查看帮助。

还可以 可视化汇编/patch 程序

输入 Vp ,然后输入 A, 就可以了。

使用 / 系列命令可以搜索字符串, rop gadgets等

查询字符串交叉引用可以依次使用下列方法。

ax? 系列命令用于管理交叉引用。 /r 可以搜索交叉引用, aae 是使用radare2中的模拟执行功能,动态的检测交叉引用。

下面画重点

radare2中其实也是有 反编译功能, 使用 pdc 就可以查看伪代码,虽然和 ida 的还有很大的差距,但是在一些 ida 不支持 f5 的情况下这个功能还是不错的,可以用来看程序的大概逻辑。

在图形化模式下,按下 $ 看看,有惊喜。

帮我们解析汇编指令,用 c 代码的格式来显示。妈妈再也不用担心我不会汇编了。

radare2ida 相比还有一个最大的优势,那就是它自带模拟执行功能。它使用了一种 esil 语言,来定义程序的行为,并且可以根据这个来模拟执行程序代码。

ESIL 的具体语法可以去看官方文档。下面列举两个示例:

mov ecx, ebx -> ebx,ecx,=
add ebx, edi ->edi,ebx,+=,$o,of,=,$s,sf,=,$z,zf,=,$c31,cf,=,$p,

可以使用 e asm.esil = true显示 esil 代码

ESIL 相关的命令是

ae?这一类指令。这个我也不熟悉,大概的用法是,使用 ae?这一类指令设置好 指令执行虚拟机的状态,然后设置好模拟执行的终止状态,在停止时,做一些操作,主要用于解密字符串,脱壳等等。

具体事例可以看:

https://blog.xpnsec.com/radare2-using-emulation-to-unpack-metasploit-encoders/

此外 radare2还支持各种语言对他进行调用, 以及拥有大量的插件。

总结

radare2还是很强大的,特别是全平台反编译,全平台模拟执行,各种文件的patch, 修改。感觉在 ida 没法 f5 的平台上首选 radare2

参考:

http://radare.org/r/talks.html

https://github.com/radare/radare2book

https://codeload.github.com/radareorg/r2con/

一步一步pwn路由器之radare2使用全解的更多相关文章

  1. 一步一步pwn路由器之radare2使用实战

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 前文讲了一些 radare2 的特性相关的操作方法.本文以一个 c ...

  2. 一步一步pwn路由器之rop技术实战

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这次程序也是 DVRF 里面的,他的路径是 pwnable/She ...

  3. 一步一步pwn路由器之wr940栈溢出漏洞分析与利用

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这个是最近爆出来的漏洞,漏洞编号:CVE-2017-13772 固 ...

  4. 一步一步pwn路由器之环境搭建

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 正式进入路由器的世界了.感觉路由器这块就是固件提取,运行环境修复比 ...

  5. 一步一步pwn路由器之栈溢出实战

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 本文以 DVRF 中的第一个漏洞程序 stack_bof_01 为 ...

  6. 一步一步pwn路由器之uClibc中malloc&&free分析

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 栈溢出告一段落.本文介绍下 uClibc 中的 malloc 和 ...

  7. 一步一步pwn路由器之路由器环境修复&&rop技术分析

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 拿到路由器的固件后,第一时间肯定是去运行目标程序,一般是web服务 ...

  8. 简单实例一步一步帮你搞清楚MVC3中的路由以及区域

    我们都知道MVC 3 程序的所有请求都是先经过路由解析然后分配到特定的Controller 以及 Action 中的,为什么这些知识讲完了Controller Action Model 后再讲呢?这个 ...

  9. 【计算机网络】一步一步学习IP路由流程

    TCP/IP协议簇是目前互联网应用最广的协议栈,谈到TCP/IP协议栈就不能不讲一讲IP路由的问题,因为在我们使用的网络通信中几乎每时每刻都在发生着IP路由的事件…….当你在网络世界中还是一位新手的时 ...

随机推荐

  1. 【xsy1504】 pitcure 树状数组

    数据范围:$n≤2\times 10^5$ 以下是题解: #include<bits/stdc++.h> #define L unsigned int #define MOD 167772 ...

  2. Lingo 做线性规划 - Financial Applications

    Reference: <An Introduction to Management Science Quantitative Approaches to Decision Making, Rev ...

  3. (转)Linux 文件目录特殊权限设定(SUID,SGID,SBIT)

    原文:https://blog.csdn.net/leshami/article/details/77184029 Linux文件及目录的权限设定,除了我们孰知的读写执行(rwx)之外,还有一些特殊的 ...

  4. (转)修改及查看mysql数据库的字符集

    原文:http://www.cnblogs.com/donqiang/articles/2057972.html Liunx下修改MySQL字符集:1.查找MySQL的cnf文件的位置find / - ...

  5. CART树

    算法概述 CART(Classification And Regression Tree)算法是一种决策树分类方法. 它采用一种二分递归分割的技术,分割方法采用基于最小距离的基尼指数估计函数,将当前的 ...

  6. 使用 Nginx + Tomcat 搭建负载均衡

    负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 负载均衡,英文名称为Load Balance, ...

  7. mariadb(mysql)从库relaylog损坏无法同步的处理方法

    故障说明 晚上备用服务器自动重启,收到报警,备用服务器上的mariadb从库无法去同步主库.启动mariadb后,报如下错误(重点看红色字体)  mariadb_1 | -- :: [Note] Pl ...

  8. vue-cli的工程如何正确使用Google Analytics?

    前言 最方便的方法,莫过于使用vue-analytics:https://github.com/MatteoGabriele/vue-analytics. 包是有了,可是真正使用起来会发现Google ...

  9. [磁盘空间]lsof处理文件恢复、句柄以及空间释放问题

    曾经在生产上遇到过一个df 和 du出现的结果不一致的问题,为了排查到底是哪个进程占用了文件句柄,导致空间未释放,首先在linux上面,一切皆文件,这个问题可以使用lsof这个BT的命令来处理(这个哈 ...

  10. SQL Server数据类型转换方法

    在SQL Server日常的函数.存储过程和SQL语句中,经常会用到不同数据类型的转换.在SQL Server有两种数据转换类型:一种是显性数据转换:另一种是隐性数据转换.下面分别对这两种数据类型转换 ...