UNCTF- 2019 EasyVm
UNCTF- 2019 EasyVm
分析
放入IDA中分析

先看两个参数
2080

20A0

然后进去关键函数

发现这里是许多的a1的偏移,然后这里有一个10A8可以跟进去,注意这里的存储类型,后面分析有用

可以看到这里调用了很多的函数,然后进去第一个函数看一下

这里能够看到是通过switch和case语句进行很多的不同的偏移,这里并不知道他运行的顺序,需要虚拟机远程调试
动调
我的断点下在了这里

这里动态调试记得输入32位,防止最外面的if语句判断错误

然后进去看一下基本的数据存放


a1存放的东西:

看到这里,它的存储是4010A8,然后a1+8就是4010B0。然后看到下面

知道A0对应的是这里,再结合外面能推测出4010B0应该是地址

这里10B01118能与A0AF进行对应
从中知道(a1+24)调用的是20A0,(a1+32)调用的是我们所输入的东西,a2调用的是2080
也就是说a2+9是用来传输给switch进行判断的
然后通过不断的调试得出顺序是:A9,A3,A5,A6,A4,AB,A7,AE
接着找对应函数在干嘛
A9

这里并不知道a1+16和a1+18于是从10B0开始看一下都是干嘛的
10B0:

进行自增,然后根据上面byte的数据类型能推测a1+16应该是一个寄存器,所以这个我设为a16寄存器自增
然后往后面看能知道有a17和a18总共三个寄存器
所以A9为a16 = input[a18]
A3

a16 -= a18
A5

a17 = a16 ^ a17
A6

a16 = 0XCD
A4

a16 = a16 ^ a17
AB

A7

a17 = a16
AE

脚本
接下来只需要逆向这些算法就行了
/* |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 逆向上分之路!
评论
