概述
关于Radare2:
radare2是一个开源的逆向工程和二进制分析框架,包括反汇编、分析数据、打补丁、比较数据、搜索、替换、虚拟化等等,同时具备超强的脚本加载能力,它可以运行在几乎所有主流的平台(GNU/Linux, .Windows *BSD, iOS, OSX, Solaris…)并且支持很多的cpu架构以及文件格式。 radare2工程是由一系列的组件构成,这些组件可以在 radare2 界面或者单独被使用–比如我们将要在接下来实验中使用到的rahash2, rabin2, ragg2三个组件,所有这些组件赋予了 radare2 强大的静态以及动态分析、十六进制编辑以及溢出漏洞挖掘的能力。
Kali已经自带radare2
通过radare2来解决GameBoy ROM挑战的一个项目:simple.gb
Kali:
首先我们在radare2打开二进制文件,检查它的架构、格式
(i命令给出关于二进制文件的信息,~是r2内部的grep命令)
由上图可以看出这是一个GameBoy的ROM,那么在阅读了它的一些指令集之后我们该去完成这次挑战了
Win:
第一件事情就是在GameBoy模拟器中打开这个ROM
首先需要安装模拟器
这是一个简单的游戏,通过使用箭头键,可以分别增加/减少5位数。我们只需要找到正确的密码就可以了
随机选择数字,然后按回车键,会发现提示fail
接下来我们开始分析代码并搜索检查输入的函数
分析二进制文件
切换到kali
(izzq会打印出存在于整个二进制文件中的字符串)
现在我们知道了fail的地址,接下来我们找到引用它的地方。我们使用grep搜索查找
(pd代表打印出反汇编代码print disassembly)
我们可以看到在0x2e4引用,所以我们搜索这个地址,并打印该函数:
(s用于搜索地址,pdf用于打印出反汇编函数)
我们可以看到,radare2识别出我们的函数从0x274开始。在底部有一些比较操作,然后跳转到失败的消息或者其他消息(字符串在0x02ee),我们去那儿看看。
(ps意思是打印字符串,@是一个临时搜索)
我们找到了win
那么我们给0x274重命名为check_input,然后开始分析
依次输入
(afn意思是分析函数名称,VV将会打开视图图形化模式)
进入视图界面
可以看到,函数结合了很多跳转和if条件语句
我们发现函数检查每个数字,并将其与正确的比较。在左边我们可以看到有效数字。让我们快速查看这些块。我们使用p在不同视图之间再次切换,直到达到常规图形模式。
简单地看了一下,大概地明白程序的意思了:二进制程序检查是否每个位置上的数字都与特定的值相等。使用cmp imm命令按照这个顺序:3,7,5,1,9检查。
切换到win:
我们在模拟器中输入看看
或者
都不行
那我们还是仔细看看函数吧
切换到kali:
我们分析下在第一个块中的汇编代码:
在第一个块中,0x4被移动到hl(ld指令),而hl又移动到寄存器bc,然后bc中引用的值与0x3进行比较。bc指向我们的输入,因此此处的检查功能检查bc+4是否等于0x3。在下一个块中,我们可以看到返回到其原始值的bc现在增加了两次(Inc)(bc+2),它所引用的值与0x7进行了比较。在示例的最后一个块中,bc返回其初始值,然后递增一次,其引用值与0x5比较。
那么逻辑就应该是这样的:
def check_password (guess):
if guess[4]==3 and guess[2]==7 and guess[1]==5 andguess[3]==1 and guess[0]==9:
print “WIN!”
else:
print “FAIL!”
由上述代码代码逻辑可以看出,输入的数字作为数组排列的话,应该为95713
切换到win,输入95713,可以看到成功输出win
参考链接:
radare2官网:
www.radare.org
r2高阶玩法:
https://www.megabeets.net/reverse-engineering-a-gameboy-rom-with-radare2/
最后
以上就是威武钢笔为你收集整理的radare2高阶玩法的全部内容,希望文章能够帮你解决radare2高阶玩法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复