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

2016-01-28 587042人围观 ,发现 2 个不明物体 系统安全

Hacking


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

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

static1.squarespace.com.png

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

static1.squarespace.com.png

创建一个针对这个恶意软件的解析器并非难事,就是从所有字符串中找到能够被彻底解码的。唯一的问题就是使用一种有效的方法遍历二进制。下面就是Radare2Ruby登场了!

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)

相关推荐
发表评论

已有 2 条评论

取消
Loading...

文章目录

    特别推荐

    推荐关注

    官方公众号

    聚焦企业安全

    填写个人信息

    姓名
    电话
    邮箱
    公司
    行业
    职位
    css.php