Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

【工具分享】Radare 2之旅:通过crackme实例讲解Radare 2在逆向中的应用(上)

$
0
0
【工具分享】Radare 2之旅:通过crackme实例讲解Radare 2在逆向中的应用(上)

2017-09-15 10:02:44

阅读:563次
点赞(0)
收藏
来源: megabeets.net





【工具分享】Radare 2之旅:通过crackme实例讲解Radare 2在逆向中的应用(上)

作者:Kp_sover





【工具分享】Radare 2之旅:通过crackme实例讲解Radare 2在逆向中的应用(上)

译者:Kp_sover

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


序言

在过去的一年里我研究了 radare2 很久,无论是参加CTF、逆向工程或是漏洞挖掘,我发现 radare2都能很好的提升我的工作效率, 有时候它也是我用来分析恶意软件(如溯源)的工具,不幸的是很少有人听过它,可能是因为大多数人习惯了使用 IDA Pro,OllyDBG, gdb,不管怎样,我都觉得 radare2 应该成为你工具箱中的一部分.

因为我真的特别喜欢这个项目,因此为了让大家能更好的了解并使用它,我决定专门创建一个有关 r2 系列的文章来介绍它的特点和功能,希望能让大家更好的利用它去解决工作中的问题.


【工具分享】Radare 2之旅:通过crackme实例讲解Radare 2在逆向中的应用(上)

欢迎来到 IDA 10.0


radare2

radare2是一个开源的逆向工程和二进制分析框架,它的强大超出你的想象,包括反汇编、分析数据、打补丁、比较数据、搜索、替换、虚拟化等等,同事具备超强的脚本加载能力,它可以运行在几乎所有主流的平台(GNU/linux, .windows *BSD, iOS, OSX, Solaris…)并且支持很多的cpu架构以及文件格式,我认为所有它的这些特征恰好能表达出一个意思--那就是给予你的使用以极大的自由.

radare2工程是由一系列的组件构成,这些组件可以在radare2 界面或者单独被使用--比如我们将要了解的rahash2, rabin2, ragg2三个组件,所有这些组件赋予了radare2 强大的静态或动态分析、十六进制编辑以及溢出漏洞挖掘的能力.

在这之前,我们有必要知道学习使用radare2 是一个比较艰难的过程,尽管它有直观的GUI界面,但坦白的说,它确实没有IDA用起来方便,它的学习曲线我认为大致是这样的


【工具分享】Radare 2之旅:通过crackme实例讲解Radare 2在逆向中的应用(上)

当然我们不用因为它很复杂就退怯,我会竭尽所能让每个知识点都更清晰易懂!

在开始前,你可以在这儿去了解我们当前正面对并试图解决的问题.

这里是有关radare2最新的介绍文章

Check it out @https://t.co/MybNPqq2CH@radareorg#radare2

— Itay Cohen (@Megabeets_Blog)March 27, 2017


获得radare2

安装

因为我们每天都在更新Radare2的开发,因此建议你使用最新的github版本,不要使用 stable版,因为有时候 stable版可能还没有 最新的 github 版稳定.

$gitclonehttps://github.com/radare/radare2.git $cdradare2 $./sys/install.sh

如果你不想使用github版,或者想要每个平台相对应的二进制文件,那就点击这里去下载吧!download page at the radare2 website.

更新

正如我之前所说,我极力推荐你使用github上的最新版,如果你需要更新,那就太简单了,只需要下面这条命令,我每天习惯在早上更新一下radare2 ,在这期间,你可以去喝杯咖啡..

$./sys/install.sh

卸载

oh...说实话我实在想不到任何理由,你会在看这篇文章的时候需要去卸载radare2 ,哈哈,不过如果你随时需要,那就这样吧

$makeuninstall $makepurge

下面正式进入正题,let's go...

这里是crackme的下载地址here

好的,现在假设你们已经安装好radare2 ,crackme 文件也已经下载到机器上,我现在开始介绍radare2 的基本用法,我将在Remnux系统上进行操作,但是大多数命令和说明在 windows或者其他系统上都一样的.

命令行参数

正如大多数软件的使用一样,最好的了解它的方式就是在它后面加一个 -h 参数

$r2-h

在这里我不会展示它所有的用法,我只会展示平常我使用的比较多并且很重要的参数:

Usage:r2[-ACdfLMnNqStuvwz][-Ppatch][-pprj][-aarch][-bbits][-ifile] [-saddr][-Bbaddr][-Mmaddr][-ccmd][-ek=v]file|pid|-|--|= -d:Debugtheexecutable'file'orrunningprocess'pid' -A:Analyzeexecutableatloadtime(xrefs,etc) -q:Quietmode,exitafterprocessingcommands -w:Writemodeenabled -L:ListofsupportedIOplugins -i[file]:Interpretsar2script -n:Bareload.Donotloadexecutableinfoastheentrypoint -c'command;command;...':Runr2andexecutecommands(eg:r2'smain;px60') -p[prj]:Createsaprojectforthefilebeinganalyzed -:Opensr2withthemallocpluginthatgivesa512bytesmemoryareatoplaywith 二进制信息

当我拿到一个二进制文件,首先就会去获取它的基本信息,这里将会用到r2 框架里最强的一个工具 :rabin2.

rabin2 可以获取包括ELF, PE, Mach-O, Java CLASS文件的区段、头信息、导入导出表、字符串相关、入口点等等,并且支持几种格式的输出文件.

使用下面的命令获取更多的用法

manrabin2

我们可以通过 -I 参数 来让 rabin2 打印出二进制文件的系统属性、语言、字节序、框架、以及使用了哪些 加固技术(canary, pic, nx).

$rabin2-Imegabeets_0x1 havecodetrue picfalse canaryfalse nxfalse cryptofalse vatrue intrp/lib/ld-linux.so.2 bintypeelf classELF32 langc archx86 bits32 machineIntel80386 oslinux minopsz1 maxopsz16 pcalign0 subsyslinux endianlittle strippedfalse staticfalse linenumtrue lsymstrue relocstrue rpathNONE binsz6220

这里你可以清晰地看到这是一个32位的 elf 文件,没有剥离符号表并且是动态链接的,它没有使用溢出隔离技术-这对于下一篇我们利用 radare2 去溢出它是很有利的信息,现在我们来运行它看看这个程序到底做了啥。

注意:尽管我让你们直接运行,但建议任何时候对一个不清楚的二进制文件都不要直接运行,最好放在一个隔离的环境,比如虚拟机下运行!

$./megabeets_0x1 .::Megabeets::. Thinkyoucanmakeit? Nop,Wrongargument. $./megabeets_0x1abcdef .::Megabeets::. Thinkyoucanmakeit? Nop,Wrongargument.

开始来我们需要给它一些参数,这里输入 "abcdef",然后还是错了,很明显,我们需要给它密码,这就是这次crackme要做的事.

下面我们用 radare2来测试这个程序:

$r2./megabeets_0x1 —Thankyouforusingradare2.Haveanicenight! [0x08048370]>

当我们运行它的时候,它会给我们一个欢迎界面,同时给我们一个shell操作符,在这里有很多有趣和有用的命令,现在 r2 在等我们给它下一步的命令,当前它输出了一个地址(0x08048370),这就是它自动识别的程序入口点,我们来验证一下:

[0x08048370]>ie [Entrypoints] vaddr=0x08048370paddr=0x00000370baddr=0x08048000laddr=0x00000000haddr=0x00000018type=program1entrypoints

我们用 ie 命令可以打印出程序的入口点, ie 的意思就是 info >> entrypoint,是不是很好记,当然我们不需要刻意去记住它,因为我们可以在任何一个命令后面添加 ? 来获得更多的子命令信息:

[0x08048370]>i? |Usage:iGetinfofromopenedfile(seerabin2’smanpage) |Outputmode: |‘*’Outputinradarecommands |‘j’Outputinjson |‘q’Simplequietoutput |Actions: |i|ijShowinfoofcurrentfile(inJSON) |iAListarchs |iaShowallinfo(imports,exports,sections..) |ibReloadthecurrentbufferforsettingofthebin(useonceonly) |icListclasses,methodsandfields |iCShowsignatureinfo(entitlements,…) |idDebuginformation(sourcelines) |iDlangsymdemanglesymbolnameforgivenlanguage |ieEntrypoint |iEExports(globalsymbols) |ihHeaders(aliasforiH) |iHHVerboseHeadersinrawtext |iiImports |iIBinaryinfo |ik[query]Key-valuedatabasefromRBinObject |ilLibraries |iLListallRBinpluginsloaded |imShowinfoaboutpredefinedmemoryallocation |iMShowmainaddress |io[file]Loadinfofromfile(orlastopened)usebin.baddr |ir|iRRelocs |isSymbols |iS[entropy,sha1]Sections(choosewhichhashalgorithmtouse) |iVDisplayfileversioninfo |izStringsindatasections |izzSearchforStringsinthewholebinary |iZGuesssizeofbinaryprogram i 开头的命令主要是用来获取各种信息。

分析

radare2 不会主动去分析一个文件,因为这样做的代价太大了,它需要花费很多的时间,尤其是大文件,有关分析的操作或者设置启动时不分析可以去 radare2 的博客看看this post.

当然分析是一个必要的功能,r2 也提供了很多与之相关的功能,就像之前说的,我们可以在 'a' 后面加 '?' 来探索这个系列的命令:

[0x08048370]>a? |Usage:a[abdefFghoprxstc][…] |ab[hexpairs]analyzebytes |abb[len]analyzeNbasicblocksin[len](section.sizebydefault) |aa[?]analyzeall(fcns+bbs)(aa0toavoidsubrenaming) |ac[?][cycles]analyzewhichopcouldbeexecutedin[cycles] |ad[?]analyzedatatrampoline(wip) |ad[from][to]analyzedatapointersto(from-to) |ae[?][expr]analyzeopcodeevalexpression(seeao) |af[?]analyzeFunctions |aFsameasabove,butusinganal.depth=1 |ag[?][options]outputGraphvizcode |ah[?]analysishints(forceopcodesize,…) |ai[addr]addressinformation(showperms,stack,heap,…) |ao[?][len]analyzeOpcodes(oremulateit) |aOAnalyzeNinstructionsinMbytes |ar[?]like‘dr’butfortheesilvm.(registers) |apfindpreludeforcurrentoffset |ax[?]managerefs/xrefs(seealsoafx?) |as[?][num]analyzesyscallusingdbg.reg |at[?][.]analyzeexecutiontraces Examples: fts@S*~text:0[3];ft@section..text fds@S*~data:0[3];fd@section..data .adtt+ts@d:ds

通常我会使用 'aa' 命令来分析文件,当然使用 'aa?'可以获得更多的用法,这里由于文件很小的原因,我选择用 'aaa' 来尽可能的分析出更多更细致的信息,当然你也可以在运行 radare2的使用 -A 参数来直接分析一个文件(例如r2 -A megabeets_0x1)

[0x08048370]>a? [x]Analyzeallflagsstartingwithsym.andentry0(aa) [0x08048370]>aaa [x]Analyzeallflagsstartingwithsym.andentry0(aa) [x]Analyzelenbytesofinstructionsforreferences(aar) [x]Analyzefunctioncalls(aac) [*]Use-AAoraaaatoperformadditionalexperimentalanalysis. [x]Constructingafunctionnameforfcn.*andsym.func.*functions(aan)

Flags

分析完成之后, r2会将所有有用的信息和特定的名字绑定在一起,比如区段、函数、符号、字符串,这些都被称作 'flags', flags 被整合进 <flag spaces>,一个 flag 是所有类似特征的集合,展示所有的 flag ,用 'fs' 命令:

[0x08048370]>fs 04.strings 135.symbols 282.sections 35.relocs 45.imports 51.functions

我们可以使用 'fs <flagspaces>' 加'f'来打印出 这个 flags 下面包含的信息,使用分号来间隔多条命令(‘cmd1;cmd2;cmd3;...’).

[0x08048370]>fsimports;f 0x080483206sym.imp.strcmp 0x080483306sym.imp.strcpy 0x080483406sym.imp.puts 0xffffffff16loc.imp.__gmon_start__ 0x080483506sym.imp.__libc_start_main

我们看到 r2 列出了这个二进制文件的导出表--熟悉的‘strcmp’, ‘strcpy’, ‘puts’,等函数,并和它们的真实地址相关联,同样我们可以列出 字符串 flagspace:



Strings

我们看到 r2 标记出了 字符串的偏移地址、变量名.现在我们来看看字符串吧,这里有几种方式可以查看文件的字符串,你可以根据自己的需要来选择.

iz– 列出数据段里的字符串

izz– 在整个二进制文件中搜索字符串.

[0x08048370]>iz vaddr=0x08048700paddr=0x00000700ordinal=000sz=21len=20section=.rodatatype=asciistring=\n.::Megabeets::. vaddr=0x08048715paddr=0x00000715ordinal=001sz=23len=22section=.rodatatype=asciistring=Thinkyoucanmakeit? vaddr=0x0804872cpaddr=0x0000072cordinal=002sz=10len=9section=.rodatatype=asciistring=Success!\n vaddr=0x08048736paddr=0x00000736ordinal=003sz=22len=21section=.rodatatype=asciistring=Nop,Wrongargument.\n

还记得吗,在之前运行程序的时候就见过这些字符串了,看到 ‘success’ 了没,它可能就是我们最终成功后想要见到的字符串,现在我们知道了这个字符串的名字,那我们来看看在哪里调用了它:

[0x08048370]>axt@@str.* data0x8048609pushstr._n__.::_Megabeets_::.inmain data0x8048619pushstr.Think_you_can_make_it_inmain data0x8048646pushstr._n_tSuccess__ninmain data0x8048658pushstr._n_tNop__Wrong_argument._ninmain

这条命令又给我们展示了另一个 r2 的功能,'axt' 命令用来在 data/code段里找寻某个地址相关的引用(更多的操作,请看 'ax?').'@@'就像一个迭代器,用来在地址空间里不断地匹配后面一系列相关的命令(更多操作,请看 '@@?'), 'str.*' 是一个通配符,用来标记所有以 'str.'开头的信息,这个不光会列出字符串标志,同时也包括函数名,找到它们到底在哪里以及何处被调用。

未完待续...



【工具分享】Radare 2之旅:通过crackme实例讲解Radare 2在逆向中的应用(上)
【工具分享】Radare 2之旅:通过crackme实例讲解Radare 2在逆向中的应用(上)
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://www.megabeets.net/a-journey-into-radare-2-part-1/

Viewing all articles
Browse latest Browse all 12749

Latest Images

Trending Articles



Latest Images