前言
这是笔者做的第一道vm题,虽然相较于同类题题面很简单,但是在过程中收获了很多。
wp
64位无壳,拖入IDA看看先

长这个样,三个函数挨个点进去看看

如果比较有经验的话,可以直接认出来这是比较明显的vm。先不细看,点开下一个。

认真分析一下,可以发现是一个循环执行段,执行(*(16 * (i + 1LL) + a1 + 16))(a1)这一地址的函数,直到**(a1 + 16) == 0xF4为止。。。。
第三个函数是一个判断。现在再看第一个函数

这样看其实比较麻烦对不对,但是没关系,可以通过结构体来简化这一段代码
对vm有了解的话,可以看出这里代码的前四行相当于设置了寄存器,unk_202060相当于是操作码(指令流),而下面一个数字一个函数的相当于汇编指令。明白了这些,为了看到更明白,我们打开结构体窗口操作一下:


在下面空白右键,新建结构体

这里我命名为cpu,随便怎么都可以,你开心就好
创建好后按d新建成员,由于上面是4位,所以创建好后多点几次d,把类型改成对应的dd
一共有四个寄存器,按照顺序命名


是这个效果,不要直接命名为eax等真实的,记的加个_啥的,不然会报错。
给操作码也起个名方便看,它占8位所以要设置成dq,不要忘记按顺序设置结构体的元素。

下面就到函数部分了。每一个函数对应一个编码,为此我们可以设置一个另外的结构体来存放函数。注意大小是8不要搞错。

做好后,再到刚刚大的结构体里添加一个新的元素,按y键设置类型为我们刚刚设置好的结构体

本文介绍了如何通过逆向工程,利用IDA工具分析64位无壳程序中的VM代码,通过创建结构体和函数来简化代码理解,并使用Z3库解决布尔satisfiability(SAT)问题获取flag。
最低0.47元/天 解锁文章
949





