题目:
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是生成结果。
思路分析:
- (123 * char + 18) % 256 这一过程是对char进行运算,那么说明msg里的char是一个数字而非字符串。
- 数字组成的flag,很显然是ASCII码。
- % 求余运算是不可逆的,因此只能正向暴力破解。
暴力破解:
先将十六进制的密文转换为十进制,暴力破解每一位。这里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码表:
以上。