-
UID:17777
-
- 注册时间2007-05-02
- 最后登录2025-05-02
- 在线时间18634小时
-
- 发帖786294
- 搜Ta的帖子
- 精华0
- 飞翔币209891
- 威望215717
- 飞扬币2613068
- 信誉值8
-
访问TA的空间加好友用道具
- 发帖
- 786294
- 飞翔币
- 209891
- 威望
- 215717
- 飞扬币
- 2613068
- 信誉值
- 8
|
静态数据- md5 复制代码 隐藏代码md5,9C5C27494C28ED0B14853B346B113145sha1,290AB6F431F46547DB2628C494CE615D6061CEB8sha256,7983A582939924C70E3DA2DA80FD3352EBC90DE7B8C4C427D484FF4F050F0AEC
- 有壳 复制代码 隐藏代码signature,FSG 1.00 (Eng) -> dulek/xt
脱壳
寻找OEP
- 发现导入表里面有GetProcAddress,下断点,运行后发现这段代码: 复制代码 隐藏代码004050C4 47 inc edi004050C5 8B37 mov esi, dword ptr [edi]004050C7 AF scas dword ptr es:[edi]004050C8 57 push edi004050C9 FF13 call dword ptr [ebx]004050CB 95 xchg eax, ebp004050CC 33C0 xor eax, eax004050CE AE scas byte ptr es:[edi]004050CF ^ 75 FD jnz short 004050CE004050D1 FE0F dec byte ptr [edi]004050D3 ^ 74 EF je short 004050C4004050D5 FE0F dec byte ptr [edi]004050D7 75 06 jnz short 004050DF004050D9 47 inc edi004050DA FF37 push dword ptr [edi]004050DC AF scas dword ptr es:[edi]004050DD EB 09 jmp short 004050E8004050DF FE0F dec byte ptr [edi]004050E1 >- 0F84 A9BFFFFF je 00401090004050E7 57 push edi004050E8 55 push ebp004050E9 FF53 04 call dword ptr [ebx+4] ; GetProcAddress004050EC 0906 or dword ptr [esi], eax ; ole32.OleInitialize004050EE AD lods dword ptr [esi]004050EF ^ 75 DB jnz short 004050CC
- 发现这是一个循环,猜测是建立导入表,接着观察几个jmp jz jnz je跳转指令,发现下面的je最像tail jump 复制代码 隐藏代码004050E1 >- 0F84 A9BFFFFF je 00401090
- 执行到疑似OEP(00401090),发现OD还没分析,选择analyze->analyze code,发现如下代码,应该就是OEP了: 复制代码 隐藏代码00401090 /. 55 push ebp ; msvcrt.7765000000401091 |. 8BEC mov ebp, esp00401093 |. 6A FF push -100401095 |. 68 78204000 push 004020780040109A |. 68 D0114000 push 004011D0 ; jmp to msvcrt._except_handler3; SE handler installation0040109F |. 64:A1 0000000>mov eax, dword ptr fs:[0]004010A5 |. 50 push eax004010A6 |. 64:8925 00000>mov dword ptr fs:[0], esp004010AD |. 83EC 20 sub esp, 20
- dump进程。
重建输入表
- 试了一下工具imprec,不行,只能手工重建了。
- 用OD打开原程序,在GetProcAddress上下断点,再用IDA打开脱壳后的程序,找到函数地址表。
- 运行OD,在IDA的每个函数地址上对应写入OD里面的函数名,完成后差不多这样: 复制代码 隐藏代码seg000:004011DC 00 00 00 00 00 00 00 00+ align 1000hseg000:00402000 ; int _getmainargsseg000:00402000 50 5C 68 77 __getmainargs dd 77685C50h ; DATA XREF: start+B5↑rseg000:00402004 ; unsigned int controlfpseg000:00402004 C0 9F 6E 77 _controlfp dd 776E9FC0h ; DATA XREF: j__controlfp↑rseg000:00402008 E4 81 6A 77 _except_handler3 dd 776A81E4h ; DATA XREF: j__except_handler3↑rseg000:0040200C 00 76 6A 77 __set_app_type dd 776A7600h ; DATA XREF: start+2C↑rseg000:00402010 B0 5D 68 77 __p__fmode dd 77685DB0h ; DATA XREF: start+41↑rseg000:00402014 60 5D 68 77 __p__commode dd 77685D60h ; DATA XREF: start+4F↑rseg000:00402018 ; void __cdecl __noreturn exit(int)seg000:00402018 10 61 6B 77 _exit dd 776B6110h ; DATA XREF: start+10A↑rseg000:0040201C 40 4C 6A 77 _XcptFilter dd 776A4C40h ; DATA XREF: j__XcptFilter↑rseg000:00402020 F0 66 6B 77 exit dd 776B66F0h ; DATA XREF: start+EA↑rseg000:00402024 D0 5C 68 77 __p__initenv dd 77685CD0h ; DATA XREF: start+CA↑rseg000:00402028 C0 64 6B 77 _initterm dd 776B64C0h ; DATA XREF: j__initterm↑rseg000:0040202C 40 85 6E 77 __setusermatherr dd 776E8540h ; DATA XREF: start+7C↑rseg000:00402030 E4 6B 70 77 _adjust_fdiv dd 77706BE4h ; DATA XREF: start+5D↑rseg000:00402034 00 00 00 00 align 8seg000:00402038 70 41 D4 76 dword_402038 dd 76D44170h ; DATA XREF: _main+36↑rseg000:0040203C ; BSTR __stdcall SysAllocString(const OLECHAR *)seg000:0040203C 10 E2 D4 76 SysAllocString dd 76D4E210h ; DATA XREF: _main+50↑rseg000:00402040 ; void __stdcall SysFreeString(BSTR)seg000:00402040 80 E8 D4 76 SysFreeString dd 76D4E880h ; DATA XREF: _main+78↑rseg000:00402044 00 00 00 00 align 8seg000:00402048 ; HRESULT __stdcall OleInitialize(LPVOID pvReserved)seg000:00402048 40 2E FA 74 OleInitialize dd 74FA2E40h ; DATA XREF: _main+5↑rseg000:0040204C ; HRESULT __stdcall CoCreateInstance(const CLSID *const rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, const IID *const riid, LPVOID *ppv)seg000:0040204C 70 30 A1 74 CoCreateInstance dd 74A13070h ; DATA XREF: _main+22↑rseg000:00402050 ; void __stdcall OleUninitialize()seg000:00402050 60 33 FA 74 OleUninitialize dd 74FA3360h ; DATA XREF: _main:loc_40107F↑rseg000:00402054 00 00 00 00 align 8
- 这个过程很慢且麻烦,但我没想到其他更好的办法。。。
IDA 分析
- 脱壳后很简单了,从main进去,发现用的COM: 复制代码 隐藏代码lea eax, [esp+24h+ppv]push eaxpush offset riid_IWebBrowser2push 4 ; CLSCTX_LOCAL_SERVER = 0x4push 0push offset clsid_ie ; 2DF01hcall CoCreateInstance
- 逐条分析发现其会使用Navigate函数通过IE打开指定链接: 复制代码 隐藏代码lea ecx, [esp+24h+var_20]push esipush ecxcall dword_402038push offset aHttpWwwMalware ; "http://www.malwareanalysisbook.com/ad.h"...mov [esp+2Ch+var_10], 3mov [esp+2Ch+var_8], 1call SysAllocStringlea ecx, [esp+28h+var_20]mov esi, eax ; esi = newStringmov eax, [esp+28h+ppv]push ecxlea ecx, [esp+2Ch+var_20]mov edx, [eax]push ecxlea ecx, [esp+30h+var_20]push ecxlea ecx, [esp+34h+var_10]push ecxpush esipush eaxcall dword ptr [edx+2Ch] ; Navigatepush esicall SysFreeStringpop esi
总 结
这个lab的整个过程中,重建输入表比较麻烦,不知道有没有更好的方法。该程序行为很简单,就是打开了指定的网页。
|