废话不多说,直接开始吧,虽然很简单,但是为了得到邀请码,还请会员给个面子,谢谢了!
先用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 探索篇!