样例输入交互 huwang-refinal-5.exe hash
求 hash
Hi_main_sub_4016A0 主要完成以下操作
(1)hash 长度不大于 0x30
(2)构造虚拟机对象RE, 虚表为 Hi_RE_vft_off_4031CC;
构造虚拟机运行状态上下文
分配虚拟机栈内存和hash转存内存,并初始化到 虚拟机运行状态上下文
(3)设置 虚拟机运行状态上下文;
执行检测;
获取 虚拟机运行状态上下文;
根据检测结果输出信息。
求 hash
Hi_main_sub_4016A0 主要完成以下操作
(1)hash 长度不大于 0x30
(2)构造虚拟机对象RE, 虚表为 Hi_RE_vft_off_4031CC;
构造虚拟机运行状态上下文
分配虚拟机栈内存和hash转存内存,并初始化到 虚拟机运行状态上下文
(3)设置 虚拟机运行状态上下文;
执行检测;
获取 虚拟机运行状态上下文;
根据检测结果输出信息。
简化模型为
BUF64 = malloc(0x64){ 输入的hash转存空间
.00h cbSize:0x30 input_hash
}
BUF50 = malloc(0x50) 栈空间
RE.context (0x24){虚拟机运行状态上下文
//.00hww.EAX
.04hww.EBX
.08hww.EDX
.0Chww.ECX
//.10hww
.14hww BUF64
.18hww.STACK BUF50
//.1Chww
.20hww.EIP
}
RE{ cbSize:0x28 虚拟机对象 RE
.00 vft
.04hww.EAX
.08hww.EBX
.0Chww.EDX
.10hww.ECX
.14hww.EBP = 0 AS FLAG
.18hww.ESI = BUF64 //hash
.1Chww.STACK_BUTTOM OF BUF50
.20hww.ESP STACK_TOP = BUF50.28h
.24hww.EIP
}
vft.68h.set_context(RE.context)
vft.70h.check_hash()
vft.6Ch.get_context(RE.context)
若 [ebx]==0 即 RE.context.EAX == 0,则成功
提示 "Great! Add flag{} to hash and submit\n"
简化模型为
BUF64 = malloc(0x64){ 输入的hash转存空间
.00h cbSize:0x30 input_hash
}
BUF50 = malloc(0x50) 栈空间
RE.context (0x24){虚拟机运行状态上下文
//.00hww.EAX
.04hww.EBX
.08hww.EDX
.0Chww.ECX
//.10hww
.14hww BUF64
.18hww.STACK BUF50
//.1Chww
.20hww.EIP
}
RE{ cbSize:0x28 虚拟机对象 RE
.00 vft
.04hww.EAX
.08hww.EBX
.0Chww.EDX
.10hww.ECX
.14hww.EBP = 0 AS FLAG
.18hww.ESI = BUF64 //hash
.1Chww.STACK_BUTTOM OF BUF50
.20hww.ESP STACK_TOP = BUF50.28h
.24hww.EIP
}
vft.68h.set_context(RE.context)
vft.70h.check_hash()
vft.6Ch.get_context(RE.context)
若 [ebx]==0 即 RE.context.EAX == 0,则成功
提示 "Great! Add flag{} to hash and submit\n"
.text:004016CE cmp eax, 30h
.text:004016D1 ja loc_4017A3
.text:004016D7 push ebx
.text:004016D8 push esi
.text:004016D9 push edi
.text:004016DA push 28h ; Size
.text:004016DC call Hi_malloc_sub_401801
.text:004016E1 push 24h ; Size
.text:004016E3 mov [ebp+argc_then_RE], eax
.text:004016E6 mov dword ptr [eax], offset Hi_RE_vft_off_4031CC
.text:004016EC call Hi_malloc_sub_401801
.text:004016F1 mov ebx, eax
.text:004016F3 push 64h
.text:004016F5 mov dword ptr [ebx+4], 0
.text:004016FC mov dword ptr [ebx+8], 0
.text:00401703 mov dword ptr [ebx+0Ch], 0
.text:0040170A call Hi_j_malloc_sub_401801
.text:0040170F push 50h
.text:00401711 mov edi, eax
.text:00401713 call Hi_j_malloc_sub_401801
.text:00401718 mov esi, eax
.text:0040171A add esp, 10h
.text:0040171D mov eax, [ebp+argv]
.text:00401720 push ebx
.text:00401721 mov ecx, [eax+4]
.text:00401724 movups xmm0, xmmword ptr [ecx]
.text:00401727 movups xmmword ptr [edi], xmm0
.text:0040172A movups xmm0, xmmword ptr [ecx+10h]
.text:0040172E movups xmmword ptr [edi+10h], xmm0
.text:00401732 movups xmm0, xmmword ptr [ecx+20h]
.text:00401736 movups xmmword ptr [edi+20h], xmm0
.text:0040173A mov cx, [ecx+30h]
.text:0040173E mov [edi+30h], cx
.text:00401742 mov ecx, [ebp+argc_then_RE]
.text:00401745 mov [ebx+14h], edi
.text:00401748 mov [ebx+18h], esi
.text:0040174B mov dword ptr [ebx+20h], offset Hi_asmstr_404018
.text:00401752 mov eax, [ecx]
.text:00401754 call dword ptr [eax+68h] ; RE.vft[68] = 401100
.text:00401757 mov ecx, [ebp+argc_then_RE]
.text:0040175A mov eax, [ecx]
.text:0040175C call dword ptr [eax+70h] ; RE.vft[70] = 401530
.text:0040175F mov ecx, [ebp+argc_then_RE]
.text:00401762 push ebx
.text:00401763 mov eax, [ecx]
.text:00401765 call dword ptr [eax+6Ch] ; RE.vft[6C] = 401150
.text:00401768 cmp dword ptr [ebx], 0
.text:0040176B mov ecx, offset aGreatAddFlagTo ; "Great! Add flag{} to hash and submit\n"
.text:00401770 mov eax, offset aNoYouAreWrong ; "No! You are Wrong\n"
.text:00401775 cmovz eax, ecx
.text:00401778 push eax
.text:00401779 call Hi_ptrint
.text:004016CE cmp eax, 30h
.text:004016D1 ja loc_4017A3
.text:004016D7 push ebx
.text:004016D8 push esi
.text:004016D9 push edi
.text:004016DA push 28h ; Size
.text:004016DC call Hi_malloc_sub_401801
.text:004016E1 push 24h ; Size
.text:004016E3 mov [ebp+argc_then_RE], eax
.text:004016E6 mov dword ptr [eax], offset Hi_RE_vft_off_4031CC
.text:004016EC call Hi_malloc_sub_401801
.text:004016F1 mov ebx, eax
.text:004016F3 push 64h
.text:004016F5 mov dword ptr [ebx+4], 0
.text:004016FC mov dword ptr [ebx+8], 0
.text:00401703 mov dword ptr [ebx+0Ch], 0
.text:0040170A call Hi_j_malloc_sub_401801
.text:0040170F push 50h
.text:00401711 mov edi, eax
.text:00401713 call Hi_j_malloc_sub_401801
.text:00401718 mov esi, eax
.text:0040171A add esp, 10h
.text:0040171D mov eax, [ebp+argv]
.text:00401720 push ebx
.text:00401721 mov ecx, [eax+4]
.text:00401724 movups xmm0, xmmword ptr [ecx]
.text:00401727 movups xmmword ptr [edi], xmm0
.text:0040172A movups xmm0, xmmword ptr [ecx+10h]
.text:0040172E movups xmmword ptr [edi+10h], xmm0
.text:00401732 movups xmm0, xmmword ptr [ecx+20h]
.text:00401736 movups xmmword ptr [edi+20h], xmm0
.text:0040173A mov cx, [ecx+30h]
.text:0040173E mov [edi+30h], cx
.text:00401742 mov ecx, [ebp+argc_then_RE]
.text:00401745 mov [ebx+14h], edi
.text:00401748 mov [ebx+18h], esi
.text:0040174B mov dword ptr [ebx+20h], offset Hi_asmstr_404018
.text:00401752 mov eax, [ecx]
.text:00401754 call dword ptr [eax+68h] ; RE.vft[68] = 401100
.text:00401757 mov ecx, [ebp+argc_then_RE]
.text:0040175A mov eax, [ecx]
.text:0040175C call dword ptr [eax+70h] ; RE.vft[70] = 401530
.text:0040175F mov ecx, [ebp+argc_then_RE]
.text:00401762 push ebx
.text:00401763 mov eax, [ecx]
.text:00401765 call dword ptr [eax+6Ch] ; RE.vft[6C] = 401150
.text:00401768 cmp dword ptr [ebx], 0
.text:0040176B mov ecx, offset aGreatAddFlagTo ; "Great! Add flag{} to hash and submit\n"
.text:00401770 mov eax, offset aNoYouAreWrong ; "No! You are Wrong\n"
.text:00401775 cmovz eax, ecx
.text:00401778 push eax
.text:00401779 call Hi_ptrint
通过下述IDAPython脚本可以得到RE的虚表
vft={}
for ea in range(0x04031CC,0x403240,4):
vf = Dword(ea)
MakeName(vf,'Hi_RE_{:02X}_{:X}'.format(ea-0x04031CC,vf))
vft[ea-0x04031CC]=vf
vft.00 4031CC dd offset Hi_RE_00_4010A0
vft.04 401000 dd offset Hi_RE_04_401000;
vft.08 401180 dd offset Hi_RE_08_401180
vft.0C 401050 dd offset Hi_RE_0C_401050;
vft.10 401270 dd offset Hi_RE_10_401270
vft.14 401190 dd offset Hi_RE_14_401190
vft.18 4011C0 dd offset Hi_RE_18_4011C0
vft.1C 401250 dd offset Hi_RE_1C_401250
vft.20 401290 dd offset Hi_RE_20_401290
vft.24 4012C0 dd offset Hi_RE_24_4012C0
vft.28 4011F0 dd offset Hi_RE_28_4011F0
vft.2C 401220 dd offset Hi_RE_2C_401220
vft.30 4012F0 dd offset Hi_RE_30_4012F0
vft.34 401370 dd offset Hi_RE_34_401370
vft.38 401390 dd offset Hi_RE_38_401390
vft.3C 401310 dd offset Hi_RE_3C_401310
vft.40 401350 dd offset Hi_RE_40_401350
vft.44 4013B0 dd offset Hi_RE_44_4013B0
vft.48 401460 dd offset Hi_RE_48_401460
vft.4C 401480 dd offset Hi_RE_4C_401480
vft.50 4014A0 dd offset Hi_RE_50_4014A0
vft.54 4013D0 dd offset Hi_RE_54_4013D0
vft.58 401400 dd offset Hi_RE_58_401400
vft.5C 4014C0 dd offset Hi_RE_5C_4014C0
vft.60 4014D0 dd offset Hi_RE_60_4014D0
vft.64 4014E0 dd offset Hi_RE_64_4014E0
vft.68 401100 dd offset Hi_RE_68_401100
vft.6C 401150 dd offset Hi_RE_6C_401150
vft.70 401530 dd offset Hi_RE_70_401530
通过下述IDAPython脚本可以得到RE的虚表
vft={}
for ea in range(0x04031CC,0x403240,4):
vf = Dword(ea)
MakeName(vf,'Hi_RE_{:02X}_{:X}'.format(ea-0x04031CC,vf))
vft[ea-0x04031CC]=vf
vft.00 4031CC dd offset Hi_RE_00_4010A0
vft.04 401000 dd offset Hi_RE_04_401000;
vft.08 401180 dd offset Hi_RE_08_401180
vft.0C 401050 dd offset Hi_RE_0C_401050;
vft.10 401270 dd offset Hi_RE_10_401270
vft.14 401190 dd offset Hi_RE_14_401190
vft.18 4011C0 dd offset Hi_RE_18_4011C0
vft.1C 401250 dd offset Hi_RE_1C_401250
vft.20 401290 dd offset Hi_RE_20_401290
vft.24 4012C0 dd offset Hi_RE_24_4012C0
vft.28 4011F0 dd offset Hi_RE_28_4011F0
vft.2C 401220 dd offset Hi_RE_2C_401220
vft.30 4012F0 dd offset Hi_RE_30_4012F0
vft.34 401370 dd offset Hi_RE_34_401370
vft.38 401390 dd offset Hi_RE_38_401390
vft.3C 401310 dd offset Hi_RE_3C_401310
vft.40 401350 dd offset Hi_RE_40_401350
vft.44 4013B0 dd offset Hi_RE_44_4013B0
vft.48 401460 dd offset Hi_RE_48_401460
vft.4C 401480 dd offset Hi_RE_4C_401480
vft.50 4014A0 dd offset Hi_RE_50_4014A0
vft.54 4013D0 dd offset Hi_RE_54_4013D0
vft.58 401400 dd offset Hi_RE_58_401400
vft.5C 4014C0 dd offset Hi_RE_5C_4014C0
vft.60 4014D0 dd offset Hi_RE_60_4014D0
vft.64 4014E0 dd offset Hi_RE_64_4014E0
vft.68 401100 dd offset Hi_RE_68_401100
vft.6C 401150 dd offset Hi_RE_6C_401150
vft.70 401530 dd offset Hi_RE_70_401530
我们定义以下ALT_N的快捷键响应函数(或直接在IDAPython里输入quick_ALT_N()进行调用
鼠标定位到调用虚函数的地方,执行快捷函数会自动注释成类似 call dword ptr [eax+70h] ; RE.vft[70] = 401530 ,方便直接跳转到目标函数
我们定义以下ALT_N的快捷键响应函数(或直接在IDAPython里输入quick_ALT_N()进行调用
鼠标定位到调用虚函数的地方,执行快捷函数会自动注释成类似 call dword ptr [eax+70h] ; RE.vft[70] = 401530 ,方便直接跳转到目标函数
voff_prog = re.compile('(?s)call * dword ptr \[...\+([0-9A-Fa-f]+)h?\].*')
def quick_ALT_N():
cea = ScreenEA()
cur_asm = GetDisasm(cea)
voff_m = voff_prog.match(cur_asm)
off = None
if voff_m:
off = int(voff_m.groups()[0],0x10)
if off is not None:
MakeComm(cea,'RE.vft[{:02X}] = {:X}'.format(off,vft[off]))
def get_call_vft_addr(ea_call):
cea =ea_call
cur_asm = GetDisasm(cea)
voff_m = voff_prog.match(cur_asm)
off = None
if voff_m:
off = int(voff_m.groups()[0],0x10)
if off is not None:
return (off,vft[off])
else:
return (None,None)
voff_prog = re.compile('(?s)call * dword ptr \[...\+([0-9A-Fa-f]+)h?\].*')
def quick_ALT_N():
cea = ScreenEA()
cur_asm = GetDisasm(cea)
voff_m = voff_prog.match(cur_asm)
off = None
if voff_m:
off = int(voff_m.groups()[0],0x10)
if off is not None:
MakeComm(cea,'RE.vft[{:02X}] = {:X}'.format(off,vft[off]))
def get_call_vft_addr(ea_call):
cea =ea_call
cur_asm = GetDisasm(cea)
voff_m = voff_prog.match(cur_asm)
off = None
if voff_m:
off = int(voff_m.groups()[0],0x10)
if off is not None:
return (off,vft[off])
else:
return (None,None)
在0040175C call dword ptr [eax+70h] ; RE.vft[70] = 401530 中
其主要是虚拟机操作码解析执行业务逻辑,通过执行下述脚本,可得到后面的操作码对应的虚标函数偏移及地址等
在0040175C call dword ptr [eax+70h] ; RE.vft[70] = 401530 中
其主要是虚拟机操作码解析执行业务逻辑,通过执行下述脚本,可得到后面的操作码对应的虚标函数偏移及地址等
def hla_find_next_instr_x(ea,instr = ['push'], index = 0,up_down = SEARCH_DOWN):
# note: this is a weak func
if (ea < 0) or (index < 0):
Message('ea_cur can not set to zero.\n')
return
cnt = 0
cur_code_addr = ea
if up_down == SEARCH_DOWN:
while 1:
hla_curasm = GetDisasm(cur_code_addr)
for instr_ in instr:
if instr_ in hla_curasm:
cnt = cnt + 1
if (cnt - 1) == index:
return cur_code_addr
cur_code_addr = FindCode(cur_code_addr,SEARCH_NEXT|SEARCH_DOWN)
for op in range(0,0x16+1):
oph = Dword(0x401644+op*4)
ea_call = hla_find_next_instr_x(oph,['call'], 0,SEARCH_DOWN)
off,opvf = get_call_vft_addr(ea_call)
if off is not None:
print "op {:02X} - {:02X} vf {:02X} - {:X}".format(op,op+0x43,off,opvf)
else:
print "op {:02X}".format(op),'-'*0x20
op 00 --------------------------------ret
op 01 - 44 vf 48 - 401460
op 02 - 45 vf 2C - 401220
op 03 - 46 vf 38 - 401390
op 04 - 47 vf 20 - 401290
op 05 - 48 vf 58 - 401400
op 06 - 49 vf 5C - 4014C0
op 07 - 4A vf 24 - 4012C0
op 08 - 4B vf 50 - 4014A0
op 09 - 4C vf 64 - 4014E0
op 0A - 4D vf 4C - 401480
op 0B - 4E vf 10 - 401270
op 0C - 4F vf 3C - 401310
op 0D - 50 vf 1C - 401250
op 0E - 51 vf 34 - 401370
op 0F - 52 vf 30 - 4012F0
op 10 - 53 vf 14 - 401190
op 11 - 54 vf 40 - 401350
op 12 - 55 vf 54 - 4013D0
op 13 - 56 vf 60 - 4014D0
op 14 - 57 vf 44 - 4013B0
op 15 - 58 vf 28 - 4011F0
op 16 - 59 vf 18 - 4011C0
def hla_find_next_instr_x(ea,instr = ['push'], index = 0,up_down = SEARCH_DOWN):
# note: this is a weak func
if (ea < 0) or (index < 0):
Message('ea_cur can not set to zero.\n')
return
cnt = 0
cur_code_addr = ea
if up_down == SEARCH_DOWN:
while 1:
hla_curasm = GetDisasm(cur_code_addr)
for instr_ in instr:
if instr_ in hla_curasm:
cnt = cnt + 1
if (cnt - 1) == index:
return cur_code_addr
cur_code_addr = FindCode(cur_code_addr,SEARCH_NEXT|SEARCH_DOWN)
for op in range(0,0x16+1):
oph = Dword(0x401644+op*4)
ea_call = hla_find_next_instr_x(oph,['call'], 0,SEARCH_DOWN)
off,opvf = get_call_vft_addr(ea_call)
if off is not None:
print "op {:02X} - {:02X} vf {:02X} - {:X}".format(op,op+0x43,off,opvf)
else:
print "op {:02X}".format(op),'-'*0x20
op 00 --------------------------------ret
op 01 - 44 vf 48 - 401460
op 02 - 45 vf 2C - 401220
op 03 - 46 vf 38 - 401390
op 04 - 47 vf 20 - 401290
op 05 - 48 vf 58 - 401400
op 06 - 49 vf 5C - 4014C0
op 07 - 4A vf 24 - 4012C0
op 08 - 4B vf 50 - 4014A0
op 09 - 4C vf 64 - 4014E0
op 0A - 4D vf 4C - 401480
op 0B - 4E vf 10 - 401270
op 0C - 4F vf 3C - 401310
op 0D - 50 vf 1C - 401250
op 0E - 51 vf 34 - 401370
op 0F - 52 vf 30 - 4012F0
op 10 - 53 vf 14 - 401190
op 11 - 54 vf 40 - 401350
op 12 - 55 vf 54 - 4013D0
op 13 - 56 vf 60 - 4014D0
op 14 - 57 vf 44 - 4013B0
op 15 - 58 vf 28 - 4011F0
op 16 - 59 vf 18 - 4011C0
通过双击相应的操作码对应的虚表函数地址,我们分析补充操作码定义,如下
op 00 - 43 vf 00 = --------------------------------
ret
op 01 - 44 vf 48 - 401460
if re.14hww..r4.cmpflag==-1
pc: xx joff //pc+=(2+joff)
else:
pc += 2
pc: jl X1
//pc+=2 or pc+=(2+X1)
op 02 - 45 vf 2C - 401220
pc: div >> reg[X1.H]=reg[X1.H] / reg[X1.L]
//pc+=2
op 03 - 46 vf 38 - 401390
pc: movsx >> reg[X1.H]=*(byte ptr:.18hww.inptr)
//pc+=2
op 04 - 47 vf 20 - 401290
pc: xor >> reg[X1.H]=reg[X1.H] ^ reg[X1.L]
//pc+=2
op 05 - 48 vf 58 - 401400
pc: cmp >> .14hww.r4.cmpflag=reg[X1.H] cmp[<=>] reg[X1.L]
//pc+=2
op 06 - 49 vf 5C - 4014C0
pc: inptr++
//pc+=1
op 07 - 4A vf 24 - 4012C0
pc: xor >> reg[X1.H]=reg[X1.H] & reg[X1.L]
//pc+=2
op 08 - 4B vf 50 - 4014A0
pc: je X1
//pc+=2 or pc+=(2+X1)
op 09 - 4C vf 64 - 4014E0
pc: xor66dec imm15
//pc+=0x10
op 0A - 4D vf 4C - 401480
pc: jg X1
//pc+=2 or pc+=(2+X1)
op 0B - 4E vf 10 - 401270
pc: reg[X1.H]--
//pc+=2
op 0C - 4F vf 3C - 401310
pc: push BigImm32
//pc+=5
op 0D - 50 vf 1C - 401250
pc: reg[X1.H]++
//pc+=2
op 0E - 51 vf 34 - 401370
pc: mov >> reg[X1.H] = reg[X1.L]
//pc+=2
op 0F - 52 vf 30 - 4012F0
pc: push reg[X1.H]
//pc+=2
op 10 - 53 vf 14 - 401190
pc: xor >> reg[X1.H]=reg[X1.H] + reg[X1.L]
//pc+=2
op 11 - 54 vf 40 - 401350
pc: pop reg[X1.H]
//pc+=2
op 12 - 55 vf 54 - 4013D0
pc: loop X1
if .10hww.r3 == 0:
pc+=2
else:
pc-=X1
r3--
op 13 - 56 vf 60 - 4014D0
pc: inptr--
//pc+=1
op 14 - 57 vf 44 - 4013B0
pc: write *inptr = reg[X1.H]
//pc+=2
op 15 - 58 vf 28 - 4011F0
pc: imul >> reg[X1.H]=reg[X1.H] * reg[X1.L]
//pc+=2
op 16 - 59 vf 18 - 4011C0
pc: imul >> reg[X1.H]=reg[X1.H] - reg[X1.L]
//pc+=2
通过双击相应的操作码对应的虚表函数地址,我们分析补充操作码定义,如下
op 00 - 43 vf 00 = --------------------------------
ret
op 01 - 44 vf 48 - 401460
if re.14hww..r4.cmpflag==-1
pc: xx joff //pc+=(2+joff)
else:
pc += 2
pc: jl X1
//pc+=2 or pc+=(2+X1)
op 02 - 45 vf 2C - 401220
pc: div >> reg[X1.H]=reg[X1.H] / reg[X1.L]
//pc+=2
op 03 - 46 vf 38 - 401390
pc: movsx >> reg[X1.H]=*(byte ptr:.18hww.inptr)
//pc+=2
op 04 - 47 vf 20 - 401290
pc: xor >> reg[X1.H]=reg[X1.H] ^ reg[X1.L]
//pc+=2
op 05 - 48 vf 58 - 401400
pc: cmp >> .14hww.r4.cmpflag=reg[X1.H] cmp[<=>] reg[X1.L]
//pc+=2
op 06 - 49 vf 5C - 4014C0
pc: inptr++
//pc+=1
op 07 - 4A vf 24 - 4012C0
pc: xor >> reg[X1.H]=reg[X1.H] & reg[X1.L]
//pc+=2
op 08 - 4B vf 50 - 4014A0
pc: je X1
//pc+=2 or pc+=(2+X1)
op 09 - 4C vf 64 - 4014E0
pc: xor66dec imm15
//pc+=0x10
op 0A - 4D vf 4C - 401480
pc: jg X1
//pc+=2 or pc+=(2+X1)
op 0B - 4E vf 10 - 401270
pc: reg[X1.H]--
//pc+=2
op 0C - 4F vf 3C - 401310
pc: push BigImm32
//pc+=5
op 0D - 50 vf 1C - 401250
pc: reg[X1.H]++
//pc+=2
op 0E - 51 vf 34 - 401370
pc: mov >> reg[X1.H] = reg[X1.L]
//pc+=2
op 0F - 52 vf 30 - 4012F0
pc: push reg[X1.H]
//pc+=2
op 10 - 53 vf 14 - 401190
pc: xor >> reg[X1.H]=reg[X1.H] + reg[X1.L]
//pc+=2
op 11 - 54 vf 40 - 401350
pc: pop reg[X1.H]
//pc+=2
op 12 - 55 vf 54 - 4013D0
pc: loop X1
if .10hww.r3 == 0:
pc+=2
else:
pc-=X1
r3--
op 13 - 56 vf 60 - 4014D0
pc: inptr--
//pc+=1
op 14 - 57 vf 44 - 4013B0
pc: write *inptr = reg[X1.H]
//pc+=2
op 15 - 58 vf 28 - 4011F0
pc: imul >> reg[X1.H]=reg[X1.H] * reg[X1.L]
//pc+=2
op 16 - 59 vf 18 - 4011C0
pc: imul >> reg[X1.H]=reg[X1.H] - reg[X1.L]
//pc+=2
针对操作码原义,我们尽可能将其还原为通用的ASM汇编。
执行下述脚本,即可得到类似IDA Text的汇编控制流asmcfg
RE{ cbSize:0x28 虚拟机对象 RE
.00 vft
.04hww.EAX << ------- regs
.08hww.EBX
.0Chww.EDX
.10hww.ECX
.14hww.EBP = 0 AS FLAG
.18hww.ESI = BUF64 //hash
.1Chww.STACK_BUTTOM OF BUF50
.20hww.ESP STACK_TOP = BUF50.28h
.24hww.EIP
}
这里,我们将ECX定义在 regs = ['eax','ebx','edx','ecx','ebp'] 的第四位,
即对应 RE.10hww (RE.00hww 为vft),是由于LOOP 通常我们用ECX,而虚拟机使用RE.10hww,
所以作此改动,方便阅读。
同时我们让ESI寄存器对应 hash 的转存空间 BUF64
针对操作码原义,我们尽可能将其还原为通用的ASM汇编。
执行下述脚本,即可得到类似IDA Text的汇编控制流asmcfg
RE{ cbSize:0x28 虚拟机对象 RE
.00 vft
.04hww.EAX << ------- regs
.08hww.EBX
.0Chww.EDX
.10hww.ECX
.14hww.EBP = 0 AS FLAG
.18hww.ESI = BUF64 //hash
.1Chww.STACK_BUTTOM OF BUF50
.20hww.ESP STACK_TOP = BUF50.28h
.24hww.EIP
}
这里,我们将ECX定义在 regs = ['eax','ebx','edx','ecx','ebp'] 的第四位,
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-10-15 08:40
被HHHso编辑
,原因: 补充分析样例附件
上传的附件: