Crypto_BUUCTF_WriteUp | 看我回旋踢
题目
下载附件解压得到字符串:
synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}
分析
字符串里除去标志大括号,剩下的包括小写字母、数字和“-”符号。
字符串的形式和传统 flag 的形式很像但细看根本不是一个样,合理猜测“{”前的四个字母对应“flag”,打开 ASCII 码表对照发现“synt”的每个字母与“flag”前移 13 位一一对应,即将“f(70)”前移 13 位得到“s(83)”,以此类推。
于是我们将大括号内的每个字符都后移 13 位和除“-”外的每个字符后移 13 位的结果分别作为 flag 提交,都显示错误。
打开浏览器 😃
了解到如下:
套用 ROT13 到一段文字上仅仅只需要检查字元字母顺序并取代它在 13 位之后的对应字母,有需要超过时则重新绕回 26 英文字母开头即可。A 换成 N、B 换成 O、依此类推到 M 换成 Z,然后序列反转:N 换成 A、O 换成 B、最后 Z 换成 M。只有这些出现在英文字母里头的字元受影响;数字、符号、空白字元以及所有其他字元都不变。
于是将大括号内的字母 -13 后在小写字母范围内取模。(其实可以直接用 HackBar 或者其他工具在线解码)
char s[] = "synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}";
for (int i = 0; i < strlen(s); ++i) {
if (s[i] >= 'a' && s[i] <= 'z') {
s[i] -= 13;
if (s[i] < 'a') {
s[i] += 'z' - 'a' + 1;
}
}
}
printf("%s", s);
将输出的 flag 提交即可。
Flag
flag{5cd1004d-86a5-46d8-b720-beb5ba0417e1}