freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

恶意程序取证分析小记202112
2022-01-04 10:43:30
所属地 山东省

通过对1.dll恶意程序分析,得知DllMain的地址是什么?

使用IDA静态反编译,在函数窗口找到 DllMain 函数,定位到地址 1000D02E(新的7.5及以上版IDA会自动定位入口函数,在主窗口左下角可以看到函数名和地址)

image

新版IDA截图

image

通过对1.dll恶意程序分析,gethostbyname函数定位到什么地址?

gethostbyname函数在 导入(Imports)子视图中可以找到

image
image

可以看到地址为 100163CC

接上题,有多少个函数调用了函数gethostbyname

双击进入 gethostbyname 函数,按键盘的X,打开交叉引用窗口

image

###### CODE XREF:代码交叉引用
> 普通流
> 调用流 p(看做是Procedure)
> 跳转流 j(看做是Jump)

###### DATA XREF:数据交叉引用
> 读取交叉引用 r(看做是Read)(address何时被读取)
> 写入交叉引用 w(看做是Write)(address何时被写入)
> 偏移量交叉引用 o(看做是Offset)(address何时被引用)

由图可见类型为p(调用)的不重名函数有5个,即有5个函数调用了函数gethostbyname

通过对1.dll恶意程序分析,详细分析位于0x10001757处的gethostbyname调用,DNS请求将被触发的域名是?

image

查看位于0x10001757处的gethostbyname调用情况

image

从call开始往上看(也可以F5看伪代码),调用传进的参数为eax,eax为地址10019040处字符串偏移13位(0Dh转十进制),双击off_10019040查看,偏移13位后字符串即DNS请求将被触发的域名 pics.praticalmalwareanalysis.com

image
image

通过对1.dll恶意程序分析,IDA Pro识别了在0x10001656处的子函数中的多少个局部变量、多少个参数?

G输入10001656定位到该位置

image

可见子函数中 ptr 后面负值有23个,正值有1个,即IDA识别了该函数中的23个变量,1个参数。

也可以看该处伪代码的39-61行

image

通过对1.dll恶意程序分析,字符串“\cmd.exe /c”位于哪里?

Shift + F12打开字符串窗口,Ctrl + F搜索 \cmd.exe /c ,可见该字符串在 10095B34 位置

image

接上题,在引用“\cmd.exe /c” 的代码所在的区域发生了什么?

image
双击右侧DATA XREF内容检査对该字符串的交叉引用
image

可见该字符串被压入栈
往上看,发现一组字符串在其之前被压入栈

image

双击定位过去

image

看到 Remote Shell Session 初步判断是开启了远程shell会话
从 \cmd.exe /c 被压入栈后开始看,发现有recv调用、exitcd字符串、SetCurrentDirectoryAGetCurrentDirectoryA调用,所以可以确定这个区域是开启了远程shell会话。

image
image

也可以在伪代码里查看

image

通过对1.dll恶意程序分析,0x1000FF58处子函数中若对 ”robotwork” 字符串的memcmp比较是成功的,会发生什么?

定位到1000FF58位置,以图表视图一路向下看,找到 robotwork 的 memcmp

image

比较成功即为0,走红线

image

看到调用了函数 sub_100052A2,跟进去

image

###### RegOpenKeyEx 用于打开一个指定的注册表键

LONG RegOpenKeyEx(

HKEY hKey, // 需要打开的主键的名称
LPCTSTR lpSubKey, //需要打开的子键的名称
DWORD ulOptions, // 保留,设为0
REGSAM samDesired, // 安全访问标记,也就是权限
PHKEY phkResult // 得到的将要打开键的句柄
)

hKey的值:


Public Enum RootKeyEnum
HKEY_CLASSES_ROOT = &H80000000
HKEY_CURRENT_USER = &H80000001
HKEY_LOCAL_MACHINE = &H80000002
HKEY_USERS = &H80000003
HKEY_PERFORMANCE_DATA_WIN2K_ONLY = &H80000004 '仅Win2k
HKEY_CURRENT_CONFIG = &H80000005
HKEY_DYN_DATA = &H80000006
End Enum

\#\#\#\#\#\# RegQueryValueExA 检索一个已打开的注册表句柄中,指定的注册表键的类型和设置值


LONG WINAPI RegQueryValueEx(
HKEY hKey, //一个已打开项的句柄,或者指定一个标准项名
LPCTSTR lpValueName, //要查询注册表键值的名字字符串,注册表键的名字,以空字符结束。
LPDWORD lpReserved, //未用,设为零
LPDWORD lpType, //用于装载取回数据类型的一个变量
LPBYTE lpData, //用于装载指定值的一个缓冲区
LPDWORD lpcbData //用于装载lpData缓冲区长度的一个变量
);

\#\#\#\#\#\# RegCloseKey 释放指定注册键的句柄


LONG RegCloseKey(
HKEY hKey // 释放键的句柄
);

这3个函数调用成功,则返回0(ERROR\_SUCCESS),否则返回非零错误代码。

image

发现程序打开注册表键HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion,获取 WorkTime 键值(接着往下看程序判断若没有这个键则读取 WorkTimes 键值),然后将该值传给函数 sub_100038EE ,跟进去

image
image

看到“SOCKET”“send”,发现程序将该值通过套接字发送出去,所以对 ”robotwork” 字符串的memcmp比较成功后会通过注册表中取出机器工作时间的值,然后组成一个字符串,最后通过套接字发送出去

通过对1.dll恶意程序分析,PSLIST导出函数最后导出了什么文件

G输入 PSLIST 定位 PSLIST 函数位置(或在 导出(Exports)子视图中找到)

image

对该函数分析,判断该函数是获取进程列表,然后将进程列表通过套接字发送,图中函数 sub_10006518 和 sub_1000664C 都会调用函数 sub_1000620C,检查该函数找到生成的文件名 xinstall.dll

image

###### 还有2种方式可以判断:

  • 通过 导入 子视图找到 fopen 函数,查看其与 PSLIST 函数地址相近的交叉引用

image

  • 通过查看 PSLIST 函数调用的函数图表判断

image

通过对1.dll恶意程序分析,DllMain直接调用了多少个API?

打开 视图-图表-用户引用图表,设置如下

image

OK后可见调用了 4 个API

image

接上题,DllMain函数有几个参数?

查看方法同前,3个

image

通过对1.dll恶意程序分析,程序在0x10001358处对sleep的调用会睡眠多少秒?

跳转到 10001358,可见字符串“30”转换为整型数,乘1000(3E8h的十进制)后作为毫秒传入调用的 Sleep API,即睡眠30秒

image

通过对1.dll恶意程序分析,在10001701处是一个对Socket的调用。它的第2个参数是什么?

跳转到 10001701 ,可以看到传入的第2个参数是 1 (也可以用伪代码看)

image
image

通过对1.dll恶意程序分析,搜索in指令(0xED)的使用。使用这个指令目的什么?

Alt + B弹出搜索字节序列窗口,在 Find all occurrences 前打勾,进行搜索

image
image
image

in指令下面一行有比较字符串'VMXh'(若显示ASCII码,光标放在上面按 R 转字符串)
查看使用in指令的函数 sub_10006196 的被引用情况图表,可见有3个参数对其进行调用

image

查看这三个参数

image

可见是用来验证程序是否在虚拟机下运行

通过对1.dll恶意程序分析,将光标跳转到0x1001D988处,对加密的内容进行解密,解密后的内容为?

定位到 1001D988,发现此位置至 1001D9D7 为加密内容,共50个字符

image

判断可能是常用的异或加密,写个脚本测试一下
光标放在第一个字符地址位置(1001D988)
Shift + F2打开脚本执行窗口

使用我写的Python脚本(第一次在ida写python,网上找的资料大部分是旧版ida的写法,我这个7.6版总是报错,废了点时间才发现是版本问题,找到一篇IDA Python 7.5的讲解(cnblogs.com/iBinary/p/14642662.html),下面代码理论上7.5及以上版本ida可正常执行)

def xordecode(xorint):
	i = 0
	b = get_wide_byte(ea+i)
	xres = ''
	while b>0:
		a = b^xorint
		if a not in range(32,126): # ASCII码中共95个包括空格的可见字符,从32到126
			return False
		xres += chr(a)
		i = i+1
		b = get_wide_byte(ea+i)
	return xres
for xori in range(1,95):
	res = xordecode(xori)
	if res is not False:
		print(res)

image

执行后可在输出视图中找到为数不多的候选结果,其中一条语句通顺,即为解密结果

image

xdoor is this backdoor, string decoded for Practical Malware Analysis Lab :)1234

image

# 取证
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者