恶意代码分析-第十三章-数据加密

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37809075/article/details/82377646

目录

笔记

实验

Lab13-1

Lab13-2

Lab13-3


笔记

加密算法的目的:加密网络通信,加密配置信息,加密字符串

加密算法:凯撒密码

                  XOR

                  ADD,SUB

                  ROL,ROR:旋转字节左侧和右侧

                  ROT:凯撒密码

                  Multibyte:异或以块为单位

                  链或者环:内容本身作为密钥

                  Base64:3个字节的字符对应base64加密后为4个字节

                                 3*8                             4*6         

                  RC4:动态创建结构,很难识别,没有明显的加密常量

                  自定义加密算法:1.多种已知加密方案的组合。2.开发一种与标准加密算法类似的

识别算法

                  XOR:IDApro-->Search-->Text-->Find all occurrences(xor)

                             可能的两种形式:1.一个常量XOR,2.不同寄存器XOR

                             特征:XOR函数处于一个循环嵌套中

                  Base64:特征:查找算法常用的64字节长度的字符串(A~Z,a~z,0~9,+和/),这个密钥字符串序列可以改变

                                             单独填充“=”

                  常见加密算法:识别字符串/导入函数

                                           IDApro-->FindCrypto2

                                           PEID---->Krypto ANALyzer

                                           IDApro-->entropy_plugin查找高阈值内容:适用于没有找到加密常量的地方(RC4)

                   自定义加密算法:从可疑的输入和输出跟踪运行的流畅,加密函数一般离输出函数不远。

解密算法

                  XOR:再进行异或操作

                  自解密:使用恶意代码中存在的函数在运行期间完成自解密。

                  手动解密:识别出加密算法,使用python借助代码库实现解密操作

                  利用本身的加密例程:利用ImmDbg-->启动恶意代码,准备加密文件和一个将要写入的文件,分配加密文件的空间,加载到内存,为加密函数设置变量和参数,运行加密函数,将结果从内存中写入到创建好的文件中。

实验

Lab13-1

根据导出函数,判断恶意文件对资源段做了手脚,并有网络操作。

搜索用于异或操作的代码

 有效的只有红框位置的,其他的是清空寄存器和系统代码

调到异或的位置,来确认是否是异或加密,有递增和一个循环。这个函数的两个参数一个是缓冲区的位置,一个是缓冲区的大小

 调到引用sub_401190的函数位置,可以看出在调用这个函数之前,有关于资源操作的函数

lpName就是资源部分的名称101 

 利用Resource Hacker来找到资源段,另存为二进制文件

修改文件,与3B逐一异或,得到一个恶意网站

 

在4050E8处有base64的编码表

到了这里看到是base64编码所用的初始变量

 这些变量在401000处被引用了,所以这里可能是关于base64编码的初始化,看看在哪里调用了401000处

交叉引用,跟踪到上图位置,可以看出这里有几个循环。一个是与3比较的循环,一个是与4。base64编码3个为一组,输出为4个字节。

这里看出sub_4010B1的输入是主机名

Lab13-2

三个工具都没有起到作用,没有查找到加密相关的东西

查找xor指令,sub_401739中有多条xor指令,sub_40128D中有一条xor指令。

对两个程序进行的重命名

可以看到这个heavy_xor函数还有一些移位操作,和一个大的循环。根据函数引用图,可以看出,两个xor函数其实是一回事。

因为导入函数里面有writefile函数,所以要跟到这个位置来看之前对写入数据的加密。

可以看到调用writefile函数的位置,sub_401000的功能就是创建一个文件并写入,所以把这个函数重命名为bufferwrite。跟到bufferwrite的调用处

函数sub_401070和函数sub_40181F在文件写入之前,比较可疑。GetTickCount函数返回从操作系统启动所经过的时间毫秒级。

sub_40181F调用了heavy_xor函数,所以这个sub_40181F有可能是加密函数

sub_401070函数中的函数调用情况。其中GetDesktopWindow函数和BitBit函数来抓取用户桌面

这里假设加密函数是可逆的,来利用od来替换加密函数的缓冲区部分来实现解密。

401880和40190A下断点。一个是加密函数开始的位置,一个是文件创建结束后的位置。

 运行一次后,创建了一个加密的文件,再次回到加密函数的位置,可以看到有两个参数,一个是buffer的起始位置,一个是buffer的大小。将刚刚创建的加密文件16进制打开,复制16进制数据到buffer,再让加密函数执行一次。

复制到内存区域,再次运行程序,第二次生成一个文件,将文件后缀改为.bmp

from immlib import *
import immlib

def main(args):
	imm = immlib.Debugger()             #提供对调试器的访问
	imm.setBreakpoint(0x00401875)       #加密例程压入参数之前下断点
	imm.run()
	cfile = open("","rb")               #打开解密文件
	buffer = cfile.read()               #将内容读取到缓冲区
	sz = len(buffer)                    #获取读取的内容大小
	membuf = imm.remoteVirtualAlloc(sz) #在调试器的进程空间内分配存储区
	imm.writeMemory(membuf,buffer)      #将缓冲区内容复制到内存空间
	regs = imm.getRegs()                #获取当前寄存器的值
	imm.writeLong(regs["EBP"]-12,membuf)#缓冲区的位置参数
	imm.writeLong(regs["EBP"]-8,sz)     #缓冲区的大小参数
	imm.setBreakpoint(0x0040190A)       #加密例程结束的断点
	imm.run()
	return "Success"

Immunity debugger中利用python解密

Lab13-3

可能与自定义的base64编码有关 

查找出xor的代码,并将其引用位置的函数重命名 

识别出这是一个关于AES加密的例程,其中Te0-Te3是加密的常量,Td0-Td3是关于解密的常量。

其中加密例程调用了number2和number4,解密例程调用了number3和number5

number6函数的位置,这里单个异或。

sub_40352D调用了number2,4,6。所以这个函数是AES加密函数,重命名为AES_encode

只有number1还没有分析,这里看这个函数字符串,可能是加密时的初始化判断,因为有对密钥和块大小的判断。

在调用number1的位置,传入了unk_412EF8常量,而在AES_encode的函数开始前,也传入了这个常量 。其中ijk........是密钥

这个程序使用了AES和自定义的base64加密,这两个加密都在ReadFile和Writefille之间

创建了一个自定义的base64解密线程和AES加密线程。其中base64解密的线程数据来源是读取远程套接字的内容,使用AES传出shell命令

import string
import base64

s = ""
tab = 'DEFGHIJKLMNOPQRSTUVWXYZABcdefghijklmnopqrstuvwxyzab0123456789+/'
b64 = 'ABDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

ciphertext = 'BInaEi=='

for ch in ciphertext:
	if(ch in tab):
		s += b64[string.find(tab,str(ch))]
	elif(ch == '='):
		s += '='

print base64.decodestring(s)

解密自定义的base64

from Crypto.Cipher import AES
from Crypto import Random
import binascii

raw=""

ciphertext = binascii.unhexlify(raw.replace(' ',''))
iv = Random.new().read(AES.block_size)
object = AES.new(key,AES.MODE_CBC,iv)
msg = obj.decrypt(ciphertext)
print msg

解密AES

猜你喜欢

转载自blog.csdn.net/m0_37809075/article/details/82377646
今日推荐