本文最后更新于301 天前,其中的信息可能已经过时,如有错误可以直接在文章下留言
MoeCTF 2023是我接触的第一个CTF的比赛,是一个新生赛,我感觉里面的题目都出的很好啊,最近觉得应该做一下,当时作为小白只做了Misc方向的题目,这道题是Reverse的,新生赛嘛,都简单,最近很焦虑,觉得自己Reverse方向的水平和小白也没啥区别,学习成绩也一般,难受。
打开压缩包给的.exe程序,如图
提示很明显,比较新生题,用exeinfope查壳,加了壳,如图。
直接用UPX脱壳,如图
脱壳成功后再用IDA打开,在Strings Windows追踪,很容易发现主函数,如图
逻辑很简单,小白一般第一个接触到的异或的性质,异或(用符合XOR或者^来表示)
异或是一种二进制的位运算,运算规则为:
相同为0,不同为1,即
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
由运算规则可知,任何二进制数与零异或,都会等于其本身,即 A ^ 0 = A
并且若A^B=C,则B^C=A,这题就是运用了异或的这个性质,
我的解题脚本如下
byte=[ 0x0A, 0x08, 0x02, 0x04, 0x13, 0x01, 0x1C, 0x57, 0x0F, 0x38,
0x1E, 0x57, 0x12, 0x38, 0x2C, 0x09, 0x57, 0x10, 0x38, 0x2F,
0x57, 0x10, 0x38, 0x13, 0x08, 0x38, 0x35, 0x02, 0x11, 0x54,
0x15, 0x14, 0x02, 0x38, 0x32, 0x37, 0x3F, 0x46, 0x46, 0x46,
0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00]
flag=[0]*len(byte)
for i in range(len(byte)):
flag[i]=chr(byte[i]^103)
flag=''.join(flag)
print(flag)
得到flag为moectf{0h_y0u_Kn0w_H0w_to_Rev3rse_UPX!!!}