zoukankan      html  css  js  c++  java
  • 尝试用代码解CTF题-找茬游戏


    今天玩一个找茬游戏。但是我们不是用眼睛找,我们用代码找。

    本文实验地址(复制链接做实验):

    实验:找茬游戏(合天网安实验室)

    最近做的题基本都是用工具做题,这次来尝试一下用代码解题。

    来看题目解压附件cry200.zip,得到两张图片(附件在c盘根目录下的解密200文件夹中)

    我们一般就是比较两张图片的像素,用程序进行对比(这段代码在c盘根目录下的解密200文件夹中有)

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    public class PicTest2 {
    public static void main(String[] args) throws IOException {
    int i,j;
    int rgb1[] = new int[3];
    int rgb2[] = new int[3];
    File file1 = new File("C:1.png");// 实例化file对象,并设置读取图片路径
    File file2 = new File("C:2.png");
    File file3 = new File("C:3.png");
    BufferedImage bi1 = null; // 像素缓冲区开始为空
    BufferedImage bi2 = null;
    BufferedImage bi3 = null;
    bi1 = ImageIO.read(file1);
    bi2 = ImageIO.read(file2);
    bi3 = ImageIO.read(file3);
    int width = bi1.getWidth();
    int height = bi1.getHeight();
    for (i = 0; i < width; i++) {
    for (j = 0; j < height; j++) {
    int pixel1 = bi1.getRGB(i, j);
    rgb1[0] = (pixel1 & 0xff0000) >> 16;
    rgb1[1] = (pixel1 & 0xff00) >> 8;
    rgb1[2] = (pixel1 & 0xff);
    int pixel2 = bi2.getRGB(i, j);
    rgb2[0] = (pixel2 & 0xff0000) >> 16;
    rgb2[1] = (pixel2 & 0xff00) >> 8;
    rgb2[2] = (pixel2 & 0xff);
    bi3.setRGB(i, j, Integer.parseInt(Integer.toHexString(rgb1[0]^rgb2[0])+Integer.toHexString(rgb1[1]^rgb2[1])+Integer.toHexString(rgb1[2]^rgb2[2]),16));
    }
    }
    ImageIO.write(bi3, "PNG", file3); //写入文件
    }
    }
    

    这里运行没有成功,看一下代码里面的地址。需要把1.png和2.png放到c盘根目录下(程序中已经指定为c盘根目录)把1.png复制到c盘根目录下一份,重命名为3.png打开eclipse,新建一个工程,运行代码(自己安装eclipse,安装程序在c盘根目录下的解密200文件夹中有)

    然后打开3.png,如下图

    隐隐约约可以看到图中有个二维码(这是真的很隐约)

    那我们再加点代码让他看得更清楚些在ImageIO.write(bi3, "PNG", file3); 上面加入下面的代码(需要添加的这段代码在c盘根目录下的解密200文件夹中有)

    for (i = 0; i < width; i++) {
    for (j = 0; j < height; j++) {
    //System.out.println(bi3.getRGB(i, j));
    if(bi3.getRGB(i, j)==-16777216) bi3.setRGB(i, j, -1);
    }
    }
    

    添加了代码之后,再运行

    再次打开3.png,如下图

    扫码即可得到flag。

    这道题是真题,当年难倒了一大片人。题目有迷惑性,要用程序对比像素。用代码解游戏题虽然是一种思路,但是速度应该会慢一些。

    合天智汇:合天网络靶场、网安实战虚拟环境
  • 相关阅读:
    偶串_牛客网
    制造回文_牛客网
    字典树(前缀树)的实现
    动态规划LeetCode174地下城游戏
    动态规划LeetCode64最小路径和
    动态规划LeetCode300最长上升子序列
    动态规划LeetCode120三角形最小路径和
    Zabbix 监控sqlserver
    如何回收VCSA 6自带的vPostgres数据库空间
    领益科技:导出Wireless组中的成员
  • 原文地址:https://www.cnblogs.com/hetianlab/p/14630879.html
Copyright © 2011-2022 走看看