JiaYu's Blog

浪人


  • Home

  • Archives

  • Categories

  • Tags

  • About

Go二进制文件逆向分析从基础到进阶(完结篇)——Tips与实战案例

Posted on 2020-09-28 | In security |

本文首发于安全客: https://www.anquanke.com/post/id/218674

书接前文,本文介绍 Go 语言二进制文件逆向的几个 Tips,最后用实际案例演示一个 Go 二进制文件逆向分析的进阶玩法——还原复杂数据结构的 Go 语言定义。

传送门:

  1. Go二进制文件逆向分析从基础到进阶——综述
  2. Go二进制文件逆向分析从基础到进阶——MetaInfo、函数符号和源码文件路径列表
  3. Go二进制文件逆向分析从基础到进阶——数据类型
  4. Go二进制文件逆向分析从基础到进阶——itab和strings

11. 逆向分析 Tips

11.1 函数的参数与返回值

本系列第一篇《Go二进制文件逆向分析从基础到进阶——综述》中提到过,Go 语言有自己独特的调用约定和栈管理机制,使 C/C++ 二进制文件逆向分析的经验在这里力不从心:Go 语言用的是 continue stack 栈管理机制 ,并且 Go 语言函数中 callee 的栈空间由上层调用函数 caller 来维护,callee 的参数、返回值都由 caller 在栈中预留空间,传入参数和返回值都是通过栈空间里的内存,就难以直观看出哪个是参数、哪个是返回值。详见 The Go low-level calling convention on x86-64 。Go 中函数内存空间布局如下:

那么,在 IDAPro 中打开某个函数的反汇编代码看一看,函数头部一堆 args 中哪些是传入的参数,哪些又是返回的值呢?

Read more »

Go二进制文件逆向分析从基础到进阶(4)——itab与strings

Posted on 2020-09-25 | In security |

本文首发于安全客: https://www.anquanke.com/post/id/218377

书接前文,本文介绍 Go 语言二进制文件中的 <Interface, type> 映射表和字符串信息,以及如何定位并解析它们。

传送门:

  1. Go二进制文件逆向分析从基础到进阶(1)——综述
  2. Go二进制文件逆向分析从基础到进阶(2)——MetaInfo、函数符号和源码文件路径列表
  3. Go二进制文件逆向分析从基础到进阶(3)——数据类型

9. Interface 映射表(itab_link)

9.1 概念介绍

在 Go 语言的规范中,Interface(接口) 用来定义一组行为(Interface Methods),所有实现了这一组行为的其他类型,都可称之为实现了这个接口。Go 语言中 Interface 的用法还算是有些难点的,比如空接口的用法、以及更复杂一些的基于 Interface 实现的面向对象的多态特性。

前文《Go二进制文件逆向分析从基础到进阶——数据类型》中已经阐述过 Interface 类型的底层定义:

1
2
3
4
5
6
7
8
9
type interfaceType struct {
rtype
pkgPath name // import path
methods []imethod // sorted by hash
}
type imethod struct {
name nameOff // name of method
typ typeOff // .(*FuncType) underneath
}

其实,在 Go 二进制文件中,还保留了 Interface 与实现 Interface 的其他类型之间的映射关系。每一组映射关系,叫 itab(Interface Table),itab 的结构如下:

1
2
3
4
5
6
7
8
9
10
// Interface table
// Refer: https://golang.org/src/runtime/runtime2.go
type itab struct {
inter *interfacetype
_type *_type
hash uint32 // copy of _type.hash. Used for type switches.
_ [4]byte
fun [1]uintptr // variable sized. fun[0]==0 means _type does not implement inter.
}
Read more »

Go二进制文件逆向分析从基础到进阶(3)——数据类型

Posted on 2020-09-02 | In security |

本文首发于安全客: https://www.anquanke.com/post/id/215820

书接前文,本文详细介绍 Go 二进制文件中的数据类型信息,如何定位并解析所有数据类型的定义。

传送门:

  1. Go二进制文件逆向分析从基础到进阶(1)——综述
  2. Go二进制文件逆向分析从基础到进阶(2)——MetaInfo、函数符号和源码文件路径列表

8. types

8.1 简介

重温一下本系列第一篇《Go二进制文件逆向分析从基础到进阶——综述》文末介绍的 Go 语言中的数据类型。Go 在构建二进制文时把项目中所有数据类型信息也打包到二进制文件中,这些数据类型信息主要为 Go 语言中的 Stack Trace、Type Reflection 和类型转换服务。Go 语言内置的标准数据类型如下:

Read more »

Go二进制文件逆向分析从基础到进阶(1)——MetaInfo、函数符号和源码文件路径列表

Posted on 2020-08-28 | In security |

本文首发于安全客: https://www.anquanke.com/post/id/215419

书接前文,本文主要介绍 Go 二进制文件中 Meta Information 的解析,与函数符号和源码文件路径列表的提取。最后详细介绍一下 Moduledata 这个结构。

传送门: Go二进制文件逆向分析从基础到进阶(1)——综述

5. Meta information

5.1 Go Build ID

每一个 Go 二进制文件内,都有一个独一无二的 Build ID,详情参考 src/cmd/go/internal/work/buildid.go 。Go Build ID 可以用以下命令来查看:

1
$ go tool buildid <GoBinaryFilePath>

对于 ELF 文件,也可以用 readelf 命令查看,不过看到的只是 Hex String:

转换一下上图的 Hex String,就是 $ go buildid tracker_nonstrip 的显示结果了:

Read more »

Go二进制文件逆向分析从基础到进阶(1)——综述

Posted on 2020-08-22 | In security |

本文首发于安全客: https://www.anquanke.com/post/id/214940

1. 概述

Go 语言是一个比较新的强类型静态语言,2009 年由 Google 发布,在 2012 年才发布首个稳定版。Go 语言靠 Goroutine 和 channel、wait group、select、context 以及 sync 等辅助机制实现的 CSP 并发模型,以简洁高效编写高并发程序为亮点,很快就在全球范围内吸引大量开发者使用其编写各种程序。现在 Go 已成为云原生领域的首选开发语言。

由于 Go 语言上手快,编码效率高,程序运行效率也高,而且很方便跨平台交叉编译,也吸引了恶意软件开发者的注意。渐渐地,安全厂商开始捕获到越来越多的 Go 语言编写的恶意软件 ,这些恶意软件横跨 Windows、Linux 和 Mac 三大平台。

然而,Go 语言的编译工具链会全静态链接构建二进制文件,把标准库函数和第三方 package 全部做了静态编译,再加上 Go 二进制文件中还打包进去了 runtime 和 GC(Garbage Collection,垃圾回收) 模块代码,所以即使做了 strip 处理( go build -ldflags "-s -w" ),生成的二进制文件体积仍然很大。在反汇编工具中打开 Go 语言二进制文件,可以看到里面包含动辄几千个函数。再加上 Go 语言的独特的函数调用约定、栈结构和多返回值机制,使得对 Go 二进制文件的分析,无论是静态逆向还是动态调式分析,都比分析普通的二进制程序要困难很多。

不过,好消息是安全社区还是找到了针对性的方法,让安全分析人员对 Go 语言二进制文件的逆向变得更加轻松。最开始有人尝试过针对函数库做符号 Signature 来导入反汇编工具中,还原一部分二进制文件中的函数符号。后来有人研究出 Go 语言二进制文件内包含大量的运行时所需的符号和类型信息,以及字符串在 Go 二进制文件中独特的用法,然后开发出了针对性的符号甚至类型信息恢复工具。至此,对 Go 语言二进制文件的逆向分析工作,就变得轻松异常了。

本系列文章将简单介绍 Go 语言二进制文件逆向姿势的发展历史,以及几个典型的恶意程序家族。然后详细介绍基于二进制文件内置的符号、类型信息来逆向分析 Go 语言二进制文件的技术原理和工具,最后以实际的分析案例演示前面介绍的工具和方法。至于还有人研究出基于符号执行和形式化定理证明的高深技术,来恢复 Go 语言二进制文件的符号和类型信息的姿势,不在本文讨论范围之内。因为鄙人也没研究明白

Read more »

Decrypt DNS TXT record data lookuped by latest LSDMiner sample

Posted on 2019-11-26 | In security |

中文版: 逆向解密 LSDMiner 新样本利用 DNS TXT 通道传输的数据

1. Abstract

My colleague sended me a latest LSDMiner sample(MD5: 114d76b774185b826830cb6b015cb56f) in mid-October. I noticed a DNS TXT and DoH(DNS over HTTPS) module with AES decryption by simple reverse engineering analysis. Then I moved on to something else without deep analysis. I got start to deal with this sample in the last few days, and found that Anomali has published a blog post about this case by Googling a function name used in the sample as NewAesCipher128() :

Anomali’s blog post: Illicit Cryptomining Threat Actor Rocke Changes Tactics, Now More Difficult to Detect

But Anomali Labs didn’t detail the process of DNS TXT record data decryption, that’s why I write this blog post.

Read more »

逆向解密 LSDMiner 新样本中 DNS TXT 通道传输的数据

Posted on 2019-11-22 | In security |

本文首发于安全客,原文链接:
https://www.anquanke.com/post/id/193116

1. 概述

10 月中旬,部门老司机发给我一个 LSDMine(旧称 Watchdogsminer) 最新活动中的一个样本(MD5: 114d76b774185b826830cb6b015cb56f)。当时大概看了一眼,里面用到了 DNS TXT 记录和 DoH(DNS over HTTPS) 来传输经过 AES 加密的数据,手头忙别的事,就先搁下了。近来捡起来分析,Google 搜索样本中用到的一个函数 NewAesCipher128() ,发现国外安全公司 Anomali 已经分析过这个 Case :

Anomali 的 Blog: Illicit Cryptomining Threat Actor Rocke Changes Tactics, Now More Difficult to Detect

跟 以前的版本 一样,LSDMiner 的样本仍然是用 Go 编写,但是内部代码结构以及具体功能已经跟旧版本有很大差异。明显的差异至少有以下 3 点:

  • 放弃了使用 Pastebin 作为恶意 Shell 脚本的下发通道,转而使用自己维护的 CC 服务器( *.systemten.org )来承载相关恶意活动;
  • 集成了多个漏洞 Exp,增强传播能力,详见 Anomali 的 Blog;
  • 利用 DNS TXT 记录下发多种经过 AES 加密的数据,这些加密数据有以下几种:
    • 最新的恶意 Cron 任务用到的恶意 Shell 脚本下载 URL,可以写入失陷主机的 Cron 任务;
    • 最新的恶意样本版本号,失陷主机上已有的恶意样本会对比自己的版本号以决定是否 Update;
    • 最新的恶意 Shell 脚本;
    • 一系列最新二进制样本的下载 URL。

其他恶意行为按照常规的逆向分析方法按部就班分析即可,而关于加密的 DNS TXT 数据的逆向与解密过程,Anomali 的 Blog 中描述一带而过,并没详述,按照他们 Blog 中简单的描述,并不足以解密这些数据。本文就以上述样本为例,解析一下如何通过逆向样本一步一步解密这些数据。

Read more »

以 DDG v4005 样本为例浅谈 Golang gob 序列化数据的逆向解码

Posted on 2019-11-19 | In security |

本文首发于安全客,原文链接:
https://www.anquanke.com/post/id/192948

1. 概述

DDG 是一个 一直活跃的挖矿僵尸网络,其主样本由 Go 语言编写。它最新活跃的版本中用基于 Gossip 协议实现集群管理的第三方库 Memberlist 把整个僵尸网络构建成了一个非典型的 P2P 结构。关于其 P2P 网络结构以及如何基于 P2P 特性追踪该僵尸网络,我在以前的两篇文章中有详细描述:

  1. 以P2P的方式追踪 DDG 僵尸网络(上)
  2. 以P2P的方式追踪 DDG 僵尸网络(下)

11.6 日晚上,我的 DDG 挖矿僵尸网络追踪程序检测到 DDG 家族更新到了版本 4005,IoC 如下:

MD5:

  • 64c6692496110c0bdce7be1bc7cffd47 ddgs.i686
  • 638061d2a06ebdfc82a189cf027d8136 ddgs.x86_64

CC:

  • 67.207.95[.]103:8000
  • 103.219.112[.]66:8000

经过简单的分析,新版恶意样本的关键行为与旧版本差异不大,以前部署的追踪程序依然能持续追踪。不过其中一个小的技术点引起了我的注意。

以前说过,DDG 样本为了通过 Memberlist 库加入 P2P 网络(函数 Memberlist.join()),需要一批初始的 P2P Nodes ,新的样本代表的 P2P 节点会通过这些初始的 P2P Nodes 加入 P2P 网络。在旧版样本中,这些初始的 P2P Nodes 被称为 Hub List,其中约有 200 个 节点 IP 地址,这一份 IP 列表以 Hex 数组形式硬编码保存在样本中。而新版 DDG 样本中则把这些 P2P Nodes 称为 Seeds(Memberlist 库 Join() 函数的 ”种子“),这些 Seeds 用 Golang gob 序列化编码后再硬编码保存在样本中,样本里还用一组 ddgs_network__mlUtils_* 函数来处理这些 Seeds:

Read more »

浅谈 Python3 中对二进制数据 XOR 编码的正确姿势

Posted on 2019-05-26 | In dev |

Python3 中的默认编码是 UTF-8,这给大家写 Python 代码带来了很大的便利,不用再像 Python2.x 那样为数据编码操碎了心。但是,由于全面转向 UTF-8 编码,Python3 里面会有一些小细节,稍有不慎容易栽坑。本文就对二进制数据 XOR 编码这一种操作,浅析 Py2/Py3 中默认编码相关的一个细节小差异而引起的小 Bug。

XOR 编码是最简单有效的编码方法之一,虽然简单,但仍然应用广泛。在分析恶意样本时,经常会遇到样本内置的隐秘数据或者网络通信数据,用到了 XOR 编码。比如,一个典型就是 XOR.DDoS 家族,它样本内部关键字符串全用 XOR 编码过,而且其网络通信中 Bot 发给 C2 的上线数据包和 C2 给 Bot 下发的控制指令数据包中均涉及 XOR 编码/解码操作。

Read more »

以 P2P 的方式追踪 DDG 僵尸网络

Posted on 2019-04-11 | In security |

本系列文章从 Botnet(僵尸网络)的基础概念说起,围绕实现了 P2P 特性的 DDG.Mining.Botnet,一步一步设计一个基于 P2P 的僵尸网络追踪程序,来追踪 DDG。DDG 是一个目前仍十分活跃的 Botnet,读懂本文,再加上一些辅助分析工作,就可以自行实现一套针对 DDG 的 P2P 僵尸网络跟踪程序
文章分为三部分:

  1. Botnet 简介
  2. DDG.Mining.Botnet 介绍,着重介绍其涉及的 P2P 特性;
  3. 根据 DDG.Mining.Botnet 的 P2P 特性,设计一个僵尸网络跟踪程序 DDG.P2P.Tracker,来遍历 Botnet 中的节点、及时获取最新的云端配置文件、及时获知 Botnet 中最新启用的 C&C 服务器。

文章首发于安全客,原文链接:

  1. 以P2P的方式追踪 DDG 僵尸网络(上)
  2. 以P2P的方式追踪 DDG 僵尸网络(下)
Read more »
123
0xjiayu

0xjiayu

About Security/Coding…… and life.

25 posts
5 categories
34 tags
RSS
© 2020 0xjiayu
Powered by Hexo
Theme - NexT.Mist