SWPUCTF2020-丑陋的vm

这一题可以说挺费耐心的,复现了三天左右才做出来。

首先

 

 

 通过函数sub_405bf0实现其他操作的分发。

 

 

 图中均为分发的函数,然后就是通过动态调试来查看这些函数都实现了怎样的功能。

其中比较重要的几个函数是sub_402030,sub_402410,sub_4024c0

 

 

 

 

 在调试过程中会找到有几个地方的内存是作为寄存器使用,还有一个标志寄存器,不过对执行流程没有影响。

函数sub_4024c0,sub_402410对输入的数据进行加密,最后进行对比。加密的方式自己通过动态调试得到会更加清晰。

然后写脚本爆破得出flag

a="36 25 03 3C 25 28 65 6E 35 51 27 58 62 5E 41 6D 47 7C 6E 1A 63 18 04 02 34 03 9C 15 83 0C 9E 4F DC 4D C0 74"
b=bytearray.fromhex(a)
c1=list(b)
c2=[]
c3=[]
flag=""

for i in range(18):
    c=c1[i]^(0x32+i)
    c2.append(c)
for i in range(18):
    c=c1[18+i]^(0x23+i)
    c2.append(c)

print(c2)

d1=d2=0x67
for i in range(len(c1)):
    if i%2==0:
        c=c2[i]^(d1)
        c3.append(c)
        d1=d1+2
    else:
        c=c2[i]^(d2)
        c3.append(c)
        d2=d2-2
print(c3)

for i in range(36):
    if i%2==0:
        for j in range(48,127):
            v5=j^3
            k=3&(j^3)
            while(k):
                v2=2*k
                v5^=v2
                k=v2&v5
            if v5==c3[i]:
                flag+=chr(j)
    else:
        for jj in range(48,127):
            v8=jj^5
            kk=jj&5
            while(kk):
                v4=2*kk
                v55=v8
                v8^=v4
                kk=v4&v55
            if v8==c3[i]:
                flag+=chr(jj)
print(flag)

 

总的来说这题自己做的时候挺扯蛋的,甚至进行了语义+人工的爆破,不过最后还是嗯逆了出来。虽然逆的很痛苦,不过最后做出来的感觉挺爽的。

 

posted @ 2020-12-15 22:34  mio_yy  阅读(175)  评论(0编辑  收藏  举报