【攻防世界】- 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),不能像修改列表那样修改字符串的某个字符,正确的办法是使用切片和字符串拼接。

posted @ 2025-05-28 17:43  wyuu101  阅读(232)  评论(0)    收藏  举报