逆向:初学者学习记录

2020-05-24  本文已影响0人  VChao

2020/05/24 -
这里用来记录自己在分析僵尸网络病毒中学习到的逆向知识,新手。
主要针对x86架构32/64位ELF文件进行分析。

引言

0)病毒获取
1)简单汇编基础
2)定位mian函数
3)目前我的逆向学习路径
4)upx脱壳

  1. 分析的是什么

0)病毒获取

病毒获取主要通过以下集中方式:

  1. 自己蜜罐部署
    这种捕获到的样本相对较少,同时有些只是下载了下载病毒的shell,需要自己手动下载。
  2. 威胁情报厂商
    可以去微步在线下载,但他的报告里面主要集中在exe上。
  3. ioc
    之前在github上发现了两个地方IOCs-Daily,latesturls。可以根据他的url进行下载。
  4. 文章
    简书。恶意软件地址集合

当前已经下载了足够的样本,可以针对一个样本好好分析,没必要弄一大堆。

1)简单汇编基础

对于汇编语言来说,32与64位有很多不同,同时因为编译器的选项,导致函数调用的过程也很不一样,感觉这里的学习非常有用,但是自己还是没有掌握要领。

  1. 函数调用的方式,主要分为三类,ccall,fastcall,stdcall。其中linux下主要是ccall和fastcall。这些方式的区别在于,是否被调用的函数是否需要自己进行堆栈的管理,还有就是参数传递的过程。
  2. 64位情况下,经常看到利用edi寄存器的方式传递参数
  3. 堆栈管理,每次函数进入后的代码都非常相似,push ebp,同时还会在堆栈中开辟空间来存储局部变量
    (以上两点非常关键,这两点决定了函数变量的管理,通过这种方式,可以逐渐间将很多变量进行命名,函数内外。)
    (这个一定要注意,就是在堆栈中,到底放置了哪些东西,了解了这个才能知道局部变量的调用还有参数的调用)
  4. 32位通过int 80h出发系统调用,64位采用syscall的方式。
  5. 函数返回值,一般利用eax传递。

2)定位main函数

对于not stripped的文件,在ida分析整个二进制文件完成后,会自动定位到main函数的位置;而stripped的文件,将定位到start的部分,就是通过readelf获取到entry。命令行下获取entry的方法有两种,readelf -a,或者执行gcc后,info file命令。
在定位到start的函数之后,如何寻找main函数呢,linux下一般是通__libc_start_main函数来启动,执行过程中,会将main函数的地址压入堆栈或者传递到寄存器中来启动。

main
主要参考文章[1][2],大致流程如下:
  1. 利用gdb加载程序,使用info file得到程序入口点
  2. b *0xxxx在入口点进行断点,r执行
  3. 进入入口点之后,利用x/11i rip 进行反汇编,这里注意,最后一个变量不太清楚,文章[2]中使用的pc,我也利用这个通过测试了
  4. 查看最后具体的参数来进入main,也就是__libc_start_main的第一个参数,从文中来看就是最后一个压栈的参数

在实践过程中,发现有时候,main函数并没有被认定为函数,而是与前面部分的代码合并为一个函数;这样不利于反编译。解决方案是,将前面这个函数按u取消,然后在main位置按p定义函数,为了能够使用前面的函数,在将前面的函数p重新定义为函数[3]。

3)目前我的逆向学习路径

当前我分析的二进制文件主要集中在elf上,stripped和not stripped的都有,同时自己也下载了大量的样本,各种平台的都有。因为我所研究的主要是僵尸网络的病毒,而对于僵尸网络的病毒研究来说,利用开源的代码参考是非常有用的。特别是stripped的。因为很多僵尸网络病毒的变种都是在开源代码上的修改,比如修改密钥,改改服务器地址,或者添加新的cve来入侵等等。

  1. 开源代码包括两种,mirai和bashlite(这个还有其他的名字,这里就使用这个名字),这两个源码都是c写的,都可以在github是按照关键词搜索到;在学习过程中,可以按照stripped和not stripped的二进制来对应源码逐步分析。
  2. 静态分析:首先利用file命令查看,信息包括,32/64位,架构,是否stripped;然后利用strings查看文件中的字符串,这些字符串可以实现对这部分内容的简单了解。
  3. 动态分析:strace可以帮助记录二进制文件的系统调用记录。对于多进程的二进制,命令如下:strace -ff -o file_name ./binaray_name,其中file_name是输出的文件,binaray_name就是要分析的文件。其输出的信息比较详细,甚至可以将socket的地址都写上。注意,这个命令不能ctrl +c 取消,要kill -9强制取消。
  4. 逆向代码:
    对于not stripped的二进制文件,可以实时看到系统调用,这部分比较方便,然后看函数的名字来查看这个二进制可能所属的类型,一般都跟前面提到的两个文件非常相似。可以通过在阅读代码过程中,逐渐将变量进行命令慢慢分析。
    对于stripped在找到main函数之后,通过将其重命名(按n),系统会自动添加很多信息;这种文件基本上看不到任何信息,分期起来非常麻烦,我现在的过程就是先把一些系统调用给识别出来,通过alt+t命令查找sys字符串,注意选定所有匹配位置。然后ctrl+t逐步进行命令,这样能让分析过程简单很多。虽然看到有些人都说可以利用匹配的方法来匹配得到相应的名字,但我都没有成功[4][5]。然后,socket是通过参数来区分各个函数的,这个要注意。

基本上就是这样,逐渐把整个文件给恢复。我的电脑是64位的,可以按f5反编译出来源码,但是建议初学的时候,不要依赖这个东西。
简单总结一下:
1)not stripped,逐渐分析,对照已有的源码,查看相似度,慢慢来恢复函数,这个过程中,记得将局部变量也命名。
2)stripped,一方面就是按照开源代码,同时可以使用strace的结果来对应着把函数都恢复。

函数命令,变量命令,逐渐恢复文件。

4)UPX脱壳

目前遇到的UPX加壳的主要有两种,一种直接使用命令upx -d脱壳,另一种(mozi家族病毒),这种会提示p_info被破坏,这种可以看自己的另一个文章(等写好发布)

5)分析的是什么

我查看了360对僵尸网络分析的网站,对应该分析什么有了了解。

  1. 分析这个软件的流程,从流程中查看这个软件是否属于某个东西的变种
  2. 分析铭文信息,比如使用的负载,比如使用的密码,这些信息可能已经被混淆或者加密了,需要找到解密的方式,并进行解密
  3. 分析软件与CC服务器或者其他服务器(例如,loader或者repoter)等的通信方式,同时包括这些服务器是否被加密要进行解析
  4. 他文章还对p2p进行详细的描述,这个也应该好好解析。
    最后得出相应的ioc等信息。

2020/06/03 -
今天看了一个本科生的论文,看了他对于恶意软件分析的目的解释,用英文来写吧,更具体。

The primary objective of malware analysis is gain insight to what a specimen's intent is and gain understanding of behaviour and internal configuration through analysis of the specimen's code. Hence establishing:

  • Characteristic and capabilities of the malicious specimen under analysis
  • The damage potential.
  • Indicators of compromise (IOC) which may be used to identify future compromises or activity used within memory in the network or at rest in file system. Observed IOCs can be incorporated in to defense systems and incident response process.

参考

[1]how-to-find-the-main-functions-entry-point-of-elf-executable-file-without-any-s
[2]a-quick-and-efficient-method-for-locating-the-main-function-of-linux-elf-malware-variants/
[3]how-would-i-change-a-loc-to-a-sub-ida-pro
[4]http://reverse.lostrealm.com/tools/rsymtab.html
[5]http://maroueneboubakri.blogspot.com/2016/11/reverse-engineer-stripped-binary-with.html

上一篇下一篇

猜你喜欢

热点阅读