今天学习的内容是动静结合分析病毒,若有不当之处希望伙伴们可以指出,让我们共同完善,共同进步
注意:文章内容只是分享自身的知识储备,只是自身的理解,不一定准确,希望观看的时候只是参考,思维不要被其所局限。
开始进入正文:
根据之前所学的静态、动态分析技术,结合起来分析测试样本
找到程序,载入分析工具分析
ifconfig命令
可查询网卡发送数据情况,对比日期所需,若发送数据过大或接收发送对比差异过段(未下载数据)则说明可疑,存在异常,需深入排查
nethogs命令(正常情况需安装)
列出进程的网络情况
看到进程1在发送与接收数据,查看详情
top命令
查询指定进程资源占用情况
开始监控资源占用不到,后期逐步占用过高,可能为远控木马驻留,后收到命令执行攻击行为如:搜索指定文件
根据PID查找进程路径
猜测状态查询外联IP
根据端口反查进程
未方便理解模拟了一个攻击程序根据一个存在溢出漏洞程序进行攻击的过程。
简单分析攻击程序利用思路与溢出漏洞产生原因
备注:根据STACK1_VS_2017.cpp修改
工具链:Mingw
根据源码看到若gets函数获取的数据为**DCBA(*通配符,例如:11DCBA,字符串DCBA的16进制为44434241,因堆栈数据读写顺序为先进后出故真正调用时为ABCD),则证明利用了此程序的缓冲区溢出漏洞并显示了隐藏信息(根据代码逻辑,程序正常运行不满足显示此隐藏信息的条件)
缓冲区漏洞成因:buf申请的缓冲区大小为2,并且用gets获取导致未对缓冲区进行保护,若获取的数据超过2则溢出。
效果:缓冲区溢出成功,并输入特定代码读取了隐藏信息
监控:
procexp64
Procmon64
定位到利用脚本test.py
运行到模块值为:test.exe
入口断点断下,未看到泄露信息相关内容,字符串搜索快速定位漏洞函数代码块
备注:编译器为了使可执行程序正常工作和启动,增加了很多代码。故第一次入口函数断点往往不会断到main函数
反编译对照:
MapoAnalyzer
Snowman
跟踪分析:
在输入字符串时,在堆栈窗口看到两变量对应的地址紧挨着
根据反编译结果分析输入的字符串的是对应buf变量的值,但现在cookie对应也有值,分析数据溢出,导致cookie对应的地址有值并且为输入数值减两位即DCBA,如下图所示:
可以看到输入的字符串已满足条件,跳转不成功,导致隐藏信息被调取
扩展分析:
gets函数
结合分析因程序使用gets函数获取输入数据导致存在溢出漏洞,其中此程序根据此隐患隐藏了特定字符。
http:
/
/
192.168
.
86.144
/
word.cab
解析:cab是windows的压缩格式,我这边使用
7
-
z提取
http:
/
/
192.168
.
86.144
/
word.cab
解析:cab是windows的压缩格式,我这边使用
7
-
z提取
正常:就是打开一个word文档
可疑:调用了控制面板程序control.exe
并通过控制面板执行临时文件夹下名为msword.inf配置文件,之后通过运行cmd程序打开计算器程序calc.exe(这里代指恶意程序)
正常:就是打开一个word文档
可疑:调用了控制面板程序control.exe
并通过控制面板执行临时文件夹下名为msword.inf配置文件,之后通过运行cmd程序打开计算器程序calc.exe(这里代指恶意程序)
关键call:
00007FF67F1128E3
| E8 C8F4FFFF | call control.
7FF67F111DB0
|
关键call:
00007FF67F1128E3
| E8 C8F4FFFF | call control.
7FF67F111DB0
|
*
cmd,
*
bat
/
/
猜测在这里准备好了dos环境
00007FFDF9DD11ED
|
48
:
8D15
94DA4800
| lea rdx,qword ptr ds:[
7FFDFA25EC88
] | rdx:L
"*.CMD;*.BAT"
,
00007FFDFA25EC88
:L
"*.CMD;*.BAT"
00007FFDF9DD11F4
|
48
:
8BC8
| mov rcx,rax | rax:L
"rundll32.exe"
*
cmd,
*
bat
/
/
猜测在这里准备好了dos环境
00007FFDF9DD11ED
|
48
:
8D15
94DA4800
| lea rdx,qword ptr ds:[
7FFDFA25EC88
] | rdx:L
"*.CMD;*.BAT"
,
00007FFDFA25EC88
:L
"*.CMD;*.BAT"
00007FFDF9DD11F4
|
48
:
8BC8
| mov rcx,rax | rax:L
"rundll32.exe"
定位技巧:字符串搜索关键信息,之后双击进入反汇编页面查看
定位技巧:字符串搜索关键信息,之后双击进入反汇编页面查看
在模块列表看到了RPCRT4.DLL
文件描述:远程程序调用运行时
在explorer.exe进程树下
判断:可疑模块,一般情况程序有远程需求才会加载,当前测试机无已知远程,test.exe加载了此模块不正常,并且因此进程在explorer.exe进程树下判断为用户启动
在模块列表看到了RPCRT4.DLL
文件描述:远程程序调用运行时
在explorer.exe进程树下
判断:可疑模块,一般情况程序有远程需求才会加载,当前测试机无已知远程,test.exe加载了此模块不正常,并且因此进程在explorer.exe进程树下判断为用户启动
test下调用了某些程序
ipconfig.exe:(运行了如下命令:ipconfig,行为解析查询当前IP)
whoami.exe:(运行了如下命令:whoami,行为解析显示已登录的用户信息)
net.exe:(运行了如下命令:net user
123
123
add,行为解析创建账号行为 )
test下调用了某些程序
ipconfig.exe:(运行了如下命令:ipconfig,行为解析查询当前IP)
whoami.exe:(运行了如下命令:whoami,行为解析显示已登录的用户信息)
net.exe:(运行了如下命令:net user
123
123
add,行为解析创建账号行为 )
频繁外联此IP:
192.168
.
86.114
初步判断为攻击者使用的IP
频繁外联此IP:
192.168
.
86.114
初步判断为攻击者使用的IP
Windows API函数,用于申请内存空间
Windows API函数,用于结束调用进程及其所有线程。
Windows API函数,用于结束调用进程及其所有线程。
关键call:
00007FF8054B2A59
|
48
:FF15
301F0500
| call qword ptr ds:[<&NtDeviceIoControlF |
进入call:
00007FF8086CCEF0
|
4C
:
8BD1
| mov r10,rcx |
00007FF8086CCEF3
| B8
07000000
| mov eax,
7
|
00007FF8086CCEF8
| F60425
0803FE7F
01
| test byte ptr ds:[
7FFE0308
],
1
|
00007FF8086CCF00
|
75
03
| jne ntdll.
7FF8086CCF05
|
00007FF8086CCF02
|
0F05
| syscall |
NtDeviceIoControlFile函数解析:为提供的缓冲区构建描述符,并将非类型化数据传递给与文件句柄关联的设备驱动程序。
关键call:
00007FF8054B2A59
|
48
:FF15
301F0500
| call qword ptr ds:[<&NtDeviceIoControlF |
进入call:
00007FF8086CCEF0
|
4C
:
8BD1
| mov r10,rcx |
00007FF8086CCEF3
| B8
07000000
| mov eax,
7
|
00007FF8086CCEF8
| F60425
0803FE7F
01
| test byte ptr ds:[
7FFE0308
],
1
|
00007FF8086CCF00
|
75
03
| jne ntdll.
7FF8086CCF05
|
00007FF8086CCF02
|
0F05
| syscall |
NtDeviceIoControlFile函数解析:为提供的缓冲区构建描述符,并将非类型化数据传递给与文件句柄关联的设备驱动程序。
RX Packets
/
/
接收到的数据包数量
TX Packets
/
/
发送数据包的数量
RX Bytes
/
/
接收到的字节数
TX Bytes
/
/
发送出去的字节数
RX Packets
/
/
接收到的数据包数量
TX Packets
/
/
发送数据包的数量
RX Bytes
/
/
接收到的字节数
TX Bytes
/
/
发送出去的字节数
dev 网卡
sent 发送
received 接收
dev 网卡
sent 发送
received 接收
top
-
p
7132
/
/
7132
为进程pid
cd
/
proc
/
7132
/
/
7132
为进程pid
ls
-
ail
/
/
exe对应的就是可执行文件路径信息
补充知识:
Linux系统上的
/
proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,
/
proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
ls
-
ail [目录名]:打印当前
/
指定目录的目录文件
组合查询:ls
-
ail
/
proc
/
7132
若非root权限会导致有些信息查询不到,如提示如下信息:
ls: 无法读取符号链接
'/proc/7132/cwd'
: 权限不够
ls: 无法读取符号链接
'/proc/7132/root'
: 权限不够
ls: 无法读取符号链接
'/proc/7132/exe'
: 权限不够
cd
/
proc
/
7132
/
/
7132
为进程pid
ls
-
ail
/
/
exe对应的就是可执行文件路径信息
补充知识:
Linux系统上的
/
proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,
/
proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
ls
-
ail [目录名]:打印当前
/
指定目录的目录文件
组合查询:ls
-
ail
/
proc
/
7132
若非root权限会导致有些信息查询不到,如提示如下信息:
ls: 无法读取符号链接
'/proc/7132/cwd'
: 权限不够
ls: 无法读取符号链接
'/proc/7132/root'
: 权限不够
ls: 无法读取符号链接
'/proc/7132/exe'
: 权限不够
netstat
-
na|grep ESTABLISHED
netstat
-
na|grep ESTABLISHED
netstat
-
nap | grep
47074
netstat
-
nap | grep
47074
pmap
-
d
3885
kill
-
HUP
3885
int
main(
int
argc, char
*
*
argv) {
MessageBoxA((HWND)
-
0
, (LPCSTR)
"检测程序是否正常运行\n"
, (LPCSTR)
"功能"
, (UINT)
0
);
int
cookie;
char buf[
2
];
int
*
a
=
&cookie;
char
*
b
=
buf;
printf(
"buf: %08x cookie: %08x\n"
, b, a);
u_int64 p
=
(u_int64)a
-
(u_int64)b;
printf(
"程序正常运行,存在缓存区溢出漏洞,其中两变量内存地址之差=%d:\n注意:若超过此值则缓冲区溢出\n"
,p);
gets(buf);
if
(cookie
=
=
0x41424344
)
printf(
"缓冲区溢出,已被成功利用此漏洞,隐藏信息已显示,请排查\n"
);
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2022-2-7 12:43
被梦幻的彼岸编辑
,原因: