171217 逆向-HomuraVM

这篇博客详细介绍了在CG-CTF中遇到的HomuraVM的逆向分析过程。作者首先描述了VM的结构和反调试机制,然后逐步解析了解释器的各个部分,特别是循环结构和对应的伪代码。通过递推公式,作者成功逆向求解出原始输入,同时指出在检查过程中存在一个bug,允许仅检查前34位。最后,作者强调了动态调试在解决此类问题中的重要性,并分享了反调试函数的绕过方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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++;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值