密码学实战 - HTB LunaCrypt

279 阅读2分钟

概述

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)