BUUCTF 逆向题目 xor
题目地址:
https://buuoj.cn/challenges#xor
https://files.buuoj.cn/files/caa0fdad8f67a3115e11dc722bb9bba7/7ea34089-68ff-4bb7-8e96-92094285dfe9.zip
首先,查壳
信息:
文件名: H://BUUCTF/xor/xor
大小: 8884(8.68 KiB)
操作系统: macOS(10.13.0)
架构: X86_64
模式: 64 位
类型: EXECUTE
字节序: LE
使用IDA64打开文件
int __fastcall main(int argc, const char **argv, const char **envp)
{
int i; // [rsp+2Ch] [rbp-124h]
char flag[264]; // [rsp+40h] [rbp-110h] BYREF
memset(flag, 0, 0x100uLL);
printf("Input your flag:\n");
get_line(flag, 256LL);
if ( strlen(flag) != 33 )
goto LABEL_7;
for ( i = 1; i < 33; ++i )
flag[i] ^= flag[i - 1];
if ( !strncmp(flag, global, 0x21uLL) )
printf("Success");
else
LABEL_7:
printf("Failed");
return 0;
}
分析代码,flag为33长度字符串,flag的字符每一位与前一位异或后得到新字符串global
异或的特点:
如果A^B=C,则有A^C=B和B^C=A
def xor_encrypt(input_str):
result_list = [input_str[0]] # 保留第一位字符不变
for i in range(1, len(input_str)):
# 使用异或运算获得结果字符
result_char = chr(ord(result_list[i - 1]) ^ ord(input_str[i]))
result_list.append(result_char)
return result_list
def format_output(result_list):
formatted_output = []
for char in result_list:
if char.isprintable():
formatted_output.append(char)
else:
# 对于不可打印字符,转换为十六进制输出
hex_representation = "0x{:02x}".format(ord(char))
formatted_output.append(hex_representation)
return formatted_output
# 接收用户输入的字符串
user_input = input("请输入字符串: ")
# 调用函数进行异或并输出结果
encrypted_list = xor_encrypt(user_input)
# 格式化输出
formatted_output = format_output(encrypted_list)
print("异或后的结果数组:", formatted_output)
请输入字符串: flag{QianQiuWanDai_YiTongJiangHu}
异或后的结果数组: ['f', '0x0a', 'k', '0x0c', 'w', '&', 'O', '.', '@', '0x11', 'x', '0x0d', 'Z', ';', 'U', '0x11', 'p', '0x19', 'F', '0x1f', 'v', '"', 'M', '#', 'D', '0x0e', 'g', '0x06', 'h', '0x0f', 'G', '2', 'O']
global为
'f', 0x0A, 'k', 0x0C, 'w', '&', 'O', '.', '@', 0x11, 'x', 0x0D, 'Z', ';', 'U', 0x11, 'p', 0x19, 'F', 0x1F, 'v','"', 'M', '#', 'D', 0x0E, 'g', 6, 'h', 0x0F, 'G', '2', 'O'
要想获得flag则需要global的每一位与前一位异或获得flag
#include <stdio.h>
int main() {
char s[] = {'f', 0x0A, 'k', 0x0C, 'w', '&', 'O', '.', '@', 0x11, 'x', 0x0D, 'Z', ';', 'U', 0x11, 'p', 0x19, 'F', 0x1F, 'v','"', 'M', '#', 'D', 0x0E, 'g', 6, 'h', 0x0F, 'G', '2', 'O'};
char flag[33];
flag[0] = 'f';
for (int i = 1; i < sizeof(s)/sizeof(s[0]); i++) {
flag[i] = (char)s[i] ^ (char)s[i-1];
}
flag[sizeof(s)/sizeof(s[0])] = '\0';
printf("%s\n", flag);
return 0;
}
flag{QianQiuWanDai_YiTongJiangHu}