目录
笔记
加密算法的目的:加密网络通信,加密配置信息,加密字符串
加密算法:凯撒密码
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