Hack The Box CTF 简单密码学挑战 BabyEncryption

题目:

python 文件:

import string
from secret import MSG

def encryption(msg):
    ct = []
    for char in msg:
        ct.append((123 * char + 18) % 256)
    return bytes(ct)

ct = encryption(MSG)
f = open('./msg.enc','w')
f.write(ct.hex())
f.close()

msg.enc

6e0a9372ec49a3f6930ed8723f9df6f6720ed8d89dc4937222ec7214d89d1e0e352ce0aa6ec82bf622227bb70e7fb7352249b7d893c493d8539dec8fb7935d490e7f9d22ec89b7a322ec8fd80e7f8921

非常明显,python文件是加密程序,msg.enc是生成结果。

思路分析:

  1. (123 * char + 18) % 256 这一过程是对char进行运算,那么说明msg里的char是一个数字而非字符串。
  2. 数字组成的flag,很显然是ASCII码。
  3. % 求余运算是不可逆的,因此只能正向暴力破解。

暴力破解:

先将十六进制的密文转换为十进制,暴力破解每一位。这里ASCII码用的是从!(33)开始,到 } (125) 结束。


hex = "6e0a9372ec49a3f6930ed8723f9df6f6720ed8d89dc4937222ec7214d89d1e0e352ce0aa6ec82bf622227bb70e7fb7352249b7d893c493d8539dec8fb7935d490e7f9d22ec89b7a322ec8fd80e7f8921"

d = []
for i in range (0,160,2):
	num = hex[i] + hex [i+1]
	d.append (int(num, base=16))
	
flag = ""
for num in d:
	for i in range (33,126):
		if (i * 123 + 18) % 256 == num:
			flag+=(chr(i))

print(flag)


Result:
——————————————————————————————————————————————————————————————————————————————————
Th3nucl34rw1ll4rr1v30nfr1d4y.HTB{
    
    l00k_47_y0u_r3v3rs1ng_3qu4710n5_c0ngr475}

附一张ASCII码表:
在这里插入图片描述

以上。

猜你喜欢

转载自blog.csdn.net/qq_41608408/article/details/128598065