WP CTF-Misc 攻防世界 CSFJ0967 Let_god_knows

「附件」

题目描述:
让苍天知道,你不认输?

附件下载解压,得到一个bmp图片

「思路」

使用Stegsolve找图片隐写,在Red plane 0 中发现清晰二维码。

CQR扫码得到flag。

「工具」

  • Stegsolve
  • CQR

「知识拓展」

转载:官方WP

出题思路

使用传统图片隐写方法LSBS,将270270px的二维码图片分解为2727的方块矩阵,去除上下左右10px宽度的白色边框后变为2525的方块矩阵,将黑色方块看做1,白色方块看做0,变成一个2525的矩阵。
自RGB图0x233*0x233px的位置开始,将二维码的01矩阵隐写入R通道的最后1bit中。

def encode():
    img = cv2.imread(data_path + "test.jpg")
    flag = cv2.imread(data_path + "flag.png")
    start = 0x233

    for i in range(start, start + 25):
        for j in range(start, start + 25):
            if list(flag[(2+i-start)*10-5][(2+j-start)*10-5]) == [255, 255, 255]:
                img[i][j][2]  = img[i][j][2] & 254      # white: 0
            else:
                img[i][j][2]  = img[i][j][2] | 1        # black: 1

    cv2.imwrite(data_path + "Let_god_knows.bmp", img)

解题思路

使用StegSolve工具找到Red plane 0,保存图片后放大即可看到二维码,扫码得flag。

python还原二维码逆过程代码如下:

def decode():
    img2 = cv2.imread(data_path + "Let_god_knows.bmp")
    start = 0x233
    resolve = [[[255, 255, 255] for i in range(27)]]

    for i in range(start, start + 25):
        col = [[255, 255, 255]]
        for j in range(start, start + 25):
            if img2[i][j][2] & 1 == 0:
                col.append([255, 255, 255])
            else:
                col.append([0, 0, 0])
        col.append([255, 255, 255])
        resolve.append(col)
    resolve.append([[255, 255, 255] for i in range(27)])

    cv2.imwrite(data_path + "recovered.bmp", np.array(resolve))
posted @ 2023-06-25 21:08  没事摸摸小肚子  阅读(207)  评论(0编辑  收藏  举报