首页
社区
课程
招聘
[旧帖] [原创]初级UPX的脱壳 0.00雪花
发表于: 2009-9-18 23:25 2020

[旧帖] [原创]初级UPX的脱壳 0.00雪花

2009-9-18 23:25
2020
废话不多说,直接开始吧,虽然很简单,但是为了得到邀请码,还请会员给个面子,谢谢了!
先用PEID查一下壳 显示为UPX 0.89.6 - 1.02 / 1.05 - 2.90 (Delphi) stub -> Markus & Laszlo
一看是一个简单的压缩壳,非常容易脱!
用OD载入,入口代码如下:
00537240 > $  60            PUSHAD
00537241   .  BE 00E04C00   MOV ESI,Mp3Resiz.004CE000
00537246   .  8DBE 0030F3FF LEA EDI,DWORD PTR DS:[ESI+FFF33000]
0053724C   .  C787 9C7E0D00>MOV DWORD PTR DS:[EDI+D7E9C],58169BC8
00537256   .  57            PUSH EDI
00537257   .  83CD FF       OR EBP,FFFFFFFF
0053725A   .  EB 0E         JMP SHORT Mp3Resiz.0053726A

直接用ESP定律即是堆栈平衡定理查找OEP,至于为什么能用ESP定律找到OEP,我就简单说一下吧!比如说:
如果一个主函数要调用子函数,在执行主函数调用前的代码后,会把IP压栈,如果该子函数还要调用另一个函数,则会将期IP压栈,在执行完函数后,会返回第一个子函数的IP,接着才会返回主函数的IP,用代码表示即为:
pushad xxxxxx
pushfd  yyyyyy
......
popfd ******
Popad ******
......
来到OEP,代码如下:
00401494   /EB 10           JMP SHORT Mp3Resiz.004014A6
00401496   |66:623A         BOUND DI,DWORD PTR DS:[EDX]
00401499   |43              INC EBX
0040149A   |2B2B            SUB EBP,DWORD PTR DS:[EBX]
0040149C   |48              DEC EAX
0040149D   |4F              DEC EDI
0040149E   |4F              DEC EDI
0040149F   |4B              DEC EBX
004014A0   |90              NOP
004014A1  -|E9 98A04C00     JMP 008CB53E
004014A6   \A1 8BA04C00     MOV EAX,DWORD PTR DS:[4CA08B]
004014AB    C1E0 02         SHL EAX,2
004014AE    A3 8FA04C00     MOV DWORD PTR DS:[4CA08F],EAX
004014B3    52              PUSH EDX
004014B4    6A 00           PUSH 0
004014B6    E8 E1750C00     CALL Mp3Resiz.004C8A9C                   ; JMP 到 kernel32.GetModuleHandleA
004014BB    8BD0            MOV EDX,EAX
004014BD    E8 F2AF0B00     CALL Mp3Resiz.004BC4B4
004014C2    5A              POP EDX
004014C3    E8 50AF0B00     CALL Mp3Resiz.004BC418
004014C8    E8 27B00B00     CALL Mp3Resiz.004BC4F4
004014CD    6A 00           PUSH 0
004014CF    E8 5CC40B00     CALL Mp3Resiz.004BD930
从入口看应该是BC++的程序。
用lordpe脱壳,选择完全脱壳就行! 
 脱壳完成后用ImportREC修复一下,这一个需要修改一下RVA以及其大小
具体方法是,跟入004014B6    E8 E1750C00     CALL Mp3Resiz.004C8A9C                   这一个CAll,来到RVA代码最上端,找到DS:[4E010C]段寄存器的值,即4E010C,然后向下翻,来到最低端,找到DS:[4E0EE8],扩充一下,就填4E0100,大小为DE0,点击GETimport
然后修复已脱壳的软件!
004C8988  - FF25 0C014E00   JMP DWORD PTR DS:[4E010C]                ; ADVAPI32.RegCloseKey
004C898E  - FF25 10014E00   JMP DWORD PTR DS:[4E0110]                ; ADVAPI32.RegCreateKeyExA
004C8994  - FF25 14014E00   JMP DWORD PTR DS:[4E0114]                ; ADVAPI32.RegFlushKey
004C899A  - FF25 18014E00   JMP DWORD PTR DS:[4E0118]                ; ADVAPI32.RegOpenKeyExA
004C89A0  - FF25 1C014E00   JMP DWORD PTR DS:[4E011C]                ; ADVAPI32.RegQueryValueExA
004C89A6  - FF25 20014E00   JMP DWORD PTR DS:[4E0120]                ; ADVAPI32.RegSetValueExA
004C89AC  - FF25 F4024E00   JMP DWORD PTR DS:[4E02F4]                ; kernel32.CloseHandle
004C89B2  - FF25 F8024E00   JMP DWORD PTR DS:[4E02F8]                ; kernel32.CompareStringA
004C89B8  - FF25 FC024E00   JMP DWORD PTR DS:[4E02FC]                ; kernel32.CreateEventA
004C89BE  - FF25 00034E00   JMP DWORD PTR DS:[4E0300]                ; kernel32.CreateFileA
004C89C4  - FF25 04034E00   JMP DWORD PTR DS:[4E0304]                ; kernel32.CreateFileW
......
......
......
004C9388  - FF25 BC0E4E00   JMP DWORD PTR DS:[4E0EBC]                ; OLEAUT32.SafeArrayGetUBound
004C938E  - FF25 C00E4E00   JMP DWORD PTR DS:[4E0EC0]                ; OLEAUT32.SafeArrayPtrOfIndex
004C9394  - FF25 C40E4E00   JMP DWORD PTR DS:[4E0EC4]                ; OLEAUT32.SafeArrayPutElement
004C939A  - FF25 C80E4E00   JMP DWORD PTR DS:[4E0EC8]                ; OLEAUT32.SafeArrayRedim
004C93A0  - FF25 CC0E4E00   JMP DWORD PTR DS:[4E0ECC]                ; OLEAUT32.SysAllocStringLen
004C93A6  - FF25 D00E4E00   JMP DWORD PTR DS:[4E0ED0]                ; OLEAUT32.SysFreeString
004C93AC  - FF25 D40E4E00   JMP DWORD PTR DS:[4E0ED4]                ; OLEAUT32.SysReAllocStringLen
004C93B2  - FF25 D80E4E00   JMP DWORD PTR DS:[4E0ED8]                ; OLEAUT32.VariantChangeType
004C93B8  - FF25 DC0E4E00   JMP DWORD PTR DS:[4E0EDC]                ; OLEAUT32.VariantClear
004C93BE  - FF25 E00E4E00   JMP DWORD PTR DS:[4E0EE0]                ; OLEAUT32.VariantCopy
004C93C4  - FF25 E40E4E00   JMP DWORD PTR DS:[4E0EE4]                ; OLEAUT32.VariantCopyInd
004C93CA  - FF25 E80E4E00   JMP DWORD PTR DS:[4E0EE8]                ; OLEAUT32.VariantInit
试运行一下,可以知道软件可以执行!再用PEID查一下,果然是BC++的!Borland C++ 1999
好了,到此为止,由于是第一次写文章,文字组织的不好,还请各位见谅!

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 93
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
如果一个主函数要调用子函数,在执行主函数调用前的代码后,会把IP压栈,如果该子函数还要调用另一个函数,则会将期IP压栈,在执行完函数后,会返回第一个子函数的IP,接着才会返回主函数的IP,用


会将期IP压栈,这个ip是哪个呢,不了解
2009-9-19 11:21
0
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
额,实话说,我都没脱过UPX(实在是懒得脱,脱壳方面我是能简则简)

略过了
2009-9-19 11:36
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
哈哈!是吗?我也懒得脱啊!
2009-9-19 13:12
0
游客
登录 | 注册 方可回帖
返回
//