xorddos 样本进程隐藏的小伎俩
进程隐藏
上周由于工作原因接触到xorddos的样本,这个样本在过去一年的时间里非常常见,
变种也很多,拿到的样本比较有趣的是 ps 无法发现进程。
1 |
|
而使用lsof却可以清除地看见样本正在努力地干活。
1 |
|
阅读汇编代码,分析具体原因,发现xorddos将一些关键信息加密了,F5处理过的代码如下
1 |
|
xorkey 为 BB2FA36AAA9541F0
用idapython 写个小脚本,简单处理一下。
1 |
|
处理后可以看到伪装的命令行信息,daemonname。
1 |
|
呵呵,已经看到 top, ls -al 等信息了,查看daemonname 的交叉引用,发现在main函数
中,到main里看看。
1 |
|
这段汇编代码,使用了一个循环,调用encrypt_code 对daemonname进行了解密。
后面的代码,用到了daemonname的地方有下面几处,
第一处
1 |
|
第二处
1 |
|
第三处
1 |
|
都是作为LinuxExec_Argv2 参数使用的,接着来看LinuxExec_Argv2 的代码
1 |
|
LinuxExec_Argv2 有三个参数。最终执行了execvp
1 |
|
伪代码为,
1 |
|
file 就是arg_0, 需要分析argv, 调出栈图就比较清晰了。
1 |
|
首先是这句
1 |
|
执行了这几句代码后,栈图发生了变化
1 |
|
再看这几句代码
1 |
|
执行了这几句代码后,栈图发生了变化
1 |
|
接下来是这几句代码
1 |
|
执行了这几句代码后,栈图发生了变化
1 |
|
main函数中对LinuxExec_Argv2 的调用的为代码为
1 |
|
因此最后调用的execvp的伪代码为
1 |
|
将进入 main 函数参数个数为3的流程,用IDA重命名后,关键代码为
1 |
|
上面代码的原理大致等同于下面这段代码
1 |
|
编译后执行可以看到效果和运行样本的一样。
1 |
|
其实效果并不好,可以轻易发现踪迹。
1 |
|
其实有更好的做法,使用 prctl ,至少可以把ps给搞定。
1 |
|
编译执行后可以看到效果。
1 |
|
xorddos 的多态 (Polymorphic)
xorddos这个样本还值得一提的是,这个样本会不断变化,多态这个词翻译的可能不太准确,
可以参见上面的英文,自行理解。
1 |
|
xorddos 样本多态主要就是用这个函数,每次在文件末尾写上10个字节的随机字符。
这样样本md5和大小都会发生变化,使得一些检测方法失效。
其他
正因为这种隐藏方法并不理想,后面xorddos出现了带rootkit的版本,进化了。