【攻防世界】- misc_xor
⭕、知识点
1、位异或、位变换
2、脚本编写
一、题目
一串文本
cidb~0f<f==0f634014`5g734c0=g34ag=f`fx
二、解题
1、最先想到的就是转为ascii码查看二进制数据
2、猜测cidb~对应flag{
3、验证猜想:
-
c和f
print(bin(ord("c"))[2:]) print(bin(ord("f"))[2:])得到输出
![]()
发现只有倒数第一位和倒数第三位是相反的 -
~和{
print(bin(ord("~"))[2:]) print(bin(ord("{"))[2:])得到输出
![]()
4、字节写的时候直接按照上面发现的规律写了如下脚本,得到flag
raw_data = "cidb~0f<f==0f634014`5g734c0=g34ag=f`fx"
def flip_bit(bit):
if bit == "0":
return "1"
elif bit == "1":
return "0"
result = ""
for i in raw_data:
original_ascii = bin(ord(i))[2:].zfill(7)
shift_ascii = original_ascii[0:4]+flip_bit(original_ascii[4])+original_ascii[5]+flip_bit(original_ascii[6])
result += chr(int(shift_ascii, 2))
print(result)

5、解出来看了wp发现原来还可以有更简便的方法:先求解出异或的密钥(本题为5),然后把密钥作用于整段文本
raw_data = "cidb~0f<f==0f634014`5g734c0=g34ag=f`fx"
key = ord("~") ^ ord("{")
result = ""
for i in raw_data:
result += chr(ord(i)^key)
print(result)
三、答案
flag{5c9c885c361541e0b261f58b61db8cec}
四、总结
1、异或只能是整数之间进行,如果对一串已知的二进制字符串使用密钥进行异或,需要先用int()将其转为整数,然后再进行异或
2、编写脚本中遇到如下报错
original_ascii[4] = flip_bit(original_ascii[4])
~~~~~~~~~~~~~~^^^
TypeError: 'str' object does not support item assignment
经过学习得到:这是因为在 Python 中,字符串是不可变的(immutable),不能像修改列表那样修改字符串的某个字符,正确的办法是使用切片和字符串拼接。



浙公网安备 33010602011771号