V&N 2020 公开赛 -- h01k_re

主要有两种反调试方法
第一种在 sub_A01990 中,检查各种标志位

image

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

image

image

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

image

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

image

image

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

image

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

image
image
image

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

image

image

image

image

根据虚拟机程序,写出汇编

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

image

posted @ 2025-12-13 14:07  矛盾空间  阅读(1)  评论(0)    收藏  举报