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