隐写与压缩文件分析实战

今天我们用一道题来练习一下文件隐写与压缩文件分析

题目如下:

一上来就是一句“你现在离开还来得及”,但我们岂是能被一句话吓跑的人?

先用 binwalk 查一查图片是否有隐藏文件

成功分离出了 152090.zip 文件(其他两个为空文件)

打开后发现隐藏信息,但是数独在哪呢?

压缩包内有个 sudoku.png ,但是需要密码才能打开,这时候先考虑伪加密,用十六进制编辑器打开查看

尝试修改压缩包内 sudoku .png 文件的全局方位标识符,将 09 00 改为 00 00

再次用解压软件打开,发现这时 sudoku.png 已经可以解压出来了

我这么懒,当然不可能手动做咯 :)

import copy


class Sudoku:
    def __init__(self, sudoku):
        self._sudoku = sudoku
        self._solve_sudoku = copy.deepcopy(sudoku)
        self.__Solve()

    def solved(self):
        t = ('+' + '-' * 7) * 3 + '+\n'
        for i in range(9):
            t += '|'
            for j in range(9):
                t += ' ' + str(self._solve_sudoku[i][j])
                if (j + 1) % 3 == 0:
                    t += ' |'
            t += '\n'
            if (i + 1) % 3 == 0 and i != 8:
                t += ('+' + '-' * 7) * 3 + '+\n'
        t += ('+' + '-' * 7) * 3 + '+'
        return t

    def __findNextCellToFill(self, i, j):
        for x in range(i, 9):
            for y in range(j, 9):
                if self._solve_sudoku[x][y] == 0:
                    return x, y
        for x in range(0, 9):
            for y in range(0, 9):
                if self._solve_sudoku[x][y] == 0:
                    return x, y
        return -1, -1

    def __isValid(self, i, j, e):
        rowOk = all([e != self._solve_sudoku[i][x] for x in range(9)])
        if rowOk:
            columnOk = all([e != self._solve_sudoku[x][j] for x in range(9)])
            if columnOk:
                secTopX, secTopY = 3 * (i // 3), 3 * (j // 3)
                for x in range(secTopX, secTopX + 3):
                    for y in range(secTopY, secTopY + 3):
                        if self._solve_sudoku[x][y] == e:
                            return False
                return True
        return False

    def __Solve(self, i=0, j=0):
        i, j = self.__findNextCellToFill(i, j)
        if i == -1:
            return True
        for e in range(1, 10):
            if self.__isValid(i, j, e):
                self._solve_sudoku[i][j] = e
                if self.__Solve(i, j):
                    return True
                self._solve_sudoku[i][j] = 0
        return False

if __name__ == '__main__':
    sdk = [
        [9, 0, 5, 0, 1, 0, 0, 0, 0],
        [0, 6, 0, 9, 0, 3, 1, 0, 0],
        [0, 4, 0, 8, 0, 0, 0, 9, 0],
        [0, 7, 0, 0, 0, 0, 6, 0, 1],
        [3, 1, 0, 0, 0, 0, 8, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0],
        [6, 2, 4, 0, 9, 0, 0, 0, 0],
        [0, 0, 0, 4, 8, 0, 0, 0, 0],
        [0, 0, 7, 2, 0, 0, 0, 5, 4]
    ]
    a = Sudoku(sdk)
    print(a.solved())

解出81位密码 935714286268953147741826593479538621312649875586172439624395718153487962897261354

解压 152090.zip 后我们打开 flag2.zip 又被 “劝退” 了

文件又都是加密的!猜测注释即是 说明.txt 的内容,我们将注释这句话写入新建文件 说明.txt 中,并也以zip格式压缩

相同的CRC校验码,那我们开始明文攻击

顺利解出,得到 flag.zip ,打开

根据提示,先制作字典文件

with open('dic.txt', 'w') as f_obj:
    for i in range(0, 1000000):
        f_obj.write("43%06d23\n"%i)

然后进行密码爆破(电脑比较差,花了一点时间)

解压文件后得到一张很普通的图片,然后线索似乎断了,后来在网上找到一个软件 silenteye 与图片名字 open your eye.jpg 貌似有一些联系 :)

用默认密码decode一下,解出了一个 flag.txt

密密麻麻的看着像16进制的文本,baidu发现

用16进制文本制作.pyc文件

import binascii
with open('flag.txt', 'r') as f_obj:
    a = f_obj.read()
with open('flag.pyc', 'wb') as f_obj:
    a = binascii.a2b_hex(a)
    f_obj.write(a)

然后进行反编译

尝试执行,但是没有输出,审计一下代码,多次尝试后

此处 check(0) 改为 check(1) ,重新执行

get it !


相关推荐

发表评论

路人甲

网友评论(2)

也就亿点点难
QQ账号错误 4个月前 (2020-03-09) 回复
kb队长下次我们两个比比看是你程序写的快还是我手数独算快,你这操作也太骚气了,还有这题套娃也有亿手。
QQ账号错误 4个月前 (2020-03-09) 回复