情诗网 >套路情话 > 正文

隐写中的套路

来源:情诗网    2020-12-26    分类:套路情话

记录一道很有意思的隐写题目
遵循一般步骤,先右键图片属性看详细信息,然后分析十六进制,文件头文件尾等
最后载入stegsolve观察各个通道,注意到 red,green,blue 三个通道0 均有异常,猜测是 lsb隐写

image.png

然后进行数据提取

image.png

将RGB排列顺序切换到BGR的时候发现PNG文件头,保存为二进制文件
然后载入010 editor打开,去掉头部多余的fffe,此时图片就可以预览了,看到是半个二维码
进行 crc 爆破文件宽度和高度

# coding: utf-8
import os
import binascii
import struct


misc = open("png2.png", "rb").read()

for i in range(1024):
    for j in range(1024):
        data = misc[12:16] + struct.pack('>i',i) + struct.pack('>i', j) + misc[24:29]
        crc32 = binascii.crc32(data) & 0xffffffff
        if crc32 == 0x08ec7edb:
            print i, j

也可以直接修改图片高度(windows 会忽略掉错误的crc校验,图片仍可以打开),显示完整二维码
下一步用PS反色,依次 (图像 -> 调整 -> 反相)
扫描二维码,下载到一个rar压缩文件
解压缩打开flag.txt,显示

image.png

好吧,其实我心态是崩溃的

注意到解压前压缩包大小 766 b,解压后 63,问题应该出在压缩包上

载入 010 editor
仔细查看发现有个 flag.pyc
不过解压时为什么没有识别出来...

image.png

那么现在问题就是怎么把 flag.pyc 提出来了

首先了解一下 rar 文件结构

rar 是由一个一个 block 组成的,每个 block 有以下几个部分

HEAD_CRC    2   全部块或块部分的CRC
HEAD_TYPE   1   块类型
HEAD_FLAGS  2   阻止标志
HEAD_SIZE   2   块大小
ADD_SIZE    4   可选字段 - 添加块大小

手动将 block[1] 的类型改成 file or directory

image.png

然后解压会报错但是可以解压成功
我们得到 一个 pyc 文件

在线反编译失败,我们使用 pycdc 反编译成功得到 py 文件

# Source Generated with Decompyle++
# File: STM (Python 2.7)

import base64

def encode():
    flag = '*************'
    ciphertext = []
    for i in range(len(flag)):
        s = chr(i ^ ord(flag[i]))
        if i % 2 == 0:
            s = ord(s) + 10
        else:
            s = ord(s) - 10
        ciphertext.append(str(s))
    
    return ciphertext[::-1]

ciphertext = [
    '96',
    '65',
    '93',
    '123',
    '91',
    '97',
    '22',
    '93',
    '70',
    '102',
    '94',
    '132',
    '46',
    '112',
    '64',
    '97',
    '88',
    '80',
    '82',
    '137',
    '90',
    '109',
    '99',
    '112']

根据 encode 编写 decode 代码

def decode(ciphertext):
    flag = ""
    text = ciphertext[::-1]
    for i in range(len(text)):
        s = int(text[i])
        if i % 2 == 0:
            s = chr(s - 10)
        else:
            s = chr(s + 10)
        s = chr(ord(s) ^ i)
        flag += s
    print flag

即可得到 flag

image.png

热门文章