BUUCTF xor-学习笔记

📅 2026/7/28 19:44:46
BUUCTF xor-学习笔记
前置知识1、XOR加密机制正文一、UPX脱壳二、IDA静态分析三、编写XOR脚本计算有效 Flag前置知识1、XOR加密机制异或XOR是逆向题目中最常见的加密方式之一它的魅力在于可逆性。简单来说加密过程密文 明文 ^ 密钥解密过程明文 密文 ^ 密钥在本题里en[i]flag[i]^ flag[i-1]i ≥1且 ec[0]flag[0]首字符不变。解密时只需反向异或flag[i]enc[i]^ flag[i-1]已知 flag[0]en[0]。正文一、UPX脱壳使用exeinfope检查文件无壳。二、IDA静态分析用IDA软件打开F5反编译一下main函数// __fastcall调用约定main函数// argc命令行参数个数argv命令行参数数组envp环境变量数组int__fastcallmain(intargc,constchar**argv,constchar**envp){intn33;// 循环变量对应数组下标 [rsp2Ch] [rbp-124h]char__b[264];// 用户输入缓冲区存放flag大小264字节 [rsp40h] [rbp-110h] BYREF// memset(内存地址,填充值,填充字节长度)memset(__b,0,0x100u);// 在控制台打印提示文本printf(Input your flag:\n);// 自定义函数读取用户输入字符串最多读取256字节存入__bget_line(__b,256);// 条件1校验输入字符串长度必须严格等于33个字符// strlen(__b) 获取输入flag的字符长度if(strlen(__b)!33)gotoLABEL_7;// 长度不对直接跳转到失败输出// 循环 n33 从1 到 32n33 33for(n331;n3333;n33)// 核心加密运算当前字符 ^ 前一个字符// __b[n33] __b[n33] XOR __b[n33 - 1]// 正向操作b1 ^ b0; b2 ^ b1; b3 ^ b2 ... b32 ^ b31__b[n33]^__b[n33-1];// strncmp字符串固定长度比较比较前0x2133个字节// 将运算后的 __b 和全局数组 global 进行比对// global f\nk\fwO.\x11x\rZ;U\x11p\x19F\x1Fv\M#D\x0Eg\x06h\x0FG2Oif(!strncmp(__b,global,0x21u))printf(Success);// 匹配成功输出SuccesselseLABEL_7:printf(Failed);// 长度错误 / 运算后不匹配输出Failedreturn0;// 程序正常退出}得到逻辑如下接收用户输入的 flag存入数组 _b。判断输入长度是否为 33。对 _b 数组进行加密从第二个字符开始每个字符与前一个字符进行异或操作结果覆盖当前字符。加密后与全局变量 global 比较。若相等则输出成功。说明global存储的是密文解密后即为 flag。双击查看global的值shiftE ,对字符aFKWOXZUPFVMDGH导出导出来的字符会多一个0x0是字符串结束符\0但我们只比较33个有效字节0x2133三、编写XOR脚本计算有效 Flag编写exp脚本flagfen[0x66,0x0A,0x6B,0x0C,0x77,0x26,0x4F,0x2E,0x40,0x11,0x78,0x0D,0x5A,0x3B,0x55,0x11,0x70,0x19,0x46,0x1F,0x76,0x22,0x4D,0x23,0x44,0x0E,0x67,0x06,0x68,0x0F,0x47,0x32,0x4F]foriinrange(1,len(en)):flagchr(en[i]^en[i-1])print(flag)当然还有第二种导出方法脚本改成10进制的数字也能用flagfen[102,10,107,12,119,38,79,46,64,17,120,13,90,59,85,17,112,25,70,31,118,34,77,35,68,14,103,6,104,15,71,50,79,0]foriinrange(1,len(en)):flagchr(en[i]^en[i-1])print(flag)