python逆向 先看源代码
这段代码是一个简单的加密算法,通过将给定的字符串转换为二进制形式,然后将二进制数转换为一个整数,再将这个整数不断地除以31取余数,并根据余数映射到s_box
中的字符来实现加密。最后,输出加密后的字符串。
下面是对代码的分析:
-
flag = 'xxxxxxxxxxxxxxxxxxx'
:这是要加密的原始字符串。 -
s_box = 'qwertyuiopasdfghjkzxcvb123456#$'
:这是用于加密的字符集。 -
将每个字符转换为8位的二进制字符串,并拼接在一起,得到一个大整数
b1
。 -
将整数
b1
不断除以31,取余数,将余数映射到s_box
中的字符,直到商为0,得到加密后的字符串s
。 -
最后打印加密后的字符串
s
。
flag = 'xxxxxxxxxxxxxxxxxxx's_box = 'qwertyuiopasdfghjkzxcvb123456#$'
tmp = ''
for i in flag:tmp += str(bin(ord(i)))[2:].zfill(8)
b1 = int(tmp,2)
s = ''
while b1//31 != 0:s += s_box[b1%31]b1 = b1//31print(s)# s = u#k4ggia61egegzjuqz12jhfspfkay
逆向的过程是
- 遍历
s
中的每个字符,找到它在s_box
中的位置,然后将对应的位置转换为整数值。 - 将这些整数值合并为一个大的整数
b1
。 - 将整数
b1
转换为二进制字符串,可能需要在前面补0,使其长度为8的倍数。 - 将这个二进制字符串分割为每8位一组,然后将每组转换为对应的字符,即为解密后的明文。
爆破解出flag
s_box = 'qwertyuiopasdfghjkzxcvb123456#$'
encrypted_text = 'u#k4ggia61egegzjuqz12jhfspfkay'for candidate_value in range(1, 31):b1 = candidate_valuedecrypted_text = ''for i in range(len(encrypted_text) - 1, -1, -1):for j in range(len(s_box)):if encrypted_text[i] == s_box[j]:b1 *= 31b1 += jbreakdecrypted_text_binary = bin(b1)[2:]# Padding the binary string if its length is not a multiple of 8while len(decrypted_text_binary) % 8 != 0:decrypted_text_binary = decrypted_text_binary.zfill(len(decrypted_text_binary) + 1)decrypted_text_length = int(len(decrypted_text_binary) / 8)decrypted_text = ''for h in range(decrypted_text_length):binary_chunk = decrypted_text_binary[8 * h: 8 * (h + 1)]decrypted_char = chr(int(binary_chunk, 2))decrypted_text += decrypted_charprint(decrypted_text)
NSSCTF{WHAt_BASe31}