nssctf_fakebase 下载是个python文件打开先解析代码for i in flag:tmp str(bin(ord(i)))[2:].zfill(8)每个字符转ascll码的8位二进制后去除前缀0b,然后左侧补0至8位b1 int(tmp,2)把temp的字符串当成二进制解析后再转化为整数int(tmp, 2)是 Python 的内置整数转换函数第二个参数2表示进制基数意思是把第一个参数tmp这个字符串当成二进制格式的数字来解析最终转换为十进制的整数。int(字符串, 基数)是固定用法基数可以是 2~36 之间的任意整数用来指定输入字符串的进制int(101, 2)→ 把101当二进制解析结果是十进制的5int(A, 16)→ 把A当十六进制解析结果是十进制的10while b1//31 ! 0:s s_box[b1%31]b1 b1//31当这个整数31时对31求余作为下表从s_box中取对应字符再对31整除相当于转化为31进制很明显是要写个逆向代码写解密脚本importlibnum s_boxqwertyuiopasdfghjkzxcvb123456#$su#k4ggia61egegzjuqz12jhfspfkayforkinrange(5):b1kforiins[::-1]:b1b1*31s_box.index(i)print(libnum.n2s(int(b1)))这是对应上一道自定义 Base31 加密题的解密脚本作用是反向还原加密前的明文 flag。它的核心逻辑是补回加密时丢失的最高位数字再通过反向进制转换把密文字符串还原成大整数最终转回可读的明文字符串。二、逐部分逐行解析1. 导入与基础定义import libnum s_box qwertyuiopasdfghjkzxcvb123456#$ s u#k4ggia61egegzjuqz12jhfspfkaylibnumCTF 逆向常用的数值处理库这里用到的n2s函数可以直接把十进制大整数转换成对应的字节字符串等价于 “整数转二进制→按 8 位切分→转 ASCII 字符” 的完整流程。s_box和加密代码完全一致的字符映射表31 个字符对应 31 进制的 0~30。s已知的密文字符串也就是加密后输出的结果。2. 外层循环爆破丢失的最高位for k in range(5): b1 k这是解密的关键加密时循环条件为b1//31 ! 0当商小于 31 时循环终止31 进制的最高位数字没有被存入密文直接丢失了。k就是我们补回来的最高位数字。range(5)表示先尝试 0~4 这 5 个小数值CTF flag 开头格式固定最高位通常很小逐个验证哪个能还原出可读的明文。b1 k把假设的最高位数字作为初始值后续逐步拼接低位数字。3. 内层循环反向还原大整数for i in s[::-1]: b1 b1*31 s_box.index(i)这是进制转换的反向计算和加密的「除基取余」完全对称s[::-1]密文倒序加密时先得到的余数是 31 进制的最低位后得到的是高位因此密文字符串是低位在前、高位在后。解密时要从最高位开始计算所以先把密文倒序处理顺序就变成了从高位到低位。s_box.index(i)字符转数字查找当前密文字符在s_box中的下标得到该位对应的 31 进制数字值0~30。b1 b1*31 当前位数字这是进制拼接的标准公式和十进制的123 ((1)*10 2)*10 3逻辑完全一致每处理一位就把当前数值左移一位乘基数 31再加上当前位的数字循环结束后就得到了完整的十进制大整数b14. 整数转字符串输出print(libnum.n2s(int(b1)))libnum.n2snumber to string把大整数按大端字节序每 8 位转成一个字节最终拼接成完整的明文字符串。每一轮 k 对应输出一个结果其中只有 1 个是可读、符合 CTF flag 格式的即为正确答案。得到flagNSSCTF{WHAt_BASe31}