仍然在了解如何防止使用UPX的-d(解压缩)选项(请参阅此问题)的途中,我尝试在ELF可执行文件中标识UPX的头文件。

代码中,所有来源似乎都在文件lx_elf.hlx_elf.cpp(代表Linux Elf)中。我尝试遵循该代码,但迷失了它。

我也确实查看了UPX压缩可执行文件(amd64)的开头,该文件以每行模式8字节的形式可视化为了更加清晰(并感谢Corkami ELF-101):

00000000: 7f45 4c46 0201 0103  .ELF....
00000008: 0000 0000 0000 0000  ........
00000010: 0200 3e00 0100 0000  ..>.....
00000018: 0831 4200 0000 0000  .1B.....    ELF HEADER
00000020: 4000 0000 0000 0000  @.......
00000028: 0000 0000 0000 0000  ........
00000030: 0000 0000 4000 3800  ....@.8.
00000038: 0200 4000 0000 0000  ..@.....

00000040: 0100 0000 0500 0000  ........
00000048: 0000 0000 0000 0000  ........
00000050: 0000 4000 0000 0000  ..@.....
00000058: 0000 4000 0000 0000  ..@.....    PROGRAM HEADER TABLE
00000060: f438 0200 0000 0000  .8......
00000068: f438 0200 0000 0000  .8......
00000070: 0000 2000 0000 0000  .. .....
00000078: 0100 0000 0600 0000  ........

00000080: 487d 0500 0000 0000  H}......
00000088: 487d 6500 0000 0000  H}e.....
00000090: 487d 6500 0000 0000  H}e.....
00000098: 0000 0000 0000 0000  ........
000000a0: 0000 0000 0000 0000  ........    UPX HEADER (???)
000000a8: 0000 2000 0000 0000  .. .....
000000b0: a298 b634 5550 5821  ...4UPX!
000000b8: f407 0d16 0000 0000  ........
000000c0: 1676 0500 1676 0500  .v...v..
000000c8: 0002 0000 bd00 0000  ........
000000d0: 0200 0000 fbfb 21ff  ......!.

000000d8: 7f45 4c46 0201 0100  .ELF....
000000e0: 0200 3e00 0d70 2840  ..>..p(@
000000e8: 0f1b f26d 1605 00e8  ...m....   ELF HEADER (again)
000000f0: 6d05 0013 01eb be7b  m......{
000000f8: 3800 0805 1c00 1b00  8.......
00000100: 060f 0527 9b90 27ec  ...'..'.
00000108: 4000 4007 c001 0008  @.@.....
....8<....


我的猜测是第二个ELF标头(始终位于0xd8的偏移量处)压缩的可执行文件。确实,当查看可执行文件的原始ELF标头(应用upx之前)时,我们发现:标头主要保留。因此,假设这只是原始ELF标头的简短版本。

但是,我想了解的是第一个标头的字段:

00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
00000010: 0200 3e00 0100 0000 7028 4000 0000 0000  ..>.....p(@.....
00000020: 4000 0000 0000 0000 e86d 0500 0000 0000  @........m......
00000030: 0000 0000 4000 3800 0800 4000 1c00 1b00  ....@.8...@.....
00000040: 0600 0000 0500 0000 4000 0000 0000 0000  ........@.......
00000050: 4000 4000 0000 0000 4000 4000 0000 0000  @.@.....@.@.....
00000060: c001 0000 0000 0000 c001 0000 0000 0000  ................
00000070: 0800 0000 0000 0000 0300 0000 0400 0000  ................
00000080: 0002 0000 0000 0000 0002 4000 0000 0000  ..........@.....


因此,我的问题是关于发现UPX标头字段的位置和含义。如果有人知道UPX的内部原理,将不胜感激。

评论

在同一目录中检出src / stub / src / include / linux.h(搜索UPX_MAGIC_LE32)和header.S。没有更多的时间进行调查,但是如果我是您,我将附加GDB并逐行逐步进行反汇编。

感谢您的提示,我真的迷失了这段代码!我将进行更深入的研究(如果没人敢在我之前这样做,请花点时间写下正确的答案;-))。

#1 楼

防止UPX工具解压缩UPX压缩文件非常容易。如果您查看源代码,将会看到它检查UPX_MAGIC_LE32中的魔术字符串p_lx_interp.cpp。因此,我只是将字符串(以二进制块形式)“ UPX!”的所有匹配项更改为“ AAA!”。我将/bin/ls(ELF64)复制到另一个文件夹,并包装了UPX。然后我像这样编辑它:

$ pyew ls
ELF Information
(...)
[0x00000000]> /s UPX # Search for the string UPX
HINT[0x000000b4]: UPX!........p...p...8.............!..ELF......>...E@..e....p
HINT[0x0000abcc]: UPX!.........S...USQRH..VH..H..1.1.H....P.....t.....H.......
HINT[0x0000ad3b]: UPX executable packer http://upx.sf.net $..$Id: UPX 3.07 Cop
HINT[0x0000ad6b]: UPX 3.07 Copyright (C) 1996-2010 the UPX Team. All Rights Re
HINT[0x0000ad90]: UPX Team. All Rights Reserved. $....^j._j.X..j._j....N...p...I.......
[0x00000000]> s 0xb4 # Seek to the specified offset in the file
[0x000000b4:0x000000b4]> edit # Open the file for editing
[0x000000b4:0x000000b4]> wx 414141 # Patch in hexadecimal
[0x000000b4:0x000000b4]> s 0xabcc
[0x0000abcc:0x0000abcc]> wx 414141
[0x0000abcc:0x0000abcc]> s 0xafe7
[0x0000afe7:0x0000afe7]> wx 414141
[0x0000afe7:0x0000afe7]> s 0xb3ac
[0x0000b3ac:0x0000b3ac]> wx 414141
[0x0000b3ac:0x0000b3ac]> q # And quit
$ ./ls
(...lots of files...)
$ upx -d ./ls
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2010
UPX 3.07        Markus Oberhumer, Laszlo Molnar & John Reiser   Sep 08th 2010
        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
upx: ls: NotPackedException: not packed by UPX

Unpacked 0 files.


就这样。无论如何,请记住,您只是在阻止此工具解压缩UPX压缩文件。 UPX是一种压缩器,任何具有包装工基本知识的人都可以轻松解压缩。

评论


我真的很惊讶它是如此简单...实际上,您的答案与问题并不完全匹配,但完全可以回答我的总体目标。所以,非常感谢!

–恐怖
2014年2月11日在10:13

这个答案恰好回应了我发布给您的旧问题的内容,只需将STRING UPX更改为XPX即可阻止upx -d正常工作

– blabb
2014年2月11日在18:37



有趣的是,他完全按照我们的建议操作了OP:阅读源代码。

–fileoffset
2014年2月13日下午5:13

#2 楼

回答您的上一个问题时,UPX是开源的,因此您可以阅读注释的代码来理解标题:http://upx.sourceforge.net/download/upx-3.91-src.tar.bz2

评论


首先,您的评论不是答案。其次,先前的答案并没有给出实现这一目标的任何实际方法,因为Ange的概念证明是针对UPX的PE格式完成的,我现在正在要求ELF格式。

–恐怖
2014年2月5日在20:40

我的回答是,您应该查看ELF专用UPX代码中的文档:)

–詹森·格夫纳(Jason Geffner)
2014年2月5日在21:10

我支持Jason:这似乎很简单,您所要做的就是阅读解压缩代码(特定于ELF)并找到一种方法来破解它。有什么比源代码更好的起点?

–fileoffset
2014年2月6日在6:15

@fileoffset:我感到恐惧。看,头文件甚至在问题中被提及。好像作者没有做功课。杰森(Jason)的评论没有回答问题,它告诉作者在一大堆(是,已评论)代码中找到答案。我认为Jason是RCE社区的一员,我在RE.SE甚至还没有成立之前就做了。但是,我希望这不会成为未来解决方案的标准。是的,反对者是我本人,但我从辩论和杰森自己的评论中得知,详细说明我为何反对者可能是有意义的。

– 0xC0000022L♦
2014年2月6日下午13:42

公平地说,这是一个反向工程论坛。这个问题甚至不需要反向工程,只需阅读源代码以及一些编码和测试即可。您不需要对开源软件进行逆向工程:)

–fileoffset
2014年2月7日,1:11