[GWCTF 2019]babyvm 详解 (vm逆向 IDA结构体)

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

前言

这是笔者做的第一道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键设置类型为我们刚刚设置好的结构体

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值