概述
Protein Cookies是来自于HTB(hackthebox.com)的一个容易级密码学挑战,完成该挑战所需要掌握的知识点在于Python代码的阅读理解以及基本的二进制计算。
题目分析
相关的任务文件包括一个LunaCrypt.py源代码和output.txt文本文件。
LunaCrypt.py中给出了加密的步骤,而output.txt则是加密的结果输出。
加密的过程在于对于明文中的各个字符依次进行,首先生成一个flag整数, flag中的各个比特位由运行时产生的随机属置0或1,然后调用若干种的加密方法,是否运行某个特定的加密方法则由flag中该方法对应的比特位值来决定。 对每个字符而言, 加密的输出内容则包括两个数字,第一个是加密计算的结果,第二个是flag与0x4A异或的数值。
#解题过程
解密过程就是对加密过程的反转。
# ESwapChar的反转
def _ESwapChar(char):
char = ValidateChar(char)
THIS_MSB = bitext(char, 4, 4)
THIS_LSB = bitext(char, 0, 4)
M = bitxor(THIS_MSB, 0x0B)
L = bitxor(THIS_LSB, 0x0D)
return strchr(bitbor(bitlst(L, 4), M))
# XorBy6B的反转
def _XorBy6B(char):
return XorBy6B(char)
# XorBy3E的反转
def _XorBy3E(char):
return XorBy3E(char)
# NegateChar的反转
def _NegateChar(char):
return NegateChar(char)
outputs = [108,182,82,176,167,158,69,222,39,102,234,14,241,16,10,218,160,108,76,234,225,224,1,12,97,122,114,90,10,90,250,14,155,80,101,186,97,218,115,218,207,76,190,174,196,84,192,144]
outputLength = len(outputs)
result = ""
for i in range(0, outputLength, 2):
#密文字符
char = outputs[i]
#加密flag = flag输出异或0x4A
flag = outputs[i + 1]
flag = bitxor(flag, 0x4A)
#反转加密顺序
if CheckFlag(flag, FL_XORBY3E):
char = _XorBy3E(char)
if CheckFlag(flag, FL_XORBY6B):
char = _XorBy6B(char)
if CheckFlag(flag, FL_NEGATE):
char = _NegateChar(char)
if CheckFlag(flag, FL_SWAPBYTES):
char = _ESwapChar(char)
char = ValidateChar(char)
result += chr(char)
print("result = ", result)