- UID
- 31120
注册时间2007-5-1
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
参考:天草中级班第十四课
armadillo主题贴第一页4楼千里之外的贴
三人行的五个脱壳贴
Arm4.xx CopyMeM2 and Debug Blocker
关键字:armadillo copymem2 debugblock
内容:
练习3和练习8都是armadillo copymem2 and debug block保护。
不同的是练习3是VC++练习8是delphi。
下面是我做练习时遇到的问题:
1、为什么bp WaitForDebugEvent bp WriteProcessMemory?
答:在waitfordebugevent数据窗口看到的是引发复制eip值的调用,当断下writeprocessmemory时,父进程开始对子进程的oep进行复制所以我们刚才看到的0047E990就是子进程的OEP。
2、打补丁脱壳的记录要点:
下断点he WaitForDebugEvent,f9运行。
取消所有断点返回到壳的领空
004BBD86 . 85C0 TEST EAX,EAX //停在这里
004BBD88 . 0F84 64270000 JE delphip.004BE4F2
004BBD8E . 8B85 FCFDFFFF MOV EAX,DWORD PTR SS:[EBP-204]
右键查找所有常量FFFFFFF8。找到9个,我们双击第一个来到这里向上查找
004BC30A > \83BD CCF5FFFF>CMP DWORD PTR SS:[EBP-A34],0
004BC311 . 0F8C A8020000 JL delphip.004BC5BF
004BC317 . 8B8D CCF5FFFF MOV ECX,DWORD PTR SS:[EBP-A34]
004BC31D . 3B0D 88644F00 CMP ECX,DWORD PTR DS:[4F6488]
004BC323 . 0F8D 96020000 JGE delphip.004BC5BF
004BC329 . 8B95 40F6FFFF MOV EDX,DWORD PTR SS:[EBP-9C0]
004BC32F . 81E2 FF000000 AND EDX,0FF
004BC335 . 85D2 TEST EDX,EDX
004BC337 . 0F84 AD000000 JE delphip.004BC3EA
004BC33D . 6A 00 PUSH 0
004BC33F . 8BB5 CCF5FFFF MOV ESI,DWORD PTR SS:[EBP-A34]
004BC345 . C1E6 04 SHL ESI,4
004BC348 . 8B85 CCF5FFFF MOV EAX,DWORD PTR SS:[EBP-A34]
004BC34E . 25 07000080 AND EAX,80000007
004BC353 . 79 05 JNS SHORT delphip.004BC35A
004BC355 . 48 DEC EAX
004BC356 . 83C8 F8 OR EAX,FFFFFFF8 //停在这里
找到第一个CMP的位置004BC30A,f2下断f9运行取消断点,看信息窗口。
堆栈 SS:[0012ED68]=0000007D
Jumps from 004BC14D, 004BC303
右键点击SS:[0012ED68]=0000007D修改数据为0(如果为0不用改)
好了,现在把补丁要用到的信息记录一下:
****************************************************
x=004BC30A y=EBP-A34=12ED68 z=4F6488 w=004BC5BF
****************************************************
004BC39A . 83C9 F8 or ecx, FFFFFFF8 双击这个来到下面
004BC39A . 83C9 F8 OR ECX,FFFFFFF8
004BC39D . 41 INC ECX
004BC39E > 33D2 XOR EDX,EDX
004BC3A0 . 8A91 0A3E4F00 MOV DL,BYTE PTR DS:[ECX+4F3E0A]
004BC3A6 . 333C95 98F34E>XOR EDI,DWORD PTR DS:[EDX*4+4EF398]
004BC3AD . 8B85 CCF5FFFF MOV EAX,DWORD PTR SS:[EBP-A34]
004BC3B3 . 99 CDQ
004BC3B4 . B9 1C000000 MOV ECX,1C
004BC3B9 . F7F9 IDIV ECX
004BC3BB . 8BCA MOV ECX,EDX
004BC3BD . D3EF SHR EDI,CL
004BC3BF . 83E7 0F AND EDI,0F
004BC3C2 . 03F7 ADD ESI,EDI
004BC3C4 . 8B15 6C644F00 MOV EDX,DWORD PTR DS:[4F646C]
004BC3CA . 8D04B2 LEA EAX,DWORD PTR DS:[EDX+ESI*4]
004BC3CD . 50 PUSH EAX
004BC3CE . 8B8D CCF5FFFF MOV ECX,DWORD PTR SS:[EBP-A34]
004BC3D4 . 51 PUSH ECX
004BC3D5 . E8 68210000 CALL delphip.004BE542
004BC3DA . 83C4 0C ADD ESP,0C
004BC3DD . 25 FF000000 AND EAX,0FF //这里打补丁
inc dword ptr ds:[y]
mov dword ptr ds:[z+4],1
jmp x
把字母替换成记录中的值然后写入
inc dword ptr ds:[12ED68]
mov dword ptr ds:[4F6488+4],1
jmp 004BC30A
处理完后来到w记录的地址004BC5BF,也可以回到刚开始的位置004BC30A,跟随下一行绿色的跳转线找到这行。
取消前面所有的断点在这里下断,运行后来到这里。打开lordpe选择第二个进程脱壳。
3、VC++和DELPHI程序IAT特征代码有为什么不同?
答:VC++十六进制代码是FF 15 反汇编代码是 CALL DWORD PTR DS:[xxxxxxxx]
DELPHI十六进制代码是FF 25反汇编代码是jmp dword ptr ds:[xxxxxxxx]
4、RAV及大小如何计算?
答:rav=IAT首地址-PE头基址(eg:rav=00482118-00400000=82118)
大小=IAT末地址-IAT首地址
5、为什么在双转单时新建EIP后运行报错?
答:黑鹰给的二进制代码问题,复制call kernel32.CreateMutexA 和jmp KERNEL32.OpenMutexA。
6、为什么在XP SP2上断不下来?
答:XP SP2 API函数调用上的问题。
7、为什么修复后的文件运行提示0x0047e990指令引用的0x0047e990内存。该内存不能为"written"。
答:在用来修复的子进程OD中查看内存你会发现OEP所在区段的权限是不可写入的,手动设置权限后再用import REC修复解决。
8、为什么OD的地址不是连续的?
答:因为这是一位一条指令不止是一个字节。
01058000 60 PUSHAD
01058001 E8 00000000 CALL sol.01058006
01058006 5D POP EBP
如:01058001是E8那么01058002就是00
[ 本帖最后由 horizon_c 于 2008-5-7 19:05 编辑 ] |
|