题目RE文件在逆向工程中.re文件通常是某个分析工具保存的工作成果它包含了反汇编代码、函数名、注释、结构体定义、流程图等分析师添加的所有标记。常见分析流程静态分析IDA ProGhidra动态分析调试器x64dbg / gdb沙箱环境大致步骤确认文件类型PE / ELF / APK 等看字符串、导入表找入口函数分析关键逻辑解题思路运用IDA反编译F5查看入口函数可以看出是一个密码输入函数且存在if判断__int64 __fastcall main(int a1, char **a2, char **a3) { char s[264]; // [rsp0h] [rbp-110h] BYREF //声明一个264位字符数组s作为输入缓冲区 unsigned __int64 v5; // [rsp108h] [rbp-8h] v5 __readfsqword(0x28u); printf(Enter the password: ); if ( !fgets(s, 255, stdin) ) //使用fgets从标准输入stdin读取最多255个字符到s中 return 0LL; if ( (unsigned int)sub_4006FD(s) ) //调用函数 sub_4006FD(s)将用户输入作为参数传递 { puts(Incorrect password!); return 1LL; } else { puts(Nice!); return 0LL; } } /* 程序逻辑 1. 程序提示输入密码 2. 用fgets读取输入最多 255 字符 3. 把你输入的内容丢进一个函数检查 4. 判断结果 返回 非 0 → 错误 返回 0 → 正确 */能够看出真正的密码验证逻辑隐藏在函数sub_4006FD中函数内部可能会包含比较密码的算法打开函数sub_4006FD__int64 __fastcall sub_4006FD(__int64 a1) //a1 是传入的字符串指针用户输入 { int i; // [rsp14h] [rbp-24h] __int64 v3[4]; // [rsp18h] [rbp-20h] //v3 是一个包含 3 个字符串的数组 v3[0] (__int64)Dufhbmf; v3[1] (__int64)pGimos; v3[2] (__int64)ewUglpt; for ( i 0; i 11; i ) { if ( *(char *)(v3[i % 3] 2 * (i / 3)) - *(char *)(i a1) ! 1 ) //这里char*是输入的s数组的指针 return 1LL; } return 0LL; }核心校验逻辑为if ( *(char *)(v3[i % 3] 2 * (i / 3)) - *(char *)(i a1) ! 1 );相当于输入字符 v3字符 - 1其中i % 3→ 选择v3[0]、v3[1]、v3[2]中的一个i / 3→ 0,0,0, 1,1,1, 2,2,2, 3,3,3整数除法2 * (i / 3)→ 0,0,0, 2,2,2, 4,4,4, 6,6,6所取字符的位置:v3[i%3][2*(i/3)]从三个字符串中轮流取字符每次取的位置是 0,2,4,6:i来源字符串位置字符减1后0v3[0]0DC1v3[1]0po2v3[2]0ed3v3[0]2fe4v3[1]2_5v3[2]2UT6v3[0]4ba7v3[1]4ml8v3[2]4lk9v3[0]6fe10v3[1]6sr11v3[2]6ts答案:Code_Talkers总结“字符交错 每位减1”的简单混淆题