Hitcon 2022

checker

检查部分

switch ( CurrentIrpStackLocation->Parameters.Read.ByteOffset.LowPart )
      {
        case 0x222000u:
          sub_1400014D0(0);
          byte_140013190[0] = 1;
          break;
        case 0x222010u:
          sub_1400014D0(32u);
          byte_140013191 = 1;
          break;
        case 0x222020u:
          sub_1400014D0(64u);
          byte_140013192 = 1;
          break;
        case 0x222030u:
          sub_1400014D0(96u);
          byte_140013193 = 1;
          break;
        case 0x222040u:
          sub_1400014D0(128u);
          byte_140013194 = 1;
          break;
        case 0x222050u:
          sub_1400014D0(160u);
          byte_140013195 = 1;
          break;
        case 0x222060u:
          sub_1400014D0(192u);
          byte_140013196 = 1;
          break;
        case 0x222070u:
          sub_1400014D0(224u);
          byte_140013197 = 1;
          break;
        case 0x222080u:
          if ( !Length )
            goto LABEL_15;
          v7 = 1;
          v8 = 0i64;
          while ( byte_140013190[v8] )
          {
            if ( ++v8 >= 8 )
              goto LABEL_21;
          }
          v7 = 0;
LABEL_21:
          if ( v7 )
          {
            v9 = dword_140003000 - 0x63746968;
            if ( dword_140003000 == 0x63746968 )
              v9 = (unsigned __int16)word_140003004 - 0x6E6F;
            **(_BYTE **)(a2 + 24) = v9 == 0;
          }
          else
          {
LABEL_15:
            **(_BYTE **)(a2 + 24) = 0;
          }
          break;

大概就是这些值都要过一遍,并且最后要和两个值相等(hitcon)

上面有个函数sub_1400014D0(0),里面进行了一些xor变换

然后看驱动入口,除了注册上面的major function外,还有如下

PhysicalAddress = MmGetPhysicalAddress((char *)sub_140001490 + 0x1B70);// 0x140003000
  qword_140013170 = (char *)MmMapIoSpace(PhysicalAddress, 0x1000ui64, MmNonCached);
  qword_140013178 = (__int64)(qword_140013170 + 0x30);// 0x140003030
  v5 = MmGetPhysicalAddress((char *)sub_140001490 - 96);// 140001430
  qword_140013188 = (char *)MmMapIoSpace(v5, 0x1000ui64, MmNonCached);
  qword_140013180 = qword_140013188 + 0x700;    // 0x140001b30

可以发现,这里地址其中之一就是某个操作函数的地址,实际上就是自修改代码,必须输入正确的序列才能得到正确的代码

In [17]:
d_0x140001b30=b'\x80\xe9"\x80\xf1\xad\x0f\xb6\xc1k\xc8\x11\xb8\x9e\x00\x00\x00*\xc1\xc3' # xor_sub
d_0x140001430=b'@SH\x83\xec H\x8b\x05;\x0c\x00\x00H\x8b\xdaH\x8bJ\x10H9\x08u7H\x8bJ\x08\xff\x15\x1d'
xor_d=b"\x19\xbc\x8f\x82\xd0,a4\xc0\x9f\xf6P\xd5\xfb\x0cn\xd0\xeb\xe5\xe3\xce\xb5L\xcaE\xaa\x11\xb2>bo}\xd0\xeb\xa9\xe3\xb2/\x06G|(\xc5\xde\xde\x1aN\xd6\xd8-\x93O\x82ed\xfd\x08bK\x87~RG0\xb7\xba\xd09hSP\xab \xd5\xca\x84&qo\x91\x1b6F\x11\xa5\xf1NXlt\xd4\x9c\x15\xe2(\xd5\xd9\x0f=\x83\xf3\xfc\xd1\x13\x1ab\x12@\xaa\xea\xcd\xcb\xe1\xc6\x08\x81\x98\xf6h\x88\xbe#\xb5\x9eU\xb9\xe2}Z\xda9\x07\xf0.2 YVL\xb4\x8f>\x07a\xd9\x0f-a\xf1\x913\x14\xcbIh\xfe\x1f\xd4\x8a\xfe\xe1\xc6\x18c\x9a\x9b\x8a\x8a\x7f\x08\xc3\xe8\xe1\xec\x0b\x8f;\x00\x94\xa5\x11\xe7Gf\xc4\x9f\x98\x18p\xf00\xf6\x94q\xb1\x95\xd1\xf0o\xb7\xd9=\x05\x9e\xc1S3v\x9bKi\xca\xde\xfd}g\xb8)+\xc7\xc5\x84,\xd1\x87\x87\xf1\x98\x97t\xadK2\xf0JQr\xea\t\xf78\xfd'\xbd\x1cRqC\x95\x9c\x1a\x86\xf2\xc0\xf9\xf8"
c=b'c`\xa5\xb9\xff\xfc0\nH\xbb\xfe\xfe2,\n\xd6\xe6\xfe\xfe2,\n\xd6\xbbJJ2,\xfc\xff\n\xfd\xbb\xfe,\xb9c\xd6\xb9b\xd6\nO'
from unicorn import *
import unicorn.x86_const as uc
import itertools as it
import capstone as cp
def xor_sub(a1):
    return (-98 - 17 * ((a1 - 34) ^ 0xAD)+0x100000000)&0xff
def disasm(code):
    cs=cp.Cs(cp.CS_ARCH_X86,cp.CS_MODE_32)
    for i in cs.disasm(code,0):
        print(i)
def exe(code,data,end=0x13):
    # disasm(code)
    mu=Uc(UC_ARCH_X86,UC_MODE_64)
    base=0
    stack_addr=0X100000
    size=1024*1024
    mu.mem_map(base,size)
    mu.mem_map(stack_addr,size)
    mu.mem_write(base,code)
    mu.reg_write(uc.UC_X86_REG_RSP,stack_addr+size-1)
    mu.reg_write(uc.UC_X86_REG_RCX,data)
    mu.emu_start(base,base+end)
    r=mu.reg_read(uc.UC_X86_REG_RAX)
    return r
def check(seq):
    f=[i for i in c]
    code=[i for i in d_0x140001b30]
    for i in range(32):
        code[i%16]^=d_0x140001430[i]
    for j,e in seq:
        x=xor_d[j*32:j*32+32]
        for i in range(16):
            code[i]^=x[i]
        for i in range(len(f)):
            f[i]=exe(bytes(code),f[i],e)
        for i in range(16):
            code[i]^=x[i+16]
    print(bytes(f))
seq=[(7,0xd),(2,6),(6,0xd),(0,0x3),(1,0x3),(4,0xc),(3,0x9),(5,0xd)] # 通过disasm不断尝试找到合法的指令和结束位置
check(seq)
b'hitcon{r3ally_re4lly_rea11y_normal_checker}'

Meow Way

一眼天堂之门

dump出code后保存成单个二进制文件,使用IDA单独分析特征。一般这么多函数的肯定有公共特征

In [47]:
c=b"\x96P\xcf,\xeb\x9b\xaa\xfbS\xabs\xddl\x9e\xdb\xbc\xee\xab#\xd6\x16\xfd\xf1\xf0\xb9u\xc3(\xa2t}\xe3'\xd5\x95\\\xf5vu\xc9\x8c\xfbB\x0e\xbdQ\xa2\x98"
codes=b'j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\xbag\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1/g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00Usage: %s <flag>\n\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\xcdg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00Wrong length\n\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\xf6g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\x9fg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00Wrong\n\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1\xd0g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00I know you know the flag!\n\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1"g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1\xf7g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\xd0g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\x1fg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1\xa8g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1=g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\xc7g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\xa5g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1Gg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1hg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\xd7g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1Jg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\x96g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1\x91g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1.g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\x19g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\xc5g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\xe3g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\x88g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1\xbdg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1Ng\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\x93g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1\x13g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1\xf1g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\xccg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1Gg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\xabg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\xc9g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1Hg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1+g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1\tg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1Pg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1Og\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1\xe9g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1\xc0g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1^g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1\xefg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1\x8bg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1\x85g\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00\x00\x00\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1\xcbg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6\x80\xbc\x00\x00\x00g\x8bL$\x1c\x83\xe0pg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g\x02\x0e\x80\xf1Ug\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00j3\xe8\x00\x00\x00\x00\x83\x04$\x05\xcbH1\xc0eH\x8b@`H\x0f\xb6@\x02g\x8bL$\x1cg\x89\x01\x85\xc0u\x18g\x8b|$\x04g\x8bt$\x0cg\x8bL$\x14g*\x0e\x80\xf1pg\x88\x0f\xe8\x00\x00\x00\x00\xc7D$\x04#\x00\x00\x00\x83\x04$\r\xcb\xc3\x00\x00\x00\x00'
base=0x4031c0
head=b'\x6a\x33\xe8\x00\x00\x00\x00\x83\x04\x24\x05\xcb'
tail=bytes.fromhex("e800000000c7442404230000008304240dcbc3")

import capstone as cp
def disasm(code,p=True):
    cs=cp.Cs(cp.CS_ARCH_X86,cp.CS_MODE_64)
    if p:
        for i in cs.disasm(code,0):
            print(i)
    return cs.disasm(code,0)

def find_addr(codes:bytes):
    addrs=[]
    start=0
    while start<len(codes):
        st=codes[start:].find(head)
        if st==-1:break
        start+=st
        end=codes[start:].find(tail)
        addrs.append((start,start+end))
        start=start+end+len(tail)
    return addrs
def get_xor_data(code):
    for i in disasm(code,p=False):
        if i.mnemonic=='xor':
            # print(i)
            if 'rax' not in i.op_str:
                # print(i.op_str)
                return int(i.op_str.split(',')[-1],base=16)
def get_op(code):
    dis=disasm(code,False)
    ops=[i.mnemonic for i in dis]
    # print(ops)
    if ops[-3]=='add':
        return 1
    elif ops[-3]=='sub':
        return 2
    else:
        print(ops)
        exit()
addrs=find_addr(codes)
add_data=[196,22,142,119,5,185,13,107,36,85,18,53,118,231,251,160,218,52,132,180,200,155,239,180,185,10,87,92,254,197,106,115,73,189,17,214,143,107,10,151,171,78,237,254,151,249,152,101]

xor_data=[get_xor_data(codes[st:en]) for st,en in addrs]
op=[get_op(codes[st:en]) for st,en in addrs]
# get_op(codes[addrs[0][0]:addrs[0][1]])
f=[0]*len(c)
for i in range(len(c)):
    if op[i]==1:
        f[i]=(c[i]^xor_data[i])-add_data[i]+0x100&0xff
    elif op[i]==2:
        f[i]=add_data[i]-(c[i]^xor_data[i])+0x100&0xff
    else:
        print(i,op[i])
        exit()
print(bytes(f))
b'hitcon{___7U5T_4_S1mpIE_xB6_M@G1C_4_mE0w_W@y___}'

gocrygo

go逆向

首先寻找字符串,然后交叉引用找到go的报错函数,然后就可以交叉引用找到上层函数,并在core中判断这个地址是不是存在

In [24]:
from Crypto.Cipher import DES
from tqdm import tqdm
import os,sys
import struct
core=open('core','rb').read()
start=0
# 0x2139fe: 0x3a962b 0x184e65
functions=[2154644, 2154671, 2154680, 2154691, 2154720, 2154772, 2154773, 2154774, 2155130, 2155211, 2155259, 2155362, 2155492, 2155836, 2155960, 2155980, 2155981, 2156018, 2156045, 2156046, 2156217, 2156231, 2156261, 2156281, 2156301, 2156319, 2156399, 2157085, 2157294, 2157396, 2157412, 2157561, 2157686, 2157754, 2158277, 2158305, 2158343, 2158372, 2158377, 2158611, 2158898, 2159185, 2159255, 2159460, 2159594, 2159955, 2160078, 2160208, 2160350, 2160530, 2160744, 2160828, 2160922, 2161008, 2161401, 2161586, 2161611, 2161660, 2161684, 2161730, 2161782, 2162028, 2162113, 2162127, 2162233, 2162346, 2162488, 2162628, 2162642, 2162656, 2162704, 2162826, 2162859, 2163266, 2163423, 2163479, 2163506, 2163591, 2163692, 2163735, 2163798, 2163887, 2164327, 2164360, 2164499, 2164507, 2164948, 2165031, 2165101, 2165108, 2165115, 2165140, 2166319, 2166659, 2167406, 2167776, 2167827, 2168196, 2168488, 2168560, 2168649, 2168983, 2169239, 2169450, 2169507, 2169872, 2169998, 2170487, 2170772, 2171298, 2171636, 2171869, 2172169, 2172260, 2172479, 2172564, 2172590, 2172884, 2174298, 2174400, 2174449, 2174467, 2174544, 2174606, 2174742, 2174829, 2174941, 2175649, 2175791, 2175835, 2175881, 2175889, 2175911, 2175970, 2175997, 2176390, 2176439, 2176453, 2176490, 2176504, 2176602, 2176635, 2176666, 2176759, 2177017, 2177130, 2177212, 2177338, 2177428, 2177447, 2177534, 2177822, 2177851, 2177960, 2178061, 2178289, 2178303, 2178329, 2178354, 2178371, 2179180, 2179223, 2179238, 2180958, 2181240, 2181254, 2181359, 2181380, 2181424, 2181479, 2181537, 2181551, 2181682, 2181814, 2182233, 2182247, 2182427, 2182507, 2182621, 2182669, 2183063, 2183284, 2183382, 2183420, 2183797, 2184649, 2184697, 2184802, 2184962, 2185064, 2185133, 2185194, 2185442, 2186023, 2186070, 2186701, 2186751, 2187331, 2187831, 2188083, 2190178, 2190276, 2190322, 2190365, 2191628, 2191875, 2192197, 2192819, 2193154, 2193578, 2193798, 2197318, 2198194, 2198219, 2198259, 2198424, 2198436, 2198485, 2198654, 2203998, 2204059, 2204240, 2204254, 2204324, 2204579, 2204607, 2204649, 2204723, 2204769, 2204963, 2205004, 2205084, 2205419, 2205511, 2205531, 2205551, 2205623, 2205703, 2205721, 2205730, 2205893, 2205905, 2206098, 2206386, 2206453, 2206620, 2206658, 2206864, 2207041, 2207162, 2208265, 2208476, 2208697, 2209138, 2209263, 2210064, 2210272, 2210401, 2211732, 2211857, 2214615, 2215180, 2217146, 2217215, 2217265, 2217617, 2217638, 2217733, 2217933, 2218168, 2218443, 2218991, 2219343, 2219393, 2220150, 2225178, 2225339, 2225455, 2226098, 2226650, 2226706, 2226845, 2226940, 2227128, 2227141, 2227234, 2227403, 2227436, 2227462, 2228032, 2230348, 2230510, 2230629, 2231643, 2231821, 2233545, 2233579, 2234977, 2238768, 2239024, 2244186]
def search(pattern):
    p=struct.pack("<Q",pattern)
    start=0
    r=[]
    while start<len(core):
        i=core[start:].find(p)
        if i==-1:
            break
        # print(hex(i),hex(struct.unpack("<Q",core[start+i:start+i+8])[0]))
        r.append((i,struct.unpack("<Q",core[start+i:start+i+8])[0]))
        start=start+i+len(p)
    return r
for f in functions:
    r=search(f)
    if len(r)!=0:
        print('='*5+hex(f)+"="*5)
        for addr,func in r:
            print(hex(addr),hex(func))
=====0x20e094=====
0x288 0x20e094
0x0 0x20e094
=====0x20e0e0=====
0x1e0 0x20e0e0
0x40030238 0x20e0e0
0x1d8 0x20e0e0
0x3ba8 0x20e0e0
=====0x20e2cb=====
0x40030518 0x20e2cb
=====0x2149af=====
0x400304f8 0x2149af
=====0x214ab6=====
0x211d8 0x214ab6
=====0x21a433=====
0xf6b8 0x21a433
=====0x21a523=====
0x20c08 0x21a523
=====0x223e5a=====
0x3eda8 0x223e5a
0x10078 0x223e5a
0x10078 0x223e5a
0x10078 0x223e5a
0x10078 0x223e5a
0x10078 0x223e5a
0x10078 0x223e5a