IDA 二进制分析框架-radare2(19)
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
首先要给可执行的权限,然后运行一下
可以看到这个程序直接打印出来然后就退出了。
1. rabin2 -l 参数
打印出二进制文件的系统属性,语言,字节序,框架,使用了啥加固技术…
1 | rabin2 -I megabeets_0x1 |
不能大意了,得用大写的 I 。
这里有一堆参数..每一个不懂的话都可以百度直接搜索。【主要是我也不是很懂】
大概看一看:这些比较简单的参数就能看出来这个是一个32位的eif文件,没有剥离符号并且是动态链接的
2.radare2
1 | radare2 megabeets_0x1 |
这里黄色字体输出了一个地址,这个地址就是radare2自动识别出来的程序入口点。
3.ie命令
用ie命令手动答应出出入口点
1 | [0x08048370]> ie |
4.aaa命令
分析这个程序,并且会把信息和特定的名字绑定在一起,比如区段,函数,符号,字符串,。。这些都被称为’flags’,flags被整合进【flag spaces】,一个flag 是所有类似特征的集合。
5.fs命令
看所有的 flag
6.fs [某个flag];f
显示出某个flag中的信息
看到这个strings 有一个 success
要破解啦,肯定就是要走到success的地方。
现在来看看哪里进行了调用。
7.iz命令
输出这个数据段里面的字符串。
8.?命令
这个也就是帮助文档
1 | ax? |
比如:
9.axt命令
axt用来data/code段里面寻找某个地址相关的引用。
10.axt @@ str.*
‘axt’ 命令用来在 data/code段里找寻某个地址相关的引用(更多的操作,请看 ‘ax?’).
‘@@’就像一个迭代器,用来在地址空间里不断地匹配后面一系列相关的命令(更多操作,请看 ‘@@?’)
‘str.*’ 是一个通配符,用来标记所有以 ‘str.’开头的信息,不光会列出字符串标志,同时也包括函数名,找到它们到底在哪里以及何处被调用。
11.afl命令
要列出二进制中存在的函数,请运行 afl 命令
这里看到的比较多啦
然后有一个sym.rot13
不知道是啥…去百度看看
发现是一个加密啥的
12.s [函数]
停下来
1 | s main |
13.pdf输出反汇编代码
1 |
这里可以看到 call 了这个 beet 函数
然后下面有一个test 然后进行了je 判断跳转
test 就是进行 and 指令
- TEST 指令在两个操作数的对应位之间进行 AND 操作,并根据运算结果设置符号标志位、零标志位和奇偶标志位。
je 跳转是 在ZF 标志位=1 就跳转
ZF 标志位是 进行了操作后,如果是0就是1
所以我们需要知道这个beet 是个啥
14.pdf@函数名
可以跳转到 这个函数的地方,并且还有汇编代码
看这个汇编代码,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 字符串拷贝咯。
所以我猜测这个就是把输入的字符串拷贝起来。拷贝到哪里去呢?【管他呢】反正不是栈就是啥空间里面。
在看下面
这里有一个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 加密出来的值是多少。
百度一下啦
得到 zrtnorrgf
但是这样不优雅
我们还可以用rahash
15.rahash2
1 | rahash2 -E rot -S s:13 -s 'Megabeets' |
-E 就是选中这个加密的方式
-S 【差不多就彳亍了】
得到的也是一样的值啦
最后我们传入这个值就对啦
emmm错了。。。
我们仔细一看,这个Z 居然在上面是小写,下面是大写……..
吐了。为什么呢?
我换了一个加密的地方就又对了
说明上面那个加密的地方有点小问题…
16.ood
就是debug
但是这样还是不够优雅,我们可以用r2中自带的ood 进行debug
17.dc查看结果
结果如上。