【逆向分析】BUUCTF 逆向题目 xor
2023-11-30 00:2:3 Author: 利刃信安攻防实验室(查看原文) 阅读量:8 收藏

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"); elseLABEL_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}

文章来源: http://mp.weixin.qq.com/s?__biz=MzU1Mjk3MDY1OA==&mid=2247508267&idx=6&sn=bd210f894fd2044c66bbb85f267b0321&chksm=fbfb11e6cc8c98f073c41c5253b9b290097843676c1485297e00a64b34b5a2e0d8666e351eb3&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh