首页
论坛
课程
招聘
[原创]linux 下 upx 脱壳笔记
2008-12-20 13:57 17891

[原创]linux 下 upx 脱壳笔记

2008-12-20 13:57
17891
linux很少有需要crack的软件,所以最近总是自娱自乐。自己写的软件自己破着玩但是由于都是知道自己的手段,没有什么意思。真的希望有高手们写些crackme for linux 。
最近看了看windows的脱壳大致的理解了脱壳的原理,之前没有怎么接触脱壳,通常只是选择没有壳的软件看看。在linux下的壳没有找到几个。只找到了一个upx的壳,在windows下是个弱壳。实际上在linux下面也是弱壳,完全可以使用"upx -d"的命令解决问题。但我总是喜欢自己手动的。呵呵....纯属于自娱自乐。
ok,开始我们的linux的upx的脱壳之旅.........
我在选择工具的时候花了很多时间,忽然发现GDB在upx面前是那么的苍白无力...也终于知道为什么有人说GDB不适合做逆向了...虽然软件在调试器里可以正常于运行,正常下断。但是根本无法查看反汇编的代码.......。
无奈无奈....使用传说中最好的工具 IDA 为此我特地简单的学习了一下IDC脚本的使用方法...
没有什么资料可以参考,是一件很不愉快的事情,因为不知道能不能成功。不管了,一步一步来吧...
我用“upx -d“ 脱出了原来的文件,发现文件是全的,没有任何部分丢失,所以我相信这些文件会出现在进程空间的某个时间的某个角落,这个很大的坚定了我手动脱壳的信心(但是实际上到这篇文章的结尾我也没有能够在找到完整的程序文件,但我相信理论上内存空间中应该会出现完整的文件的...)。

我的加壳软件是我上次文章中用到做外挂的mines(扫雷游戏)。先找到了upx-3.03-i386_linux 软件 附件中我会给出的免的度这篇文章的人去寻找了。
对我们目标软件加壳,命令如下,的确是个好用的压缩壳软件,直接有54%的压缩律。
[jun@beijihuCom dumpupx]$ ./upx mines
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2008
UPX 3.03        Markus Oberhumer, Laszlo Molnar & John Reiser   Apr 27th 2008

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
     13960 ->      7556   54.13%  linux/elf386   mines                         

Packed 1 file.
[jun@beijihuCom dumpupx]$ 



好了,我们开始调试他了,加了壳以后,一般的调试软件已经对他无能为力了...
实验一下GDB 和 DDD 的效果...以及objdump
readelf还可以正常使用,(仅限于一部分功能.呵呵,不详谈了...)
[jun@beijihuCom dumpupx]$ readelf -e ./mines
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 03 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - Linux
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Intel 80386
  Version:                           0x1
  Entry point address:               0xc02598
  Start of program headers:          52 (bytes into file)
  Start of section headers:          0 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         2
  Size of section headers:           40 (bytes)
  Number of section headers:         0
  Section header string table index: 0

There are no sections in this file.

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000000 0x00c01000 0x00c01000 0x01d60 0x01d60 R E 0x1000
  LOAD           0x0002fc 0x0804b2fc 0x0804b2fc 0x00000 0x00000 RW  0x1000


上面的输出,我们可以发现他的入口点是0xc02598 这个入口点已经和GCC编译出来的程序大不一样了。实际上重“upx -d“脱出来的效果来看,原来的入口点基本上是不会改变的,也就是说我们的手动脱壳的时候软件的入口点,加载方式都是和未加壳的软件是一样的...这一点又为我们的脱壳成功,增加了砝码..
继续....gdb 调试一下
(gdb) b *0xc02598
Breakpoint 1 at 0xc02598
(gdb) r
Starting program: /home/jun/Crack/dumpupx/mines 
warning: shared library handler failed to enable breakpoint
(no debugging symbols found)

Breakpoint 1, 0x00c02598 in ?? ()
(gdb) disassemble
No function contains program counter for selected frame.
(gdb) 



gdb看不反汇编代码,晕了都不知道下一步的操作是什么....看来是没有什么用了
祭起传说中的逆向利器IDA.学西习了一下,简单操作,我开始了调试之旅.
[jun@beijihuCom dumpupx]$ idal ./mines

等到加载完成,会停在入口处,呵呵在光标在call上直接按F4,程序运行,停到了入口出

单步运行...实际上我没有什么办法,不知道有什么下好的方法下断点,可以使这个简单方法调试...
这边我是这么想的,upx是压缩壳,当他把执行权交给原目标程序的时候,必定会有一个大的跳转,好多新手在windows脱壳,都是以这个为oep的标准的。linux应该也不会例外的...
F8单步到0xc025c8 跳到 oxc025d1 在 0xc025d3 又会跳回来。显然是个循环。不在循环里浪费时间了。我们向下找找,下面有个retn返回。光标移到上面F4。实际上没有什么把握。只是蒙的,结果很好,没有飞走.F8单步到了这里

继续单步,retn到一个地方

不详细分析了往下看。翻阿翻,不会这么巧吧.看见了 jmp dword ptr [edi]跳转,这不会是传说中的大跳吧。

不管直接F4到这里...哈哈很成功。
单步一下,跳到了这里。

不懂代码的具体含义,但是明显不是程序的入口...为什么?单步....继续

看到这里我忽然顿悟,这里是在做ld连接,不能让他运行了,很可能是为了我们目标程序的运行进行共享库的连接..会修改我们内存中的映像文件。这样我们dump出来的就不是原来的干净程序,因为我们没有修复工具,比起windows里面的PE修复要麻烦多了.....所以赶紧dump出来...
用来dump映像的idc脚本
#include <idc.idc>
#define PT_LOAD              1

#define PT_DYNAMIC           2
static main(void)
{
	auto ImageBase,StartImg,EndImg;//基址 08048000
	auto e_phoff;
	auto e_phnum,p_offset;//paddr 0xc 地址,pmemsz ox14大小,p_offset 0x4
	auto i,dumpfile;
    ImageBase=0x08048000;
	StartImg=0x08048000;
	EndImg=0x0;	
	Message("%8x\n",Dword(ImageBase));
	if (Dword(ImageBase)==0x7f454c46 || Dword(ImageBase)==0x464c457f )
	{
		if(dumpfile=fopen("./dumpfile","w+"))
		{
			e_phoff=ImageBase+Word(ImageBase+0x1c);
			e_phnum=Word(ImageBase+0x2c);
			for(i=0;i<e_phnum;i++)
			{
				 if (Dword(e_phoff)==PT_LOAD || Dword(e_phoff)==PT_DYNAMIC)
					
					{	p_offset=Dword(e_phoff+0x4);				
						StartImg=Dword(e_phoff+0xc);
						EndImg=Dword(e_phoff+0xc)+Dword(e_phoff+0x14);
							
								dump(dumpfile,StartImg,EndImg,p_offset);
								Message("dump LOAD%d ok.\n",i);
					}		
					
				e_phoff=e_phoff+0x20;
			}
			fseek(dumpfile,0x30,0);
			fputc(0x00,dumpfile);		
			fputc(0x00,dumpfile);		
			fputc(0x00,dumpfile);		
			fputc(0x00,dumpfile);
			fclose(dumpfile);
		}else Message("dump err.");
	}

}
static dump(dumpfile,startimg,endimg,offset) 
{
	auto i;
	auto size;
	size=endimg-startimg;
	fseek(dumpfile,offset,0);
		for ( i=0; i < size; i=i+1 ) 
		{
			fputc(Byte(startimg+i),dumpfile);
		}
}

改变文件的属性,让他可以运行。
[jun@beijihuCom dumpupx]$ su
口令:
[root@beijihuCom dumpupx]# chmod 755 ./dumpfile
[root@beijihuCom dumpupx]# ./dumpfile


程序运行的很好..

总结:第一次在linux下手动脱壳,看上去文章中写的很轻松,实际上在之前做了很多工作。包括ELF的加载等等。还有我发现如果程序的节表头程序也能很好的运行,什么的..
另外,我之调试的时候,实际经过很多挫折...没有足够的经验嘛...不过些文章,截图的时候都很顺利..呵呵.共勉........

[招生]科锐逆向工程师培训46期预科班将于 2023年02月09日 正式开班

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (16)
雪    币: 2273
活跃值: 活跃值 (26)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
北极狐狸 活跃值 7 2008-12-20 14:01
2
0
图片上焦点不清楚,大家联系截图的上下文看看。有条件的可以调试一下就可以看清楚图片的内容..截图处理的不是很好.... 见谅
雪    币: 202
活跃值: 活跃值 (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
newjueqi 活跃值 7 2008-12-20 17:39
3
0
linux下的东西很吸引人啊!!!
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
orchidor 活跃值 2008-12-20 17:52
4
0
想用GDB反汇编的,找不到程序入口,发现真的很难
雪    币: 127
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
greatbob 活跃值 2008-12-20 18:35
5
0
学习了!
idal 我一直没安装成功,郁闷哦。。是不是需要什么图形开发包。
现在只好集中精力研究GDB和DDD了,希望找到好的分析方法
雪    币: 2273
活跃值: 活跃值 (26)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
北极狐狸 活跃值 7 2008-12-20 19:53
6
0
如网上所说,gdb确实不适合做逆向...普通代源的软件用它调试是很好。
关于IDA linux 安装,他的图形功能我于一直没有用上,但是其他功能是不需要X-windows 支持的。控制台就可以运行了.....
雪    币: 190
活跃值: 活跃值 (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
muwanqing 活跃值 2008-12-20 20:06
7
0
就是缺少像OD这样的动态调试工具   以前倒是找到一个  代码太老了 没编译通过
雪    币: 2273
活跃值: 活跃值 (26)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
北极狐狸 活跃值 7 2008-12-21 13:59
8
0
有嘛?放出来啊....呵呵...
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
aredfox 活跃值 2009-6-19 16:31
9
0
受益匪浅!十分感谢,用了一下,这个脚本好像对于变种upx也好用。
雪    币: 116
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hackisle 活跃值 2009-8-13 22:48
10
0
不是gdb不能反,而是方法不对

用x/100i 0x00c02598
雪    币: 433
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
blueeagle 活跃值 2010-11-9 20:40
11
0
受益了,最近想要解决一个ELF的程序。正在筹划中。
雪    币: 8904
活跃值: 活跃值 (1670)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xie风腾 活跃值 2013-4-1 15:43
12
0

请问Linux里难到就只有一个UPX壳吗
雪    币: 2273
活跃值: 活跃值 (26)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
北极狐狸 活跃值 7 2013-4-26 15:32
13
0
不知道,你可以找找。
雪    币: 8904
活跃值: 活跃值 (1670)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xie风腾 活跃值 2013-4-30 11:43
14
0
不是找不到,是没有
想有偿请人写个
雪    币: 110
活跃值: 活跃值 (208)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ling林 活跃值 2014-2-24 20:54
15
0
fseek(dumpfile,0x30,0);
      fputc(0x00,dumpfile);   
      fputc(0x00,dumpfile);   
      fputc(0x00,dumpfile);   
      fputc(0x00,dumpfile);   
为什么这几个字节要写0?
雪    币: 205
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
南阳之星 活跃值 2018-7-19 04:59
16
0
哈哈 学习了。
雪    币: 101
活跃值: 活跃值 (810)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
考拉 活跃值 2019-5-30 15:58
17
0
mark
雪    币: 2481
活跃值: 活跃值 (99)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
s3139701 活跃值 2019-10-20 14:49
18
0
能问下楼主的linux版本吗 我用centos编译 dump.idc 老是报错
游客
登录 | 注册 方可回帖
返回