转载

使用Radare2和Ruby开发恶意软件配置解析器

Radare2(一款开源代码的逆向工程平台)近来得到了很多关注,这里我不仅仅想浏览一些文档,我还想尝试用Radare来实现遍历一些代码。

2014 年, GData曾 发布一份关于“ TooHash 行动”的白皮书,还介绍了一个被称为“ Cohhoc ”的恶意软件。 这里我不对 cohhoc 进行深挖,可以通过两个步骤来解码 C2 地址。 URL 作为一个 base64 字符串存储( bitshifted 或者 OR d )。 下图展示的是解码 URL 字符串成为一个 base64 解码函数。

使用Radare2和Ruby开发恶意软件配置解析器

结果数据传递到另一个解码函数,其使用了许多 bitwise 转换进行数据解码。

使用Radare2和Ruby开发恶意软件配置解析器

创建一个针对这个恶意软件的解析器并非难事,就是从所有字符串中找到能够被彻底解码的。唯一的问题就是使用一种有效的方法遍历二进制。下面就是 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)

原文  http://www.freebuf.com/articles/system/94912.html
正文到此结束
Loading...