Misc 第七篇——base64stego(伪加密,base64隐写)

题目描述:菜狗经过几天的学习,终于发现了如来十三掌最后一步的精髓

附件给了一个压缩包,伪加密,使用360解压缩成功解压。

解压后是一个文本文件,如下图,使用base64加密的一堆字符串,

单纯使用base64解密,得到的是一堆关于隐写术的介绍,再结合题目标题,考虑是base64隐写题。

根据base64隐写的原理可得出结论:

1、base64加密后结尾无“=”号的无隐写位。

2、base64加密后结尾有1个“=”号的有2位隐写位。

3、base64加密后结尾有2个“=”号的有4位隐写位。

编码思想:首先判断每行数据的可隐写位数,然后将可隐写的每行最后一个字符根据base64码表,对应到相应的值,接着转为二进制,根据可隐写位数截取相应的位数,然后拼接这些隐写位,最后从左到右每8位一组截取二进制,分别将其转为十进制并对应ASCII码表,打印出相应的字符即可得到flag。

给出Java代码:(,,,到目前做CTF的题都是使用Java,Python是玩CTF的主流语言,后面会开始使用Python,不知道有没有人也是用的Java搞ctf,,,,,,,,,,)

public class Misc_010 {
	public static void main(String[] args) throws IOException {
		String row="";         //存放行
		String lastString="";  //存放最后一个字符
		StringBuffer bin= new StringBuffer();  //存放隐写的二进制
		String b="";
		String base64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  //base64码表
		FileReader file = null;
		file = new FileReader("E:\\CTF\\newhand\\a2eb7ceaf5ab49f7acb33de2e7eed74a\\stego1.txt");
		
		BufferedReader bReader=new BufferedReader(file);
		row=bReader.readLine();
		
		while(row != null){
			if (row.contains("=")) {
				if(row.contains("==")){
                    //两个等号
					lastString=row.replace("=", "").substring(row.length()-3);
					b=Integer.toBinaryString(base64.indexOf(lastString));
					if(b.length()>=4){
						bin.append(b.substring(b.length()-4));
					}
					else{
						
						DecimalFormat g1=new DecimalFormat("0000");
				        b= g1.format(Integer.valueOf(b));
				        bin.append(b);
					}
				}
				else {
                    //一个等号
					lastString=row.replace("=", "").substring(row.length()-2);
					b=Integer.toBinaryString(base64.indexOf(lastString));
					if(b.length()>=2){
						//System.out.println(b.substring(b.length()-2));
						bin.append(b.substring(b.length()-2));
					}
					else {
						DecimalFormat g1=new DecimalFormat("00");
				        b= g1.format(Integer.valueOf(b));
				        bin.append(b);
					}
				}
			}
			
			row=bReader.readLine();
		}
		//System.out.println(bin);//测试 打印隐写的二进制
		for(int i=0;i<bin.length()-2;i+=8){
			//每8位一组转换为十进制,并根据ASCII码表,强制转为字符,得flag		                System.out.print((char)Integer.parseInt(Long.toString(Long.parseLong(bin.substring(i, i+8),2))));
		}
	}
	
}

运行结果:

本题flag:flag{Base_sixty_four_point_five}

发布了57 篇原创文章 · 获赞 58 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/robacco/article/details/104829494