上一年年末的时候就很期待看雪的CTF对抗赛,虽然知道自己是个菜鸟,但还是想着一定要参与一下,3月份Q1晋级赛被错过了,现在只好拿题来做一下,反正做不出来也有其他网友的答题分析可以学习
双击运行exe文件
随便输入后,错误则显示错了“加油”
IDA打开exe
查看strings window
查看字符串在文本视图中的位置
进入图形视图,查看调用
进入调用方法
aAbcdefghiabcde 中存储了字符串’abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ’,该方法并没有获取输入字符串的方法,所以还要查看上级调用
可以看到这个就是主方法了
解密
获取输入字符串后,如果长度为0,弹出‘’请输入pass!‘’提示。
字符串不为空,遍历得到每一个char,经过计算后得到int数组,传入下一个方法
直接进入while循环
DWORD占4个字节,所以a1+4*v4代表当前字节索引位置,while循环就是依次取出int数组的每一个数字作为索引得到aAbcdefghiabcde中的char存入密文字符串Str1,只有密文等于”KanXueCTF2019JustForhappy”才能胜利,所以反推写出一个程序来就可以得到明文
class Untitled {
public static void main(String[] args) {
String str="abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ";
String sec="KanXueCTF2019JustForhappy";
StringBuffer sb=new StringBuffer();
for(int i=0;i<sec.length();i++){
sb.append((char)getInt(str.indexOf(sec.charAt(i))));
}
System.out.println(sb.toString());
}
public static int getInt(int result){
if (result+48<=57 && result+48>=48){
return result+48;
}else if (result+87<=122 && result+87>=97){
return result+87;
}else {
return result+29;
}
}
}
运行得到结果:
j0rXI4bTeustBiIGHeCF70DDM
输入后返回Success
总结
本题还是比较简单的,和之前做的消失的岛屿一题很像,还是比较容易的。