CG-CTF WxyVM

一.

之前一直以为虚拟机是那种vmp的强壳,下午看了一些文章才逐渐明白虚拟机这个概念,目前ctf中题目出现的都是在程序中相等于内嵌了一个虚拟机,将程序代码转换成自己定义的指令,通过内嵌的虚拟机进行解释,就想jvm解释字节码一样。

这题感觉直接分析数据流也可以逆向出来233,看了令师傅的博客,临时学习了下idapython,原来这玩意这么好用,有点顶,学了点皮毛,看了很多文章,很多骚操作。
找到关键函数,之后从尾到头开始逆回去,
在这里插入图片描述
注意点:

1.for循环 从14997开始,因为从零开始,小于14999,说明最后一次的i是14997,加个3为15000,循环结束
2.数据溢出的问题,数据有时候很大,有时候又小,所以必须要控制数据的溢出。
3.idapython的使用

fact= [4294967236, 52, 34, 4294967217, 4294967251, 17, 4294967191, 7, 4294967259, 55, 4294967236, 6, 29, 4294967292, 91, 4294967277, 4294967192, 4294967263, 4294967188, 4294967256, 4294967219, 4294967172, 4294967244, 8]
addr=0x6010C0
for i in range(len(fact)):
    fact[i] &= 0xffffffff
for i in range(14997,-1,-3):
    v0=Byte(addr+i)
    result=Byte(addr+i+1)
    v3=Byte(addr+i+2)
    if v0==1:
        fact[result]-=v3
    elif v0==2:
        fact[result]+=v3
    elif v0==3:
        fact[result]^=v3
    elif v0==4:
        fact[result]/=v3
    elif v0==5:
        fact[result]^=fact[v3]
for i in range(len(fact)):
    fact[i] &= 0xff
print(''.join(map(chr, fact)))
        
posted @ 2020-04-08 17:59  YenKoc  阅读(256)  评论(0编辑  收藏  举报