-
-
[原创]TMD/WL 代码修复讲解 (SS 堆栈段寄存器修复)
-
发表于:
2010-9-30 23:16
10082
-
[原创]TMD/WL 代码修复讲解 (SS 堆栈段寄存器修复)
这一节我会解释一下 ESP 的 堆栈段寄存器的修复,过程与第一节类似,具体要观察 EAX EDX ECX EBX ,结合CPU、寄存器、堆栈进行修复,
如图1,这是达到CALL位置时的寄存器状态,注意EAX=0060E078 再观察
如图2堆栈状态 注意 0012FC28 0060E078 ASCII "90094CCBDB69EAA48D7CC4A01BBD513AF8314D312BCB30EA"
那么 这时你看图1 ESP地址是0012FC34,0012FC34-0012FC28=C 也就是说 SS:[ESP-C] 就是 EAX,所以汇编语言表达:MOV EAX,DWORD PTR SS:[ESP-C],在达到这个CALL之前VM进行了 DS:[007F09D0]=007FAD8C (M2Server.007FAD8C) 的操作,你在图1中发现 EDX=007FAD8C,所以 MOV EDX,DWORD PTR DS:[007F09D0],而EDX与EBX就可以先不管
那么修复的代码就是如此了
MOV EAX,DWORD PTR SS:[ESP-C]
MOV EDX,DWORD PTR DS:[007F09D0]
CALL 490000
OK!这里我们简单的修复了一 SS 堆栈段寄存器和 DS 数据段寄存器的修复。
以下是我曾经写过的VM寄存器跟踪记录脚本,可以帮你记录下所有进出寄存器的状态
var findbase
var findsize
var count
var index
mov findbase, 1AB1000 //跟踪的CODE段基址
mov findsize, 84000 //大小
mov tempbase, findbase
add tempbase, findsize
mov index, 0
mov count, 7 // VM.JMP 次数 首次跟踪时查看 VM.JMP 有多少填入此处
TMD_START:
//pause
add index, 1
log index
log "VM.JMP start {"
TMD_IMAGE:
log "VM.JMP Trace.IN Start{" //跟踪入口
log eax
log ecx
log edx
log ebx
log esp
log ebp
log esi
log edi
log eip
log "} VM.JMP Trace.IN Over"
bprm findbase, findsize
esto
bpmc
cmp eip, tempbase
jb STD_IMAGE
log "VM.JMP Trace.OUT Start{" //跟踪出口
log eax
log ecx
log edx
log ebx
log esp
log ebp
log esi
log edi
log eip
log "} VM.JMP Trace.OUT Over"
jmp TMD_IMAGE
STD_IMAGE:
log "} VM.JMP over"
log "CODE.CALL start {" //代码段CALL
log eax
log ecx
log edx
log ebx
log esp
log ebp
log esi
log edi
log eip
log "} CODE.CALL over"
OEP_IMAGE:
cmp index, count
je END // stop !!!
rtr
find eip, #68????????E9????????# // VM JMP
cmp $RESULT, 0
je OEP_IMAGE
jmp TMD_START
END:
bpmc
ret
图1
图2
[课程]Android-CTF解题方法汇总!