看雪CTF2019 Q1流浪者

CTF题目解析思路

Posted by JovenHe on June 24, 2019

上一年年末的时候就很期待看雪的CTF对抗赛,虽然知道自己是个菜鸟,但还是想着一定要参与一下,3月份Q1晋级赛被错过了,现在只好拿题来做一下,反正做不出来也有其他网友的答题分析可以学习

双击运行exe文件

错误显示.png

随便输入后,错误则显示错了“加油”

IDA打开exe

查看strings window

查看strings.png

查看字符串在文本视图中的位置

在文本视图.png

进入图形视图,查看调用

查找方法调用.png

进入调用方法

密文对比方法.png

aAbcdefghiabcde 中存储了字符串’abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ’,该方法并没有获取输入字符串的方法,所以还要查看上级调用

查找调用2.png

主入口.png

可以看到这个就是主方法了

解密

获取输入字符串后,如果长度为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

成功.png

总结

本题还是比较简单的,和之前做的消失的岛屿一题很像,还是比较容易的。