linux 逆向?Linux模拟器

linux里文件如何进行文件脱壳

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]$Content$nbsp;./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]$Content$nbsp;

好了,我们开始调试他了,加了壳以后,一般的调试软件已经对他无能为力了...

实验一下GDB和 DDD的效果...以及objdump

readelf还可以正常使用,(仅限于一部分功能.呵呵,不详谈了...)

代码:

[jun@beijihuCom dumpupx]$Content$nbsp;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]$Content$nbsp;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]$Content$nbsp;su

口令:

[root@beijihuCom dumpupx]# chmod 755./dumpfile

[root@beijihuCom dumpupx]#./dumpfile

程序运行的很好..

总结:第一次在linux下手动脱壳,看上去文章中写的很轻松,实际上在之前做了很多工作。包括ELF的加载等等。还有我发现如果程序的节表头程序也能很好的运行,什么的..

另外,我之调试的时候,实际经过很多挫折...没有足够的经验嘛...不过些文章,截图的时候都很顺利..呵呵.共勉........

linux常用命令有哪些

linux常用命令有pwd命令、cd命令、ls命令、cat命令、grep命令、touch命令、cp命令、mv命令、rm命令、rmdir命令等。

linux常用命令:

1、 pwd命令

该命令的英文解释为print working directory(打印工作目录)。输入pwd命令,Linux会输出当前目录。

2、 cd命令

cd命令用来改变所在目录。

cd/转到根目录中

cd~转到/home/user用户目录下

cd/usr转到根目录下的usr目录中-------------绝对路径

cd test转到当前目录下的test子目录中-------相对路径

3、 ls命令

ls命令用来查看目录的内容。选项含义-a列举目录中的全部文件,包括隐藏文件-l列举目录中的细节,包括权限、所有者、组群、大小、创建日期、文件是否是链接等-f列举的文件显示文件类型-r逆向,从后向前地列举目录中内容-R递归,该选项递归地列举当前目录下所有子目录内的内容-s大小,按文件大小排序-h以人类可读的方式显示文件的大小,如用K、M、G作单位 ls-l examples.doc列举文件examples.doc的所有信息

4、 cat命令

cat命令可以用来合并文件,也可以用来在屏幕上显示整个文件的内容。

cat snow.txt该命令显示文件snow.txt的内容,ctrl+D退出cat。

5、 grep命令

grep命令的最大功能是在一堆文件中查找一个特定的字符串。

grep money test.txt

以上命令在test.txt中查找money这个字符串,grep查找是区分大小写的。

6、touch命令

touch命令用来创建新文件,他可以创建一个空白的文件,可以在其中添加文本和数据。

touch newfile该命令创建一个名为newfile的空白文件。

7、cp命令

cp命令用来拷贝文件,要复制文件,输入命令:

cp

cp t.txt Document/t该命令将把文件t.txt复制到Document目录下,并命名为t。选项含义-i互动:如果文件将覆盖目标中的文件,他会提示确认-r递归:这个选项会复制整个目录树、子目录以及其他-v详细:显示文件的复制进度

8、mv命令

mv命令用来移动文件。选项说明-i互动:如果选择的文件会覆盖目标中的文件,他会提示确认-f强制:它会超越互动模式,不提示地移动文件,属于很危险的选项-v详细:显示文件的移动进度

mv t.txt Document把文件t.txt移动到目录Document中。

9、rm命令

rm命令用来删除文件。选项说明-i互动:提示确认删除-f强制:代替互动模式,不提示确认删除-v详细:显示文件的删除进度-r递归:将删除某个目录以及其中所有的文件和子目录

rm t.txt该命令删除文件t.txt

10、 rmdir命令

rmdir命令用来删除目录。

linux怎么配置逆向解析文件

1.可重定位文件(Relocatable File),这类文件包含了代码和数据,可以被用来链接成可执行文件或共享目标文件,静态链接库也可以归为这一类,如.o文件。

2.可执行文件(Executable File),这类文件包含了直接执行的程序,如/bin/bash等。

3.共享目标文件(Shared Object File),链接器可以使用这种文件跟其他的可重定位文件和共享目标文件链接,产生新的目标文件;动态链接器可以将几个共享目标文件与可执行文件结合,作为进程映像的一部分来运行,如glibc***.so。

4.核心转储文件(Core Dump File),当进程意外终止时,系统可以将该进程的地址空间内容及终止时的一些其他信息转储到核心转储文件。

阅读剩余
THE END