关于upx的脱壳的文章比较多,基本上都是Windows平台下的脱壳文章,处理起来比较简单。FormSec将在本文中分析一款mips下病毒程序使用的upx壳保护手段。
在应急事件处理过程中,提取到病毒样本为virus.dat,样本使用了upx(3.91)壳,对程序进行了压缩处理。
作者对加壳后的样本进行了修改,导致使用upx –d命令解压失败;虽然解压失败了,但是不影响程序正常功能的执行。
分别使用两个版本的upx程序尝试脱壳,可以看出最新版的提示信息比较具体
提示:upx: virus.dat: CantUnpackException:p_info corrupted
由于最新版的脱壳程序直接报告出是p_info字段的问题,在网上找了一圈没有关于针对该问题的解决方案,这里直接找upx(3.94)最新版的源码分析一下,主要简单分析作者使用的干扰脱壳程序的技术手段,以及如何修复
1. 定位输出错误信息的位置,直接查找错误信息字符串即可;查找到两处分别对应32位和64位版本的文件头
2. 简单分析一下p_lx_elf.cpp ->PackLinuxElf32::unpack 函数的功能;
3. p_info结构体的定义如下,12bytes
4. 定位文件中p_info的位置,可以看出作者将该结构体用0填充后,解压程序检测到异常,导致解压缩失败
5. 修复upx壳,下图标记的位置保存着有效的p_info->p_filesize 字段(p_filesize 和 p_blocksize相同)
6. 修复p_info信息:
7. 脱壳成功
上面主要记录了整个处理定位问题,一直到如何修复的方法与思路,希望能够帮助到对二进制病毒分析比较感兴趣的同学后续有机会的话,会出一篇关于该病毒的详细技术分析报告,欢迎各位大佬斧正