V&N 2020 公开赛 -- h01k_re
主要有两种反调试方法
第一种在 sub_A01990 中,检查各种标志位

第二种在 sub_A01930,sub_A01950 中,检查执行时间


通过分析可知,main 函数加载了一个 PE 文件,在其中找到导出的 getflag 函数并调用。
解密部分在 sub_A01F00,比较复杂,可以动态调试。

执行到 PE 加载函数,可以看到使用 ecx 传参。在 Hex View 里面选择 Sync with ECX,能看到 PE 文件的 MZ 头。PE 文件的大小是 dwSize。


导出为 export_results.bin。找到 getflag 函数。
很花哨的反调试函数 sub_1000AD20(调试对象,wow64进程,调试端口,句柄表,天堂之门),直接 nop 掉,主要逻辑在 sub_10008E70 中

在 sub_10003EA0 中有很多函数,随便打开几个,不禁让人想到 VM(虚拟机)



VM 需要逆向出上下文结构体。经过分析,VM 上下文结构体和 VM 指令结构体如下




根据虚拟机程序,写出汇编
1 0 data mov r0, strlen(input)
1 1 addr mov r1, offset input
1 7 0 mov r7, 0
39 0 3 cmp r0, 3
47 1 jge 1
54 end
1 3 0 mov r3, 0
37 8 jmp 8
9 3 1 add r3, 1
40 3 0 cmp r3, r0
47 20 jge 20
8 4 1 load r4, r1
19 4 51 xor r4, 51
9 4 2 add r4, 2
4 6 4 mov [r6], r4 ; mem[i] = (input[i]^51) + 2
9 6 1 add r6, 1
9 1 1 add r1, 1
37 -28 jmp -28
1 6 0 mov r6, 0
1 7 30 mov r7, 30
1 3 0 mov r3, 0
37 8 jmp 8
9 3 1 add r3, 1
40 3 0 cmp r3, r0
47 20 jge 20
5 4 6 mov r4, [r6]
5 5 7 mov r5, [r7]
20 4 5 xor r4, r5
4 6 4 mov [r6], r4 ; mem[i] ^= mem[30+i]
9 6 1 add r6, 1
9 7 1 add r7, 1
37 -28 jmp -28
1 1 addr mov r1, mem
1 2 addr mov r2, enc
1 0 64 mov r0, 64
28 1 2 strcmp r1, r2, r0
41 1 je 1
54 end
34 addr call success
1 1 50 mov r1, 50
3 1 11 mov [r1], 11
54 end


浙公网安备 33010602011771号