首页
社区
课程
招聘
[原创] 护网杯 RERERE 操作码Disasm
发表于: 2018-10-13 22:47 4807

[原创] 护网杯 RERERE 操作码Disasm

HHHso 活跃值
22
2018-10-13 22:47
4807
样例输入交互 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编辑 ,原因: 补充分析样例附件
上传的附件:
收藏
免费 2
支持
分享
最新回复 (7)
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
麻烦附件也提交一份到论坛。
2018-10-14 08:35
0
雪    币: 54
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
kanxue 麻烦附件也提交一份到论坛。
https://svn.laucyun.com/public/CTF/2018/2018年护网杯

这是比赛的附件
2018-10-14 17:56
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
liuker https://svn.laucyun.com/public/CTF/2018/2018年护网杯 这是比赛的附件
感谢!好像不全,有一个task_huwang-refinal-4.exe,但本文章是huwang-refinal-5.exe
2018-10-14 20:25
0
雪    币: 17683
活跃值: (4671)
能力值: ( LV15,RANK:1878 )
在线值:
发帖
回帖
粉丝
5
kanxue 感谢!好像不全,有一个task_huwang-refinal-4.exe,但本文章是huwang-refinal-5.exe
经查证,svn中的refinal-4.exe与我分析样例的refinal-5.exe母体都应该是同一个,只是hash不同。可能由反/防作弊系统自动生成refinal-n.exe返回给不同战队。
2018-10-14 21:11
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
6
HHHso 经查证,svn中的refinal-4.exe与我分析样例的refinal-5.exe母体都应该是同一个,只是hash不同。可能由反/防作弊系统自动生成refinal-n.exe返回给不同战队。
赞!感谢分享!
2018-10-14 21:13
0
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
7
膜拜,偶像
2018-10-15 12:41
0
雪    币: 6112
活跃值: (1212)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
8
2018-10-17 13:38
0
游客
登录 | 注册 方可回帖
返回
//