首页
社区
课程
招聘
[翻译]在Windows平台下的使用radare2进行调试
2018-3-28 13:54 14350

[翻译]在Windows平台下的使用radare2进行调试

2018-3-28 13:54
14350
  首先,我想说我是一个Linux迷。 我一直在它上面进行开发。 它的命令行令人惊叹,并且非常精简计算机科学相关的任务。 虽然我有这种感觉,但有些人并不这样认为更喜欢使用Windows环境。 所以我想在本文中展示两件事,如何安装和使用radare2 for Windows,以及如何使用radare2调试应用程序。
  在Windows上安装radare2,首先访问他们的网站(https://rada.re/r/),点击页面顶部的“下载2.3.0 for Windows”链接。 然后你只需运行安装程序,radare2就安装在你的系统上了! 问题是,所有安装程序都将radare2.exe以及其他工具放在C:/ users / username / AppData目录中。 我必须从命令行将目录切换到该文件夹才能使用可执行文件。 为了从命令行的任何位置访问该文件,必须将该目录添加到$ PATH环境变量中。 这计算机用来查找可以从系统的任何位置运行的命令和应用程序的变量。
  要设置你的$ PATH变量,你可以通过以下两种方法之一来完成。 您可以通过转到系统属性 - >高级 - >环境变量来使用Windows GUI进行更改,单击路径变量并单击编辑。 然后你可以添加你的radare2文件的目录。

查看系统属性和编辑环境变量

你也可以变身超级1337,从命令行执行它。 方法是以管理员身份打开PowerShell并使用该命令

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Users\<username>\AppData\Local\Programs\radare2", [EnvironmentVariableTarget]::Machine)

这条命令可以让你每次重新启动计算机时都不必将文件夹添加到你的$ PATH变量中。
现在,如果您运行radare2.exe命令,您应该看到radare2的帮助信息。 这意味着您已经在系统上成功安装了radare2。

现在我们已经安装了Radare2,可以继续我们的调试教程。 如果你不知道调试是什么,它可以说是是运行一个程序并暂停每个汇编指令。 它可以让你动态地看到程序执行发生了什么,并且通常比静态分析更容易。 但在分析恶意软件时,静态分析比较安全,因为该文件实际上并未运行。 如果你想调试恶意软件,因为它是分析过程的重要组成部分,那么你应该在虚拟机中完成它。

我将演示如何解决Flare-On 4 CTF的挑战2。 Flare-On挑战是由FireEye主办的年度逆向工程竞赛。 我强烈建议任何对逆向工程感兴趣的人至少尝试一下,因为你可以从中学到很多东西。 您可以从他们的网站(https://www.fireeye.com/blog/threat-research/2017/10/2017-flare-on-challenge-solutions.html)上下载去年挑战中的二进制文件。
我们应该开始运行该程序,当启动程序时,我们看到它会提示我们输入密码。如果我们试图猜测密码,则会显示一条消息,告诉我们我们错了。不是太复杂,我们只需要找出密码是什么。

  我将通过rabin2运行二进制文件来提取基本信息。 我在第一篇文章(https://medium.com/@jacob16682/reverse-engineering-using-radare2-588775ea38d5)中回顾了如何使用radare2。
arch     x86                         
binsz    3072                        
bintype  pe                          
bits     32                          
canary   false                       
class    PE32                        
cmp.csum 0x00000e67                  
compiled Fri Jul 31 17:44:07 2043    
crypto   false                       
endian   little                      
havecode true                        
hdr.csum 0x00000000                  
linenum  false                       
lsyms    false                       
machine  i386                        
maxopsz  16                          
minopsz  1                           
nx       false                       
os       windows                     
overlay  false                       
pcalign  0                           
pic      false                       
relocs   true                        
signed   false                       
static   false                       
stripped true                        
subsys   Windows CUI                 
va       true
这里没有什么值得注意的地方,我们来查看一下字符串,看看我们得到了什么。
\rÄ‼࠼                         
GetStdHandle                      
ReadFile                           
WriteFile                          
ExitProcess                        
KERNEL32.dll                       
\r&IE*                             
xD+l]^E                            
+DonV\t_EGs&\n\r                   
G1v3 m3 t3h fl4g:                  
G00d j0b!                          
N0t t00 h0t R we? 7ry 4ga1nz plzzz!
这里也没什么太有趣的。 我们看到字符串“G00d j0b!”,这可能是我们输入正确密码时得到的结果。 其余的信息看起来像很多混乱的垃圾,看起来密码可能是被加密的。 我们将不得不调试应用程序,以了解我们如何将密码与加密密码进行比较。 使用-d标志打开radare2中的应用程序,该标志告诉radare2我们将要调试此应用程序。

radare2.exe -d IgniteMe.exe
[0x77200cc0]>

这里我们使用命令'aaaa'来分析可执行文件。 然后,我们使用命令'V!'跳转到radare2的特殊视觉模式进行调试。 该模式允许我们在一个窗口中查看堆栈,寄存器和其他信息。

然后,我们可以使用命令的entry0来转到二进制文件的主函数。 您可以通过以下两种方式之一来完 通过使用'qq'退出可视模式并在普通视图中运行该命令,或者使用':s entry0'以可视模式运行该命令。 你可以用可视模式运行任何radare2命令,方法是使用':'作为前缀。
在entry0中,我们可以看到程序提示我们输入密码。

在使用WriteFile输出字符串后,它会调用另一个函数。 Radare2在分析这个函数时有一个问题,因为它应该被命名为ReadFile,这就是程序如何抓住我们的输入。 然后它接受我们的输入并通过0x401050处的函数运行它。 我们可以通过返回到'V!'模式来设置断点,滚动到该行位于页面顶部并按F2。

然后我们可以使用F9键运行程序。 当白色命令提示符出现时,Radare2会自动停止程序,所以我们需要返回到radare2并再次点击F9。 然后我们需要输入我们的字符串并按下ENTER,我们将停在刚创建的断点处。

 

现在我们正在调用这个函数,我们可以使用F7键进入它。 这将执行一条指令进入函数,然后停止。

它看起来像加密我们的字符串,然后将其与str.IE进行比较。 我们可以逐步浏览这个函数,看看它是如何加密我们给定的字符串的.
首先,我使用F7键单步执行应用程序,直到它到达

call 0x401020

我很懒,不想单步走过这个函数,所以我用F8来步过这个函数。 接着,我看了一下窗口的右侧,查看eax中的值,因为函数的返回值会压入eax中。

在这里我们可以看到eax是2,这是我们字符串的长度。 所以那个函数所做的只是检查我们字符串的长度。 让我们再来看看下一个函数的作用。
我步过了函数0x401000,它返回十六进制值0x00700004并将al移入[ebp-1]。 本质上,这只是将数字4放入[ebp-1]中,稍后我们将看到为什么会这样做。
然后我们看到将字符串[ebp-0xc]的长度移动到eax中,并开始遍历字符串中每个字符的循环。 当我们稍微深入一点时,我们注意到我们字符串的最后一个字母被放入eax中,[ebp-1]中的值被放入ecx中。 然后我们将这两个值xor来开始加密字符串的过程。

然后,将我们提交的明文字符串中的最后一个字母放入[ebp-1]中,再次启动循环。

所以看起来我们正在做的是用前一个字母对字符串的每个字母进行亦或。 如果没有以前的字母,那么我们将该值xor4。

所以对于我们的字符串'hi',我们用'4'和'i'xor,'h'用'i'xor。 所以我们的加密字符串变成0x1 0x6d。 回顾一下程序,我们可以看到它将这个加密的字符串逐个字符地与这个字符串进行比较。
\r&IE*\x17xD+l]^E\x12/\x17+DonV\t_EGs&\n\r\x13\x17HB\x01@M\f\x02i
其中一些值是十六进制值而不是字符串。 这是radare2解析数据的方式。 现在我们知道发生了什么,我们不需要再调试应用程序,并且可以着手于解密该字符串以找出flag是什么。 xor的好处是我们可以将它用于编码和解码。 所以解码这个字符串的方法是将最后一个字符加上4,取下一个值,并将其与先前的解码值进行xor。

i^4 = m
0x02^m = o
\f^o = c
M^c = .
@^. = n
0x01^n = o
B^o = -
H^- = e
0x17^e = r
0x13^r = a
\r^a = l
\n^l = f
&^f = @
s^@ = 3
G^3 = t
E^t = 1
^1 = n
\t^n = g
V^g = 1
n^1 =

o^ = 0
D^0 = t
+^t =

0x17^ = H
/^H = g
0x12^g = u
E^u = 0
^^0 = n
]^n = 3
l^3 =

+^ = t
D^t = 0
x^0 = H
0x17^H =

*^ = u
E^u = 0
I^0 = y
&^y =

\r^_ = R

所以flag是R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com,将这个字符串输入后我们通过了这个挑战。

这是使用Windows上的Radare2调试器的非常基本的操作。我个人更喜欢在调试应用程序时使用x64dbg,但这是一种有趣的学习体验。像往常一样,如果我做错了什么或有什么方法可以改善,请随时伸出手,告诉我。您可以在我的LinkedIn或我的Twitter上与我联系。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

最后于 2019-1-24 14:46 被admin编辑 ,原因:
收藏
点赞2
打赏
分享
最新回复 (4)
雪    币: 1176
活跃值: (1219)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
Tennn 5 2018-3-28 14:35
2
0
r2:修不完的bug,做不完的功能。
雪    币: 2902
活跃值: (1627)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chixiaojie 2018-3-28 16:09
3
0
所以叫修修补补。
雪    币: 2107
活跃值: (1429)
能力值: ( LV8,RANK:126 )
在线值:
发帖
回帖
粉丝
binlmmhc 2018-3-28 18:33
4
0
我觉得他带的一些功能还不错,但是用来调试程序还是不太行
雪    币: 33
活跃值: (318)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
Dascolee 2020-4-28 21:27
5
0
多谢翻译
游客
登录 | 注册 方可回帖
返回