MOCTF reverse 暗恋的苦恼
一天一道CTF题目,能多不能少
打开题目的到信息:
下载运行exe文件,随便输入的到:
猜测是给了我们密文和密钥要我们破解明文,放进ida中(32位)
分析主函数,注释部分是分析:
然后进入到加密的函数,再次进行分析:
发现还有一个加密函数,进入分析:
大体的流程我们就很清楚的知道了:
就是一开始我们输入明文和密钥
对明文的每一个字符通过自己的方式进行加密
最后返回加密后的字符串
既然如此我们就可以编写脚本了
PY脚本如下,直接使用暴力法可得:
ming = "QWDRILDWNTW"
miyao = "ILOVEMOCTF"
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
len1 = len(ming)
len2 = len(miyao)
def dechar(n,m):
n = ord(n)
m = ord(m)
m += (n - 65)
if m > ord('Z'):
result = m - 25;
else:
result = m;
return chr(result);
k=0
for i in range(0,len1):
if k==len2:
k = 0
for j in range(0,len(s)):
x = dechar(s[j],miyao[k])
if x==ming[i]:
print(s[j])
break;
k += 1
由于他会自动变成大写,这里我就直接大写了
而且明文没有出现空格,所以空格我也省略了
最后得到明文:ILOVEYOUTOO
经过加密器验证发现正确,提交正确。
当然,不仅仅是只有着一种方法,逆向嘛,直接逆着来也行的
附上逆向得到明文的脚本:
ming = "QWDRILDWNTW"
miyao = "ILOVEMOCTFI"
s = ""
len1 = len(ming)
len2 = len(miyao)
for i in range(0,len1):
x = 0
#正常情况下,密文的每一位势必比密钥的每一位都要大,
#因为密文是密钥经过若干次加1得到的,否则就减了25
if ming[i] < miyao[i]:
x = ord(ming[i]) + 25
else:
x = ord(ming[i])
num = x - ord(miyao[i]) #密钥所加的数目
s += chr(num+65) #还原明文
print(s)