linux 下 upx 脱壳笔记
生活随笔
收集整理的這篇文章主要介紹了
linux 下 upx 脱壳笔记
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
linux很少有需要crack的軟件,所以最近總是自娛自樂。自己寫的軟件自己破著玩但是由于都是知道自己的手段,沒有什么意思。真的希望有高手們寫些crackme for linux 。
最近看了看windows的脫殼大致的理解了脫殼的原理,之前沒有怎么接觸脫殼,通常只是選擇沒有殼的軟件看看。在linux下的殼沒有找到幾個。只找到了一個upx的殼,在windows下是個弱殼。實際上在linux下面也是弱殼,完全可以使用"upx -d"的命令解決問題。但我總是喜歡自己手動的。呵呵....純屬于自娛自樂。
ok,開始我們的linux的upx的脫殼之旅.........
我在選擇工具的時候花了很多時間,忽然發(fā)現(xiàn)GDB在upx面前是那么的蒼白無力...也終于知道為什么有人說GDB不適合做逆向了...雖然軟件在調(diào)試器里可以正常于運行,正常下斷。但是根本無法查看反匯編的代碼.......。
無奈無奈....使用傳說中最好的工具 IDA 為此我特地簡單的學習了一下IDC腳本的使用方法...
沒有什么資料可以參考,是一件很不愉快的事情,因為不知道能不能成功。不管了,一步一步來吧...
我用“upx -d“ 脫出了原來的文件,發(fā)現(xiàn)文件是全的,沒有任何部分丟失,所以我相信這些文件會出現(xiàn)在進程空間的某個時間的某個角落,這個很大的堅定了我手動脫殼的信心(但是實際上到這篇文章的結(jié)尾我也沒有能夠在找到完整的程序文件,但我相信理論上內(nèi)存空間中應該會出現(xiàn)完整的文件的...)。 我的加殼軟件是我上次文章中用到做外掛的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]$
好了,我們開始調(diào)試他了,加了殼以后,一般的調(diào)試軟件已經(jīng)對他無能為力了...
實驗一下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
上面的輸出,我們可以發(fā)現(xiàn)他的入口點是0xc02598 這個入口點已經(jīng)和GCC編譯出來的程序大不一樣了。實際上重“upx -d“脫出來的效果來看,原來的入口點基本上是不會改變的,也就是說我們的手動脫殼的時候軟件的入口點,加載方式都是和未加殼的軟件是一樣的...這一點又為我們的脫殼成功,增加了砝碼..
繼續(xù)....gdb 調(diào)試一下 代碼:
(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.學西習了一下,簡單操作,我開始了調(diào)試之旅. 代碼:
[jun@beijihuCom dumpupx]$ idal ./mines
等到加載完成,會停在入口處,呵呵在光標在call上直接按F4,程序運行,停到了入口出 單步運行...實際上我沒有什么辦法,不知道有什么下好的方法下斷點,可以使這個簡單方法調(diào)試...
這邊我是這么想的,upx是壓縮殼,當他把執(zhí)行權(quán)交給原目標程序的時候,必定會有一個大的跳轉(zhuǎn),好多新手在windows脫殼,都是以這個為oep的標準的。linux應該也不會例外的...
F8單步到0xc025c8 跳到 oxc025d1 在 0xc025d3 又會跳回來。顯然是個循環(huán)。不在循環(huán)里浪費時間了。我們向下找找,下面有個retn返回。光標移到上面F4。實際上沒有什么把握。只是蒙的,結(jié)果很好,沒有飛走.F8單步到了這里 繼續(xù)單步,retn到一個地方 不詳細分析了往下看。翻阿翻,不會這么巧吧.看見了 jmp dword ptr [edi]跳轉(zhuǎn),這不會是傳說中的大跳吧。 不管直接F4到這里...哈哈很成功。
單步一下,跳到了這里。 不懂代碼的具體含義,但是明顯不是程序的入口...為什么?單步....繼續(xù) 看到這里我忽然頓悟,這里是在做ld連接,不能讓他運行了,很可能是為了我們目標程序的運行進行共享庫的連接..會修改我們內(nèi)存中的映像文件。這樣我們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
程序運行的很好.. 總結(jié):第一次在linux下手動脫殼,看上去文章中寫的很輕松,實際上在之前做了很多工作。包括ELF的加載等等。還有我發(fā)現(xiàn)如果程序的節(jié)表頭程序也能很好的運行,什么的..
另外,我之調(diào)試的時候,實際經(jīng)過很多挫折...沒有足夠的經(jīng)驗嘛...不過些文章,截圖的時候都很順利..呵呵.共勉........
最近看了看windows的脫殼大致的理解了脫殼的原理,之前沒有怎么接觸脫殼,通常只是選擇沒有殼的軟件看看。在linux下的殼沒有找到幾個。只找到了一個upx的殼,在windows下是個弱殼。實際上在linux下面也是弱殼,完全可以使用"upx -d"的命令解決問題。但我總是喜歡自己手動的。呵呵....純屬于自娛自樂。
ok,開始我們的linux的upx的脫殼之旅.........
我在選擇工具的時候花了很多時間,忽然發(fā)現(xiàn)GDB在upx面前是那么的蒼白無力...也終于知道為什么有人說GDB不適合做逆向了...雖然軟件在調(diào)試器里可以正常于運行,正常下斷。但是根本無法查看反匯編的代碼.......。
無奈無奈....使用傳說中最好的工具 IDA 為此我特地簡單的學習了一下IDC腳本的使用方法...
沒有什么資料可以參考,是一件很不愉快的事情,因為不知道能不能成功。不管了,一步一步來吧...
我用“upx -d“ 脫出了原來的文件,發(fā)現(xiàn)文件是全的,沒有任何部分丟失,所以我相信這些文件會出現(xiàn)在進程空間的某個時間的某個角落,這個很大的堅定了我手動脫殼的信心(但是實際上到這篇文章的結(jié)尾我也沒有能夠在找到完整的程序文件,但我相信理論上內(nèi)存空間中應該會出現(xiàn)完整的文件的...)。 我的加殼軟件是我上次文章中用到做外掛的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]$
好了,我們開始調(diào)試他了,加了殼以后,一般的調(diào)試軟件已經(jīng)對他無能為力了...
實驗一下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
上面的輸出,我們可以發(fā)現(xiàn)他的入口點是0xc02598 這個入口點已經(jīng)和GCC編譯出來的程序大不一樣了。實際上重“upx -d“脫出來的效果來看,原來的入口點基本上是不會改變的,也就是說我們的手動脫殼的時候軟件的入口點,加載方式都是和未加殼的軟件是一樣的...這一點又為我們的脫殼成功,增加了砝碼..
繼續(xù)....gdb 調(diào)試一下 代碼:
(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.學西習了一下,簡單操作,我開始了調(diào)試之旅. 代碼:
[jun@beijihuCom dumpupx]$ idal ./mines
等到加載完成,會停在入口處,呵呵在光標在call上直接按F4,程序運行,停到了入口出 單步運行...實際上我沒有什么辦法,不知道有什么下好的方法下斷點,可以使這個簡單方法調(diào)試...
這邊我是這么想的,upx是壓縮殼,當他把執(zhí)行權(quán)交給原目標程序的時候,必定會有一個大的跳轉(zhuǎn),好多新手在windows脫殼,都是以這個為oep的標準的。linux應該也不會例外的...
F8單步到0xc025c8 跳到 oxc025d1 在 0xc025d3 又會跳回來。顯然是個循環(huán)。不在循環(huán)里浪費時間了。我們向下找找,下面有個retn返回。光標移到上面F4。實際上沒有什么把握。只是蒙的,結(jié)果很好,沒有飛走.F8單步到了這里 繼續(xù)單步,retn到一個地方 不詳細分析了往下看。翻阿翻,不會這么巧吧.看見了 jmp dword ptr [edi]跳轉(zhuǎn),這不會是傳說中的大跳吧。 不管直接F4到這里...哈哈很成功。
單步一下,跳到了這里。 不懂代碼的具體含義,但是明顯不是程序的入口...為什么?單步....繼續(xù) 看到這里我忽然頓悟,這里是在做ld連接,不能讓他運行了,很可能是為了我們目標程序的運行進行共享庫的連接..會修改我們內(nèi)存中的映像文件。這樣我們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
程序運行的很好.. 總結(jié):第一次在linux下手動脫殼,看上去文章中寫的很輕松,實際上在之前做了很多工作。包括ELF的加載等等。還有我發(fā)現(xiàn)如果程序的節(jié)表頭程序也能很好的運行,什么的..
另外,我之調(diào)試的時候,實際經(jīng)過很多挫折...沒有足夠的經(jīng)驗嘛...不過些文章,截圖的時候都很順利..呵呵.共勉........
轉(zhuǎn)載于:https://blog.51cto.com/yueyuanyuan/352885
總結(jié)
以上是生活随笔為你收集整理的linux 下 upx 脱壳笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Console类浅谈
- 下一篇: .net反编译软件简绍