Misc常用编码之我的秘密与你共享
2023-3-1 18:3:58 Author: Ms08067安全实验室(查看原文) 阅读量:12 收藏

文章来源 |MS08067 CTF实战1期作业

本文作者:dullydoll(CTF实战1期学员)

0和1能隐藏什么信息

根据题目所提供的01序列,猜测可能是二维码,编写转换代码对其进行二维码转换,具体如下:

from PIL import Image
from zlib import *

str = open("0和1能隐藏什么信息.txt").read()
# print(str)

MAX = 330
pic = Image.new("RGB", (MAX, MAX))
i = 0
for y in range(0, MAX):
    for x in range(0, MAX):
        if(str[i] == '1'):
            pic.putpixel([x,y],(0,0,0))
        else:
            pic.putpixel([x,y],(255,255,255))
        i += 1
pic.show()
pic.save("m_3_1_flag.png")

转换结果如下图所示:

发现如果把上述结果划分为2*2的拼图,其位置需要调整。调整后得到真正的二维码如下图所示:

利用QR_Research工具扫描得到flag,如下图所示:

1.png(基于CRC的宽高爆破)

通过分析题目原始图片可以判断,图片显示不完整。将其载入010Editor编辑器可以看到,宽高值所在的数据区段CRC值报错,如下图所示:

因此编写相应代码对其宽高值进行爆破,具体如下:

import binascii
import struct
import datetime

start = datetime.datetime.now()

crcbp = open("1.png""rb").read()
for i in range(2000):
    for j in range(2000):
        data = crcbp[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + crcbp[24:29]
        crc32 = binascii.crc32(data) & 0xffffffff
        if crc32 == 0x6C7DB8B:
            print(i, j)
            print('hex: ', hex(i), hex(j))

end = datetime.datetime.now()

print("Running time: %s Seconds" % (end-start))

根据上述代码运行结果对原始图片宽高值进行修改,最终从完整图片中获得flag,如下图所示:

100.gif(GIF帧间时间间隔隐藏信息)

通过分析题目所提供的GIF图片,判断其应该是通过GIF时间轴的帧间间隔来隐藏信息。首先通过identify命令来查看帧间间隔,结果如下图所示:

由命令执行结果可知判断正确。之后通过shell命令组合将上述结果转换为01序列,如下图所示:

最后通过在线站点将上述结果转换为ASCII字符,最终获得flag,如下图所示:

flag就在一瞬间

查看题目所提供的GIF图片发现闪现一张二维码,因此首先利用StegSolve工具载入图片逐帧查看找到二维码,如下图所示:

我们发现上述二维码并不完整,缺少定位格。之后通过PS补全二维码,如下图所示:

最后利用QR_Research工具扫描二维码,获得flag,如下图所示:

lsb.png(LSB隐藏信息)

利用StegSolve工具载入题目图片,通过查看RGB各通道组合的图片效果,确定Red-0、Green-0、Blue-0通道有信息隐藏,如下图所示:

查看隐藏信息确定其为PNG格式的图片,将其保存查看,发现是一张二维码,如下图所示:

最后利用QR_Research工具扫描二维码,获得flag,如下图所示:

降龙十八掌

首先利用apngdis工具将题目图片切分为静态png图片集,如下图所示:

通过分析上述图片集发现每张图片上有像素值为(6,7,8)的点,因此编写相关代码将每张图片上的点提取组合,具体代码如下:

import os
from PIL import Image

flag_img = Image.new('RGB', (350, 400), "white")
path = r"./apng"
for root, dirs, files in os.walk(path):
    for name in files:
        png_path = os.path.join(root, name)
        image = Image.open(png_path)
        image = image.convert("RGB")
        width, height = image.size
        for w in range(width):
            for h in range(height):
                if image.getpixel((w, h)) == (6,7,8):
                    flag_img.putpixel((h, w), 0)
flag_img.save("flag.png")
flag_img.show()

代码执行结果如下图所示:

结果获取一张不完整的二维码图片。利用PS将其补全,然后利用QR_Research工具扫描,最终获取flag,如下图所示:

课后练习(拼二维码)

利用PS工具将二维码碎片调整拼接,最终获得一张二维码,如下图所示:

利用手机扫描上述二维码,最终获得flag,如下图所示:

怎么全是数字

分析题目所提供的数据,发现每行三个数值为一组,且所有数值没有超过255,因此判断其为RGB值集合。编写相应代码对原始数据进行还原,具体代码如下:

from PIL import Image

x = 2305
y = 1181
image = Image.new("RGB",(x,y))
f = open("怎么全是数字.txt")

for i in range(0, x):
    for j in range(0, y):
        line = f.readline()
        rgb = line.split(" ")
        image.putpixel((i,j), (int(rgb[0]),int(rgb[1]),int(rgb[2])))
image.show()
image.save("flag.png")

代码执行结果如下图所示:

找一个QQ号

题目所提供的JPG图片,右下角即存在QQ号水印,如下图所示:

如果你也想零基础开启CTF之路

看这里👇👇👇

—  实验室旗下直播培训课程  —


来和20000+位同学加入MS08067一起学习吧!


文章来源: http://mp.weixin.qq.com/s?__biz=MzU1NjgzOTAyMg==&mid=2247506593&idx=1&sn=6f3a8bf874ccd813b2f74d351024b88f&chksm=fc3c63a0cb4beab6e3f8c2f20201857ccfd8898388662f2a9a16879d4e8ff192373279a16d64#rd
如有侵权请联系:admin#unsafe.sh