1625-5 王子昂 总结《2017年12月17日》 【连续第443天总结】
A. CG-CTF(HomuraVM)
B.
南邮的Re师傅们真是热爱VM啊……OTZ
这一题比WxyVM的两个要难一点,却又比asm汇编级别的解释器简单许多,感谢南邮师傅们(吼姆拉酱?ww)恰到好处的难度控制
拖入IDA,结构很清晰
将输入拷贝到一个数组中,然后初始化机器码
变换后进行check
很明显解释器就是sub_8DC,而sub_8AA则是反调试
对sub_8DC进行反编译,发现不完整
这里的JUMPOUT就是用来跳转至对应解释函数的语句
不过对机器码进行解析的部分都反编译出来了,就是每个字符-67后去dword_1048中寻找偏移值,然后以dword_1048为基准进行跳转
jmp base[a[i]-67] + base
回到汇编状态进行分析各个解释函数
可以看到有这么多,不过还好它们的核心语句基本上就只有一两行汇编,逐个记录即可
主要变量有两个计数器a和i,分别表示读取input和机器码的下标
两个寄存器qword_202080和qword_202088,下将其称为n1和n2
简单的函数如下
93c: a += 1
962: a -= 1
988: input[a] += 1
9aa: input[a] -= 1
9cc: n1 += 1
9ee: n1 -= 1
a10: n2 = n1
a36: n2 = n1 + input[a]
a67: n2 -= (n1&input[a])*2
aa6: n2 -= 1
ac8: n2 += 1
比较复杂的4个函数:
aea: if(input[a]!=0){b1d}else{af8}
af8: i++;