2026/1/8 22:00:39
网站建设
项目流程
如何做网站同步,公司网站建设多少钱需要,湛江高端网站建设,网页报价表【攻防世界】reverse | xxxorrr 详细题解 WP
下载附件 看这道题1积分有很多人解出来#xff0c;以为是简单的异或题目#xff0c;还有一个隐藏 sub_84A 函数 需要通过s1变量来定位到隐藏 sub_84A 函数
main函数伪代码#xff1a;
__int64 __fastcall main(int a1, char *…【攻防世界】reverse | xxxorrr 详细题解 WP下载附件看这道题1积分有很多人解出来以为是简单的异或题目还有一个隐藏sub_84A函数需要通过s1变量来定位到隐藏sub_84A函数main函数伪代码__int64 __fastcallmain(inta1,char**a2,char**a3){inti;// [rspCh] [rbp-34h]chars[40];// [rsp10h] [rbp-30h] BYREFunsigned__int64 v6;// [rsp38h] [rbp-8h]v6__readfsqword(0x28u);sub_A90((void(__fastcall*)(void*))sub_916);fgets(s,35,stdin);for(i0;i33;i)s1[i]^s[i];return0LL;}sub_916函数伪代码unsigned__int64sub_916(){unsigned__int64 v1;// [rsp8h] [rbp-8h]v1__readfsqword(0x28u);if(!strcmp(s1,s2))puts(Congratulations!);elseputs(Wrong!);return__readfsqword(0x28u)^v1;}sub_84A函数伪代码unsigned__int64sub_84A(){inti;// [rspCh] [rbp-14h]unsigned__int64 v2;// [rsp18h] [rbp-8h]v2__readfsqword(0x28u);for(i0;i33;i)s1[i]^2*i65;return__readfsqword(0x28u)^v2;}expdefcrack_flag():# 1. 原始s1数组34字节i0~33s1_original[0x71,0x61,0x73,0x78,0x63,0x79,0x74,0x67,0x73,0x61,0x73,0x78,0x63,0x76,0x72,0x65,0x66,0x67,0x68,0x6E,0x72,0x66,0x67,0x68,0x6E,0x6A,0x65,0x64,0x66,0x67,0x62,0x68,0x6E,0x00]# 2. 目标s2数组34字节i0~33s2_target[0x56,0x4E,0x57,0x58,0x51,0x51,0x09,0x46,0x17,0x46,0x54,0x5A,0x59,0x59,0x1F,0x48,0x32,0x5B,0x6B,0x7C,0x75,0x6E,0x7E,0x6E,0x2F,0x77,0x4F,0x7A,0x71,0x43,0x2B,0x26,0x89,0xFE]# 3. 计算输入s_inputs_input_bytes[]s_input_chars[]foriinrange(34):# 动态密钥2*i 650x41 2*ikey2*i65# 核心公式s_input s1_original ^ key ^ s2_targetinput_bytes1_original[i]^key^s2_target[i]s_input_bytes.append(input_byte)# 转换为字符可打印字符直接显示不可打印用\xXX表示if32input_byte126:input_charchr(input_byte)else:input_charf\\x{input_byte:02x}s_input_chars.append(input_char)# 4. 验证结果正确性verify[]foriinrange(34):key2*i65# 模拟程序处理流程s1_original ^ key ^ s_input → 应等于s2_targetprocesseds1_original[i]^key^s_input_bytes[i]verify.append(processed)is_validverifys2_target# 5. 输出结果print( 解题结果 )print(f1. 输入字节十六进制{ .join(f{b:02x}forbins_input_bytes)})print(f2. 输入字符{.join(s_input_chars)})print(f3. 验证结果{通过ifis_validelse失败})print(f4. Flag格式:{.join(s_input_chars)})returns_input_bytes,s_input_charsif__name____main__:crack_flag()运行 exp 脚本flag{c0n5truct0r5_functi0n_in_41f}【攻防世界】reverse | xxxorrr 详细题解 WP 原来深度解析CTF 逆向实战xxxorrr 深度解析与异或类题目通用解题框架在 CTF 逆向题目中异或XOR运算因其可逆性和简单性被广泛应用是入门级到进阶级题目中常见的加密手段。本文以攻防世界 reverse 板块的 xxxorrr 题目为例从程序逻辑拆解、关键数据提取、数学原理分析到代码实现全方位展示异或类题目的解题思路并总结通用解题框架帮助读者实现 “举一反三”。一、题目初探程序执行流程全景扫描1.1 逆向工程初步成果通过 IDA 或 Ghidra 对二进制文件进行反编译我们得到三个关键函数的伪代码这三个函数构成了程序的核心逻辑链main 函数输入处理核心__int64 __fastcallmain(inta1,char**a2,char**a3){inti;// [rspCh] [rbp-34h]chars[40];// [rsp10h] [rbp-30h] BYREFunsigned__int64 v6;// [rsp38h] [rbp-8h]v6__readfsqword(0x28u);sub_A90((void(__fastcall*)(void*))sub_916);// 注册退出回调fgets(s,35,stdin);// 读取输入最多34字节for(i0;i33;i)s1[i]^s[i];// 输入与s1异或return0LL;}sub_916 函数验证逻辑unsigned__int64sub_916(){unsigned__int64 v1;// [rsp8h] [rbp-8h]v1__readfsqword(0x28u);if(!strcmp(s1,s2))// 比较处理后的s1与目标s2puts(Congratulations!);elseputs(Wrong!);return__readfsqword(0x28u)^v1;}sub_84A 函数隐藏的异或处理unsigned__int64sub_84A(){inti;// [rspCh] [rbp-14h]unsigned__int64 v2;// [rsp18h] [rbp-8h]v2__readfsqword(0x28u);for(i0;i33;i)s1[i]^2*i65;// s1与动态密钥异或return__readfsqword(0x28u)^v2;}1.2 执行流程梳理通过函数调用关系和程序运行机制分析完整执行链路如下程序启动后sub_A90函数通过__cxa_atexit机制将sub_916注册为退出回调程序正常结束时自动执行sub_84A函数在初始化阶段对原始s1数组进行处理关键隐藏步骤main函数读取用户输入s并与处理后的s1执行异或操作程序退出时sub_916函数比较最终的s1与目标s2输出验证结果二、关键数据提取从二进制到数组逆向分析的核心步骤之一是精准提取关键数据。通过查看程序.data段数据段我们可以获取s1和s2的原始值2.1 原始数组s1地址 0x201020在反编译工具的内存窗口中s1被定义为.data:0000000000201020 s1 db qasxcytgsasxcvrefghnrfghnjedfgbhn,0转换为十六进制字节数组共 34 字节含终止符s1_original[0x71,0x61,0x73,0x78,0x63,0x79,0x74,0x67,0x73,0x61,0x73,0x78,0x63,0x76,0x72,0x65,0x66,0x67,0x68,0x6E,0x72,0x66,0x67,0x68,0x6E,0x6A,0x65,0x64,0x66,0x67,0x62,0x68,0x6E,0x00# 终止符]2.2 目标数组s2地址 0x201060通过内存 Dump 提取s2的 34 字节数据s2_target[0x56,0x4E,0x57,0x58,0x51,0x51,0x09,0x46,0x17,0x46,0x54,0x5A,0x59,0x59,0x1F,0x48,0x32,0x5B,0x6B,0x7C,0x75,0x6E,0x7E,0x6E,0x2F,0x77,0x4F,0x7A,0x71,0x43,0x2B,0x26,0x89,0xFE]三、数学原理异或运算的可逆性异或运算XOR是本题破解的核心其数学性质决定了逆向的可行性3.1 异或的基本性质交换律a ^ b b ^ a结合律(a ^ b) ^ c a ^ (b ^ c)自反性a ^ a 0恒等性a ^ 0 a3.2 本题运算链推导根据程序逻辑s1经历两次异或处理后需等于s2初始处理s1_after_84A[i] s1_original[i] ^ (2*i 65)sub_84A 函数输入处理s1_final[i] s1_after_84A[i] ^ s_input[i]main 函数验证条件s1_final[i] s2_target[i]sub_916 函数联立得s1_original[i] ^ (2*i 65) ^ s_input[i] s2_target[i]根据异或性质移项推导输入的计算公式s_input[i] s1_original[i] ^ (2*i 65) ^ s2_target[i]四、解题实现Python 代码还原与验证4.1 核心代码实现defcrack_xxxorrr():# 1. 原始数据定义s1_original[0x71,0x61,0x73,0x78,0x63,0x79,0x74,0x67,0x73,0x61,0x73,0x78,0x63,0x76,0x72,0x65,0x66,0x67,0x68,0x6E,0x72,0x66,0x67,0x68,0x6E,0x6A,0x65,0x64,0x66,0x67,0x62,0x68,0x6E,0x00]s2_target[0x56,0x4E,0x57,0x58,0x51,0x51,0x09,0x46,0x17,0x46,0x54,0x5A,0x59,0x59,0x1F,0x48,0x32,0x5B,0x6B,0x7C,0x75,0x6E,0x7E,0x6E,0x2F,0x77,0x4F,0x7A,0x71,0x43,0x2B,0x26,0x89,0xFE]# 2. 计算输入s_input[]foriinrange(34):key2*i65# 动态密钥input_bytes1_original[i]^key^s2_target[i]s_input.append(input_byte)# 3. 验证结果verify[]foriinrange(34):key2*i65processeds1_original[i]^key^s_input[i]verify.append(processed)# 4. 转换为字符形式flag_chars[]forbyteins_input:if32byte126:# 可打印字符flag_chars.append(chr(byte))else:# 不可打印字符用\xXX表示flag_chars.append(f\\x{byte:02x})# 5. 输出结果print(fFlag: flag{{{.join(flag_chars)}}})print(f验证结果:{成功ifverifys2_targetelse失败})if__name____main__:crack_xxxorrr()4.2 执行结果与验证运行代码后得到Flag: flag{c0n5truct0r5_functi0n_in_41f} 验证结果: 成功验证过程至关重要通过反向模拟程序的异或处理流程确认推导的输入能使s1最终等于s2确保结果正确性。五、举一反三异或类逆向题通用解题框架5.1 题目特征识别当遇到以下特征时可判定为异或类逆向题程序中存在循环的^运算汇编中为xor指令存在明显的输入缓冲区和目标校验数组验证逻辑为字符串比较或内存比较如strcmp、memcmp5.2 通用解题步骤定位关键函数寻找输入处理函数通常含fgets、read等输入函数识别异或处理循环寻找数组遍历 xor操作确定验证函数含比较指令的函数提取核心数据原始数组被异或的初始数据目标数组验证的基准数据密钥信息固定密钥 / 动态密钥生成规则推导逆向公式正向流程建模目标 原始数据 ^ 密钥 ^ 输入逆向公式推导输入 原始数据 ^ 密钥 ^ 目标注意多轮异或的顺序利用结合律简化代码实现与验证用 Python 实现逆向计算处理字节数组方便模拟正向流程验证结果正确性处理不可打印字符保留原始字节或用 \xXX 表示5.3 实战案例扩展案例 1固定密钥异或若题目中使用固定密钥如key0x12则公式简化为输入 原始数据 ^ 固定密钥 ^ 目标案例 2密钥与输入相关若密钥依赖输入本身如key input[i-1]则需从第一个字节开始逐位推导利用已知条件如第一个字节的密钥常为固定值突破。案例 3多轮异或嵌套对于多轮异或如a ^ b ^ c ^ d 目标可通过结合律转化为a ^ (b ^ c ^ d) 目标逐步拆解运算链。六、总结xxxorrr 题目作为典型的异或类逆向题核心考察两点一是对程序隐藏流程如退出回调、初始化函数的识别能力二是对异或运算数学性质的灵活应用。通过本文的分析可见此类题目虽看似复杂但只要掌握 “流程建模→数据提取→公式推导→验证实现” 的解题框架就能快速突破。在 CTF 实战中面对异或类题目应牢记异或的可逆性本质通过动态调试与静态分析结合的方式厘清运算链再利用 Python 等工具快速实现逆向计算。随着对这类题目的深入理解读者将能应对更复杂的变异题型如嵌套异或、动态密钥异或等真正实现从 “会做题” 到 “会解题” 的跨越。