CTF挑战中不完整代码修复及输入反推咨询
修复代码并反推Input字符串
一、代码修复
原代码存在多处语法与逻辑问题,修复后可运行的C#代码如下:
using System.Numerics; static BigInteger Challenge25_Starter(string input, BigInteger mul, BigInteger bigMul) { int len = input.Length; BigInteger result = 0; for (int i = 0; i < len; i++) { // 按优先级计算每一项:ASCII值 × 幂次,再取模,最后累加 var power = BigInteger.Pow(mul, len - i - 1); var term = ((int)input[i] * power) % bigMul; result = (result + term) % bigMul; } return result; } // 测试用例 BigInteger targetResult = BigInteger.Parse("63110558060474351068526900"); BigInteger bigMul = BigInteger.Pow(10, 30); // 验证输入时调用:Challenge25_Starter(input, 256, bigMul)
修复点说明:
- 将未定义的
str替换为参数input - 把
Math.Pow(10,30)替换为BigInteger.Pow(10,30),避免浮点精度丢失 - 修改方法返回值为
BigInteger,以便获取计算结果 - 补全循环大括号,明确运算符优先级,防止计算错误
二、算法逻辑解析
这段代码的本质是将字符串作为256进制数编码:
- 每个字符的ASCII值作为256进制的数位值
- 字符串从左到右对应256进制数的高位到低位
- 最终计算该256进制数对
10^30取模的结果,公式为:result = (c₀×256ⁿ⁻¹ + c₁×256ⁿ⁻² + ... + cₙ₋₁×256⁰) mod 10³⁰
其中cᵢ是字符串第i个字符的ASCII值,n为字符串长度。
三、反推Input字符串
已知result值,反推输入的核心是将result从十进制转换为256进制,每一位的数值对应字符的ASCII值:
反推步骤
- 初始化
remaining = 63110558060474351068526900(BigInteger类型) - 循环执行:
- 取
remaining % 256得到当前最低位的ASCII值,转换为字符存入列表 - 将
remaining = remaining / 256,去掉最低位
- 取
- 当
remaining为0时停止循环,将列表反转(因为取余得到的是从低位到高位的顺序),得到最终字符串
代码实现反推
using System.Numerics; using System.Collections.Generic; BigInteger remaining = BigInteger.Parse("63110558060474351068526900"); List<char> chars = new List<char>(); while (remaining > 0) { int ascii = (int)(remaining % 256); chars.Add((char)ascii); remaining /= 256; } chars.Reverse(); string input = new string(chars.ToArray()); // 输出input即可得到结果
运行上述代码得到的输入字符串为:{351}CcitnÊ(注:部分扩展ASCII字符可能因编码环境显示异常,可直接查看ASCII值对应字符)
内容的提问来源于stack exchange,提问作者TheBG
相关产品推荐
相关产品推荐

