xorddos 样本进程隐藏的小伎俩
进程隐藏
上周由于工作原因接触到xorddos的样本,这个样本在过去一年的时间里非常常见,
变种也很多,拿到的样本比较有趣的是 ps 无法发现进程。
1 | [root@localhost ~]# ps -ef | grep /usr/bin |
而使用lsof却可以清除地看见样本正在努力地干活。
1 | [root@localhost ~]# lsof +d /usr/bin |
阅读汇编代码,分析具体原因,发现xorddos将一些关键信息加密了,F5处理过的代码如下
1 | int __cdecl encrypt_code(int a1, int a2) |
xorkey 为 BB2FA36AAA9541F0
用idapython 写个小脚本,简单处理一下。
1 | from idautils import * |
处理后可以看到伪装的命令行信息,daemonname。
1 | .data:080CBB40 daemonname db '!#Ff3VE.-7',17h,'V[_ 0',0 ; DATA XREF: main+31Eo |
呵呵,已经看到 top, ls -al 等信息了,查看daemonname 的交叉引用,发现在main函数
中,到main里看看。
1 | .text:0804AC30 ; int __cdecl main(int argc, const char **argv, const char **envp) |
这段汇编代码,使用了一个循环,调用encrypt_code 对daemonname进行了解密。
后面的代码,用到了daemonname的地方有下面几处,
第一处
1 | .text:0804B29F call getpid |
第二处
1 | .text:0804B932 lea edx, [ebp+var_1888] |
第三处
1 | .text:0804B9DF lea edx, [ebp+var_1C88] |
都是作为LinuxExec_Argv2 参数使用的,接着来看LinuxExec_Argv2 的代码
1 | .text:08048520 LinuxExec_Argv2 proc near ; CODE XREF: DelService+B3p |
LinuxExec_Argv2 有三个参数。最终执行了execvp
1 | .text:0804857C mov [esp], esi ; file |
伪代码为,
1 | execvp(file, &argv); |
file 就是arg_0, 需要分析argv, 调出栈图就比较清晰了。
1 | -00000018 argv dd ? ; offset |
首先是这句
1 | .text:08048529 mov esi, [ebp+file] |
执行了这几句代码后,栈图发生了变化
1 | -00000018 argv arg_0 ; offset |
再看这几句代码
1 | .text:08048576 mov eax, [ebp+arg_4] |
执行了这几句代码后,栈图发生了变化
1 | -00000018 argv arg_0 ; offset |
接下来是这几句代码
1 | .text:08048582 mov eax, [ebp+arg_8];eax = pid |
执行了这几句代码后,栈图发生了变化
1 | -00000018 argv arg_0 ; offset |
main函数中对LinuxExec_Argv2 的调用的为代码为
1 | LinuxExec_Argv2('木马路径', '伪装命令行', pid); |
因此最后调用的execvp的伪代码为
1 | execvp('木马路径', argv); |
将进入 main 函数参数个数为3的流程,用IDA重命名后,关键代码为
1 | text:0804B5D3 PARAM_NUM_3: ; CODE XREF: main+3CDj |
上面代码的原理大致等同于下面这段代码
1 |
|
编译后执行可以看到效果和运行样本的一样。
1 | ➜ ~ gcc -o fakeexe exe.c |
其实效果并不好,可以轻易发现踪迹。
1 | ➜ ~ ps -e | grep fakeexe |
其实有更好的做法,使用 prctl ,至少可以把ps给搞定。
1 |
|
编译执行后可以看到效果。
1 | ➜ ~ ps -e | grep bash |
xorddos 的多态 (Polymorphic)
xorddos这个样本还值得一提的是,这个样本会不断变化,多态这个词翻译的可能不太准确,
可以参见上面的英文,自行理解。
1 | int __cdecl randmd5(char *filename) |
xorddos 样本多态主要就是用这个函数,每次在文件末尾写上10个字节的随机字符。
这样样本md5和大小都会发生变化,使得一些检测方法失效。
其他
正因为这种隐藏方法并不理想,后面xorddos出现了带rootkit的版本,进化了。
xorddos 样本进程隐藏的小伎俩