(sub_401890函数) 输入一串字符存入数组,判断每个元素是否为数字、小写/大写字母,若符合,分别对其进行:-48,-87,-29的操作,并将得到的新数组(字符串)作为参数a1传递给sub_4017f0函数进行第二部分处理。
(sub_4017f0函数) 定义了一个储存 “abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ”
的数组Str1,在while循环中:将a1的每个元素的值作为数组Str1的下标来访问数组中对应下标的字符并存储到Str1中。最后跳出while循环,令Str1与"KanXueCTF2019JustForhappy"字符串比较,若正确则pass!
解题思路按照流程来逆向推出输入的正确字符串。
第一步:先将"KanXueCTF2019JustForhappy" 与 “abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ” 进行比较,找出相同元素的下标:
key1="abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ" key2="KanXueCTF2019JustForhappy" index=[] v4=0 for i in range(len(key2)): for a in range(len(key1)): if key2[i] == key1[a]: index.append(a)
得到下标:[19, 0, 27, 59, 44, 4, 11, 55, 14, 30, 28, 29, 37, 18, 44, 42, 43, 14, 38, 41, 7, 0, 39, 39, 48]
第二步 :将第一步得出的下标数值按照流程中的判断输入字符串的条件来逆向分析还原输入的值:
v5=0 flag="" for i in index: if i >= 0 and i <= 9: v5=i+48 elif i >= 10 and i <= 35: v5=i+87 elif i >= 36: v5=i+29 flag+=chr(v5) print(flag)解密脚本 C语言:
#includepython脚本#include int main() { char key1[100] = "KanXueCTF2019JustForhappy"; char key2[100] = "abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ"; int i,j; char index[30] = {0}; char flag[100] = {0}; for(i=0;i = 0 && index[i] <= 9) { flag[i] =index[i]+48; } else if(index[i] >= 36) { flag[i] =index[i]+29; } else if(index[i] >= 10 && index[i] <= 35) { flag[i] =index[i]+87; } printf("%c ",flag[i]); } return 0; }
key1="abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ" key2="KanXueCTF2019JustForhappy" index=[] v4=0 for i in range(len(key2)): for a in range(len(key1)): if key2[i] == key1[a]: index.append(a) print(index) v5=0 flag="" for i in index: if i >= 0 and i <= 9: v5=i+48 elif i >= 10 and i <= 35: v5=i+87 elif i >= 36: v5=i+29 flag+=chr(v5) print(flag) flag
j0rXI4bTeustBiIGHeCF70DDM



