radare 2 介绍

有了IDA为什么还要学这个radare2呢?我也不是很懂啦,都是使用工具。可能这个确实比较good啦。

radare 2 是一个开源的。可以在github上找到哦

至于为什么要学它。可以看看

https://zhuanlan.zhihu.com/p/348481864

https://www.cnblogs.com/pannengzhi/p/play-with-radare2.html

或者自己百度啦。我这里只是随便列举出来了几个罢了。


介绍:

首先 radare2 是一个逆向开源的逆向工具和二进制分析框架。包括反汇编、分析数据、打补丁、比较数据、搜索、替换、虚拟化等等

当然,我们的kali以及自带了radare2。

radare2工程是由于一系列的组件构成的,这些组件可以在radare2界面或者单独被使用-比如:rabin2,rahash2,radiff2,rafind2,ragg2,rarun2,rax2,radare2。

其中的主要介绍,可以看:

https://xz.aliyun.com/t/7265#toc-6


在实战中学习

用的 megabeets_0x1 这个Crackme

image-20230517172125650

首先要给可执行的权限,然后运行一下

可以看到这个程序直接打印出来然后就退出了。

1. rabin2 -l 参数

打印出二进制文件的系统属性,语言,字节序,框架,使用了啥加固技术…

1
rabin2 -I megabeets_0x1
image-20230517172549936

不能大意了,得用大写的 I 。

这里有一堆参数..每一个不懂的话都可以百度直接搜索。【主要是我也不是很懂】

大概看一看:这些比较简单的参数就能看出来这个是一个32位的eif文件,没有剥离符号并且是动态链接的

2.radare2

1
radare2 megabeets_0x1   
image-20230517173127642

这里黄色字体输出了一个地址,这个地址就是radare2自动识别出来的程序入口点。

3.ie命令

用ie命令手动答应出出入口点

1
[0x08048370]> ie

image-20230517173310544

4.aaa命令

分析这个程序,并且会把信息和特定的名字绑定在一起,比如区段,函数,符号,字符串,。。这些都被称为’flags’,flags被整合进【flag spaces】,一个flag 是所有类似特征的集合。

image-20230517174228579

5.fs命令

看所有的 flag

image-20230517174240772

6.fs [某个flag];f

显示出某个flag中的信息

image-20230517183208288

看到这个strings 有一个 success

要破解啦,肯定就是要走到success的地方。

现在来看看哪里进行了调用。

7.iz命令

输出这个数据段里面的字符串。

8.?命令

这个也就是帮助文档

1
2
3
ax?
@@?
str?

比如:

image-20230517184048721

9.axt命令

axt用来data/code段里面寻找某个地址相关的引用。

10.axt @@ str.*

  • ‘axt’ 命令用来在 data/code段里找寻某个地址相关的引用(更多的操作,请看 ‘ax?’).

  • ‘@@’就像一个迭代器,用来在地址空间里不断地匹配后面一系列相关的命令(更多操作,请看 ‘@@?’)

  • ‘str.*’ 是一个通配符,用来标记所有以 ‘str.’开头的信息,不光会列出字符串标志,同时也包括函数名,找到它们到底在哪里以及何处被调用。

11.afl命令

要列出二进制中存在的函数,请运行 afl 命令

image-20230517185402479

这里看到的比较多啦

然后有一个sym.rot13

不知道是啥…去百度看看

image-20230517185758817

发现是一个加密啥的

12.s [函数]

停下来

1
s main

13.pdf输出反汇编代码

1
pdf
image-20230517190036795 image-20230517212331708

这里可以看到 call 了这个 beet 函数

然后下面有一个test 然后进行了je 判断跳转

test 就是进行 and 指令

  • TEST 指令在两个操作数的对应位之间进行 AND 操作,并根据运算结果设置符号标志位、零标志位和奇偶标志位。

je 跳转是 在ZF 标志位=1 就跳转

ZF 标志位是 进行了操作后,如果是0就是1

所以我们需要知道这个beet 是个啥

14.pdf@函数名

可以跳转到 这个函数的地方,并且还有汇编代码

image-20230517212806576

看这个汇编代码,push 和 mov ebp,esp 其实就是栈平衡的操作嘛

下面 push dword [src] 然后lea eax, [dest] 然后 push eax ,call sym.imp.strcpy 。

lea:和mov 一样不过,lea 是load xxx address 【这个单词突然忘了】反正就是把地址mov 过去。而不是这个地址下的值。

按道理来说,我们应该还要去看一下sym.imp.strcpy 这里函数里面的代码,但是我们也可以猜测一下啦

这个imp 我猜就是import [进口]【也就是输入的】

strcpy 字符串拷贝咯。

所以我猜测这个就是把输入的字符串拷贝起来。拷贝到哪里去呢?【管他呢】反正不是栈就是啥空间里面。

在看下面

image-20230517214849051

这里有一个call sym.rot13

这个rot 加密啥的【上面有百度过了】。

看上面有一个push eax 然后再call 的,我们知道一般来收 这个eax 肯定就会在这个函数里面起作用啦。

在网上看,这个eax 是: lea eax [s2] 。 这个eax 里面放的是地址,在往上看,这个地址是一个放着字符串data 数据的地址。

并且这个数据就是 Megabeets 【虽然它mov 的是一个地址,但是强大的工具,在后面以及帮我们注释出来了】

所以这个eax 中的地址就是指向这个Megabeets 的,相当于把Megabeets 传入了 rot13 这个函数,也就是把Megabeets 进行了rot13加密

下面还有一个strcmp 也就是字符串比较函数,直接就可以猜测,是将Megabeets 加密后的东西和我们输入的值进行对比,如果正确就OKl啦

所以我们只需要知道rot 13 加密出来的值是多少。

百度一下啦

image-20230517215443203

得到 zrtnorrgf

但是这样不优雅

我们还可以用rahash

15.rahash2

1
rahash2 -E rot -S s:13 -s 'Megabeets'

-E 就是选中这个加密的方式

-S 【差不多就彳亍了】

image-20230517215749934

得到的也是一样的值啦

最后我们传入这个值就对啦

image-20230517215858918

emmm错了。。。

我们仔细一看,这个Z 居然在上面是小写,下面是大写……..

image-20230517215938230

吐了。为什么呢?

我换了一个加密的地方就又对了

image-20230517220056047

说明上面那个加密的地方有点小问题…

16.ood

就是debug

但是这样还是不够优雅,我们可以用r2中自带的ood 进行debug

image-20230517220354720 image-20230517220509921

17.dc查看结果

结果如上。