Lab 9-1
查看程序的导入了Service相关、注册表相关、文件操作相关、网络连接相关的API,还有ShellExecute函数可能是存在后门的命令执行。
字符串主要是cmd.exe和一个注册表SOFTWARE\Microsoft \XPS比较可疑
主流程分析
1.如果运行程序是否有参数。无参数查询注册表”SOFTWARE\Microsoft \XPS\Configure“.查询失败删除文件
2,查看最后一个参数是否为abcd,再根据参数-in -re -c -cc执行相应命令
打开注册表
LSTATUS RegOpenKeyExA(
HKEY hKey,//根键,下面其中之一:HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG
//HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS
LPCSTR lpSubKey,//子健,大小不敏感
DWORD ulOptions,
REGSAM samDesired,
PHKEY phkResult
);
功能分析
-in参数分析
1.如果还没创建ServiceName对应的服务就创建服务,如果创建了就修改服务
2.复制Lab09-01.exe到C:\WINDOWS\system32\Lab09-01.exe
3.将C:\WINDOWS\system32\Lab09-01.exe的创建时间、修改时间、访问时间设置为与kernel32.dll相同
4.设置注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \XPS\Configuration。内容可以通过动态调试得到,如下图。
通过分析可以知道,-in功能是安装服务,如果后面没有带名字就用程序名当作服务名。
动态调试获取注册表设置内容,也可以设置完之后用查看。
获取当前模块的全路径
DWORD GetModuleFileNameA(
HMODULE hModule,//NULL表示当前执行文件
LPSTR lpFilename,//保存路径
DWORD nSize//路径长度
);
改变服务的配置
BOOL ChangeServiceConfigA(
SC_HANDLE hService,//服务句柄
DWORD dwServiceType,//服务类型 SERVICE_NO_CHANGE=0xFFFFFFFF
DWORD dwStartType,//服务启动选项。0x02==SERVICE_AUTO_START
DWORD dwErrorControl,//报错等级
LPCSTR lpBinaryPathName,//服务可执行文件全路径,NULL表示没改变
LPCSTR lpLoadOrderGroup,
LPDWORD lpdwTagId,
LPCSTR lpDependencies,
LPCSTR lpServiceStartName,
LPCSTR lpPassword,
LPCSTR lpDisplayName//被使用的名字
);
将环境变量替换为字符串(%SYSTEMROOT%\system32\Lab09-01.exe ==》C:\WINDOWS\system32\Lab09-01.exe)
DWORD ExpandEnvironmentStringsA(
LPCSTR lpSrc,
LPSTR lpDst,
DWORD nSize
);
-re参数分析
1.删除服务
2.删除C:\WINDOWS\system32\Lab09-01.exe
3.删除注册表项
通过分析可以知道re参数为卸载功能
-c参数分析
根据传入的参数2,3,4,5进行设置注册表参数,具体参数含义需要看后门利用如何使用
通过分析可以知道-c选项为配置参数功能
-cc参数分析
读取注册表中的内容并输出。
通过分析可知-cc选项为输出配置信息
后门功能
当然还有最重要的后门功能模块还没分析。后门功能在sub_402360()中
1.后门启动会先读取注册表中的配置文件
2.sub_401E60()连接配置中设置的网站http://www.practicalmalwareanalysis.com和端口80,读取命令,因为是练习病毒样本,所以并不会获取到命令,剩下命令可以靠猜,或者修改内存值来达到触发的目的
3.SLEEP:休眠。UPLOAD:下载网站文件到本地。DOWNLOAD:上传本地文件到服务器。CMD:执行cmd命令
课后习题
1.如何让这个恶意代码安装自身?
Lab09-01.exe -in abcd
2.这个恶意代码的命令行选项是什么?它要求的密码是什么?
-in -re -c -cc。密码是abcd
3.如何利用OllyDbg永久修补这个恶意代码,使其不需要指定的命令行密码?
方法1:修改jnz为jmp
方法2:修改密码检测函数为mov eax,1;retn
4.这个恶意代码基于系统的特征是什么?
文件:C:\WINDOWS\system32\Lab09-01.exe
注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \XPS\Configuration
5.这个恶意代码通过网络命令执行了哪些不同操作
SLEEP UPLOAD DOWNLOAD NOTHING
6.这个恶意代码是否有网络特征
http://www.practicalmalwareanalysis.com
Lab 9-2
导入表有CreateProcess和Sleep,还有网络连接API可能是后门程序。静态字符串没有有价值的字符串。直接运行,Process Monitor和process explorer,注册表监控软件都没显示有什么敏感操作
主流程分析
1.GetModuleFileName获取执行程序的名字与ocl.exe进行比较,不相同则无法执行
2.动态解密出攻击者的url(www.practicalmalwareanalysis.com)
3.连接目标的9999端口
4.sub_401000函数创建反向shell连接
后门配置
将cmd的标准输入输出错误流和socket绑定
初始化winsockDLL
int WSAStartup(
WORD wVersionRequired,
LPWSADATA lpWSAData
);
创建绑定在特定传输服务上
SOCKET WSAAPI WSASocketA(
int af,//协议族 2表示ipv4
int type,//socket类型 1表示SOCK_STREAM
int protocol,//协议类型 6表示TCP
LPWSAPROTOCOL_INFOA lpProtocolInfo,
GROUP g,
DWORD dwFlags
);
sockaddr结构体
struct sockaddr {
ushort sa_family;
char sa_data[14];
};
struct sockaddr_in {
short sin_family;
u_short sin_port;//端口
struct in_addr sin_addr;//ip地址
char sin_zero[8];
};
结构体:用于描述一个给定的主机
typedef struct hostent {
char *h_name;//域名
char **h_aliases;//别名???
short h_addrtype;//地址类型 02
short h_length;//每个地址的长度
char **h_addr_list;//ip地址数组
} HOSTENT, *PHOSTENT, *LPHOSTENT;
指定新进程的主窗口特征
typedef struct _STARTUPINFOA {
DWORD cb;
LPSTR lpReserved;
LPSTR lpDesktop;
LPSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;
课后习题
1.在二进制文件中,你看到的静态字符串是什么?
找不到什么字符串
2.当你运行这个二进制文件是,会发生什么?
无法启动,需要修改程序名为ocl.exe
3.怎么让恶意代码的攻击载荷(payload)获得运行?
4.在地址0x401133处发生了什么?
5.传递给子例程0x401089的参数是什么?
“1qaz2wsx3edc”和解密密钥
6.恶意代码使用的域名是什么?
practticalmalwareanalysis.com
7.恶意代码使用什么编码函数来混淆域名?
“1qaz2wsx3edc”异或加密混淆域名
8.恶意代码在0x004016e处调用CreateProcessA函数的意义是什么?
创建和攻击者的反向连接
Lab 9-3
直接导入了DLL1、DLL2、Kernel32.dll。虽然没有直接导入DLL3但是字符串中有DLL3相关的字符串
主流程分析
- DLL1Print函数输出进程PID
- DLL2Print函数输出创建的临时文件句柄
- 向临时文件写入内容
- 加载DLL3,并调用DLL3Print输出CMD命令保存的地址
- DLL3GetStructure函数获取AT_INFO结构体
- NetScheduleJobAdd添加定时任务,为ping www.malwareanalysisbook.com
DLL1Print函数
输出"DLL 1 mystery data %d\n"当前进程的PID
DLL2Print函数
输出"DLL 2 mystery data %d\n",CreateFile函数的句柄返回值
DLL2ReturnJ函数
返回CreateFile(“temp.txt”)的句柄
DLL3Print函数
输出"DLL 3 mystery data %d\n",WideCharStr为“ping www.malwareanalysisbook.com”转为WideChar之后的地址
DLL3GetStructure函数
得到AT_INFO结构体如下图
添加一个未来执行的任务
NET_API_STATUS NET_API_FUNCTION NetScheduleJobAdd(
LPCWSTR Servername,//指向一个DNS和NetBIOS字符串,如果是NULL表示本地
LPBYTE Buffer,//指向AT_NFO结构体,描述任务
LPDWORD JobId//接收任务ID
);
结构体:描述任务
typedef struct _AT_INFO {
DWORD_PTR JobTime;//指向任务运行的时间
DWORD DaysOfMonth;//每个Bit表示任务在一个月中的哪几天运行
UCHAR DaysOfWeek;//每个Bit表示任务在一个星期的那几天运行
UCHAR Flags;//属性
LPWSTR Command;//指向Unicode命令
} AT_INFO, *PAT_INFO, *LPAT_INFO;
总结
没啥好总结的,就是相关API和结构体的学习。
周末参加了美团CTF只做了一道100mazes,练习了idapython的使用。另外的matrix和inject看看能不能复现出来。