Radare2(一款开源代码的逆向工程平台)近来得到了很多关注,这里我不仅仅想浏览一些文档,我还想尝试用Radare来实现遍历一些代码。
2014 年, GData曾 发布一份关于“ TooHash 行动”的白皮书,还介绍了一个被称为“ Cohhoc ”的恶意软件。 这里我不对 cohhoc 进行深挖,可以通过两个步骤来解码 C2 地址。 URL 作为一个 base64 字符串存储( bitshifted 或者 OR ’ d )。 下图展示的是解码 URL 字符串成为一个 base64 解码函数。
结果数据传递到另一个解码函数,其使用了许多 bitwise 转换进行数据解码。
创建一个针对这个恶意软件的解析器并非难事,就是从所有字符串中找到能够被彻底解码的。唯一的问题就是使用一种有效的方法遍历二进制。下面就是 Radare2 和 Ruby 登场了!
Radare2 可以通过它的 API r2pipe 让脚本运行,同时还与很多常用语言绑定。 首先,我们要得到解码的部分,然后开始进行二进制遍历。
require 'r2pipe' require 'json' require 'base64' def decode(config) decode = Base64.decode64(config) uri = "" decode.each_byte do |b| #shr dl,6 #shl al,2 #or dl,al uri += (((b<<6)%0xff |(b>>2)%0xff)).chr end return uri end
下一步则 是寻找 base64 字符串的示例,我们会将 这个步骤细分得更小。
r2p = R2Pipe.new("mal.exe") #initialize the object r2p.cmd('aaa') #analyze all functions functions = r2p.cmd('aflj') #return the function lists in JSON func = JSON.parse(functions) #parse the JSON
JSON 结果会包含二进制所有函数的信息
{ "offset"=>4214544, "name"=>"entry0", "size"=>42, "cc"=>1, "nbbs"=>1, "calltype"=>"none", "type"=>"fcn", "diff"=>"NEW", "callrefs"=>[ {"addr"=>4205024, "type"=>"C"}], "datarefs"=>[4269968, 4269856, 4206032], "codexrefs"=>[], "dataxrefs"=>[], "difftype"=>"new" }
对我们而言有用的信息为函数名、 offset 和大小。现在,我们有了这些信息就可以遍历并分解函数,寻找 push 指令。
func.each do |elem| #disassemble each function and return JSON 分解函数然后返回JSON contents = JSON.parse(r2p.cmd("pdfj @ #{elem["offset"]}")) #iterate through the operations 遍历操作 contents["ops"].each do |operations| #is the operation a push? 这是一个push操作吗? if operations["type"].eql?("push") #look for addresses being pushed 寻找推送地址 next unless operations["opcode"] =~ // 0x/ #grab the value being pushed 抓取推送的值 addr = operation["opcode"].split(" ").last.hex #use radare "psz" to grab the string 使用radare“psz”抓取字符串 str = r2p.cmd("psz @ #{addr}") #ugly regex looking for base64 data 正则表达寻找base64数据 if str =~ /[0-9a-zA-Z/+/=]{10,}/ #decode the string decoded_str = decode(str) #is the decode something that looks like a URL? 解码的是不是像个URL? if decoded_str =~ /[0-9a-zA-Z/./-]{5,}/ puts "Function #{elem['name']} - #{str.chomp} - #{decoded_str}" end end end end
运行这个脚本,便会得到如下结果:
~$ ./cohhoc_radare.rb 7136ba78671c6c4d801957be8e768d444389a28471679a6ba713adf6b564784f Function fcn.00403890 - 3ZWJtYWlsbiludGFybmV0c2VydmljZW4jb21 - webmail.intarnetservice.com Function fcn.00403890 - oZWxwbjdlYm1haWxlcnNlcnZpY2VzbiNvbU= - help.webmailerservices.com
在这不到100行的代码中,我们便能够找到编码数据,并对其进行解码,同时还能将函数push到堆栈。现在你便可以将所有精力集中到一个函数地址上。
之前我曾写了一个找到cohhoc编码数据并解码的脚本,这个脚本使用了Capstone二进制和Ruby绑定的Crabstone。
我们希望通过此文展现了Radare和 Ruby的一些有用特性,感谢阅读!
*原文: morphick ,FB小编banish编译,转自须注明来自FreeBuf黑客与极客(FreeBuf.COM)