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

  • 1
  • 8,189 次浏览
  • A+
所属分类:逆向工程

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

附件给了一个压缩包,伪加密,使用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}

 

————————————————

版权声明:本文为CSDN博主「Rr.0」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/robacco/article/details/104829494

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: