如何检查 ELF 文件是否是 UPX 打包的?

逆向工程 linux
2021-07-07 07:36:37

我有一个 ELF 文件,想知道它是否是 UPX 包装的。如何在 GNU/Linux 中检测 UPX 压缩?

4个回答

好的,假设是普通的 UPX,您应该可以通过检测字符串UPX!UPX0. 据我所知,这也适用于 Windows。

所以它是一个外壳单线,例如:

grep UPX\! <filename>

或者

grep UPX0 <filename>

...假设grep这里的GNU版本


另一种方法,但使用相同的原理:

$ hexdump -C <filename> |grep -C 1 UPX
000000a0  00 00 00 00 00 00 00 00  00 00 20 00 00 00 00 00  |.......... .....|
000000b0  c3 af e9 18 55 50 58 21  20 08 0d 16 00 00 00 00  |....UPX! .......|
000000c0  a0 fd 16 00 a0 fd 16 00  38 02 00 00 c6 00 00 00  |........8.......|
--
0000cf60  fe 61 03 83 78 b5 54 03  67 8b 85 2d ca a8 12 3c  |.a..x.T.g..-...<|
0000cf70  44 ad bc 12 ab 7e 86 55  50 58 30 0e 01 ee 7c 64  |D....~.UPX0...|d|
0000cf80  00 f7 d1 80 4a 11 03 58  6e ac 0d 01 ff 92 83 e8  |....J..Xn.......|
--
000544e0  73 20 66 69 6c 65 20 69  73 20 70 61 63 6b 65 64  |s file is packed|
000544f0  20 77 69 74 68 20 74 68  65 20 55 50 58 20 65 78  | with the UPX ex|
00054500  65 63 75 74 61 62 6c 65  20 70 61 63 6b 65 72 20  |ecutable packer |
00054510  68 74 74 70 3a 2f 2f 75  70 78 2e 73 66 2e 6e 65  |http://upx.sf.ne|
00054520  74 20 24 0a 00 24 49 64  3a 20 55 50 58 20 33 2e  |t $..$Id: UPX 3.|
00054530  30 38 20 43 6f 70 79 72  69 67 68 74 20 28 43 29  |08 Copyright (C)|
--
00054e40  7d 24 24 92 b7 0c 7f 12  01 a8 24 49 92 ff 00 00  |}$$.......$I....|
00054e50  00 00 55 50 58 21 00 00  00 00 00 00 55 50 58 21  |..UPX!......UPX!|
00054e60  0d 16 08 07 80 44 b5 80  b9 9a 8a d9 a0 08 00 00  |.....D..........|

我不建议您依赖您可能找到的字符串或部分名称。通常,它会表明该文件是用 UPX 打包的,但是,特别是如果您正在分析恶意软件,则可能会这样做以欺骗您。我的建议是查看入口点并找到与此类似的模式:

0x00023b60 ; FUNCTION start
0x00023b60 (01) 60                     PUSHA 
0x00023b61 (05) be00904300             MOV ESI, 0xHARDCODED_VIRTUAL_ADDRESS
0x00023b66 (06) 8dbe0080fcff           LEA EDI, [ESI-0x38000] 
0x00023b6c (01) 57                     PUSH EDI 
0x00023b6d (02) eb0b                   JMP 0x00023b7a   ; 1 

基本上,查找 PUSHA、MOV ESI、VIRTUAL_ADDRESS、LEA 和 JMP。

在 Linux/Unix 变体中,strings 命令帮助我识别了一些打包程序,例如 UPX、Aspack、NSPack、NTKrnl、PeCompact、Themida 等,所有这些打包程序都倾向于在打包的可执行文件中留下嵌入的字符串,这有助于识别类型的包装工。当然,elf 文件的作者可能会故意引入相同的字符串,以使您的分析偏离轨道。我只是将其用作分析的起点。

以下是一些帮助我识别封隔器类型的识别字符串。
UPX - UPX0, UPX1, UPX2
Aspack - aspack, adata
NSPack - NSP0, NSP1, NSP2
NTKrnl - NTKrnl Security Suite
PECompact - PEC2, PECompact2
Themida - Themida, aPa2Wa

此外,file 命令还标识了一些常见的打包程序格式。

如果您怀疑该文件肯定是用 UPX 打包的,那么我会推荐 0xC0000022L 的建议。

  1. 获取UPX
  2. 使用不同的选项(LZMA、NRV 等)制作您自己的 UPX 包装 ELF
  3. 由于 UPX 易于修改,并且经常被修改、修补甚至伪造,因此比较代码开始将很容易检查您的目标是否确实是 UPX 打包的,以及这是否真的是原始 UPX 版本,或者它是否在反正。