Misc:zm.png图片隐写

本文介绍了如何通过Python处理一个包含zlib压缩数据的PNG图片,解压后将其转换为二进制并插入特定位,最终生成二维码的过程。过程中涉及到了zlib库的使用和二进制数据的操作技巧。
该文章已生成可运行项目,

考点:

        图片隐写、zlib解压、二进制转二维码

题目:f5fa688855514d3ea4249eca0e6675ac.png

1.拿到题目先使zsteg查看png图片内容,发现zlib数据。

719b99e6a5134b6686a3f6ba6daf2adb.png

2.使用010edit分离zlib文件到独立文件。

18610088c89546c98d2ecfb246752fa4.png

3.解压zlib文件

import zlib

with open('download.zlib', 'rb') as f:
    compressed_data = f.read()
    decompressed_data = zlib.decompress(compressed_data)
    
    # 将解压后的内容保存到新的文件中
    with open('decompressed_file.txt', 'wb') as output_file:
        output_file.write(decompressed_data)

4.解压后为二进制文件

111111100000010010111111110000010110100101010000011011101001111110101011101101110101100011000101110110111010101010000010111011000001001010100001000001111111101010101010111111100000000111111000000000000101111010110001111011110111110000001000100011001011010110110001011111000010011110100001000110000101001011100011011110100000101010100101011111001101000011101000011011011111011010010011001100010001011001001110001011011111101100000000011101111100010010111111100100001010101010110000010111001101000110011011101011011001111111011101110101101010010110111110111010001010111000110111000001010111101001100111111111100011110110101000

93da887addb7486ca1d6bc0ad0d34f1e.png

5.在二进制数最后任意填充一位0或1,使为变为偶数,再使用随波逐流工具生成图片

a34fac0dbea54b21a63f4363c752efb8.png

或用脚本进行二进制转图片操作:

#-*- coding:utf-8 -*-
import binascii
from PIL import Image

string = '1111111000000100101111111100000101101001010100000110111010011111101010111011011101011000110001011101101110101010100000101110110000010010101000010000011111111010101010101111111000000001111110000000000001011110101100011110111101111100000010001000110010110101101100010111110000100111101000010001100001010010111000110111101000001010101001010111110011010000111010000110110111110110100100110011000100010110010011100010110111111011000000000111011111000100101111111001000010101010101100000101110011010001100110111010110110011111110111011101011010100101101111101110100010101110001101110000010101111010011001111111111000111101101010001'
MAX_num = len(string)                      
#对数据数目开平方根,因为二维码是正方形。
MAX=int(MAX_num ** 0.5)                 
pic = Image.new("RGB", (MAX, MAX))
i = 0
for y in range(0, MAX):
    for x in range(0, MAX):
        if(string[i] == '1'):
            #putpixel将坐标为(x,y)的像素点变为(0,0,0)
            pic.putpixel([x, y], (0, 0, 0))     
        else:
            #putpixel将坐标为(x,y)的像素点变为(255,255,255)
            pic.putpixel([x, y], (255, 255, 255))     
        i = i + 1
pic.show()
pic.save("qr.png")

 

输出的图片如图,放大直接用微信扫得到flag

de73423bf5cd4995bbbc06afa4cdcb02.png.

1a17dde304734ff8aca0eeb75b573c46.png

本题坑点:

二进制数少一位,造成直接转换的话图片为乱码如下图:

555d749881b54dab8a0b94571ceca29e.png

 

 

本文章已经生成可运行项目
<think>我们面对的是一个CTF Misc题目,已经分离出5个文件:两个zip压缩包(00002456.zip、00002460.zip),一个sx文件(00002482.sx),两个png图片(00002466.png、00002484.png)。我们需要找到flag。根据CTF的常见思路,我们需要分析这些文件,尝试提取藏信息。 参考提供的引用,我们可以得到一些思路: 1. 引用[2]中提到,打开文件看到一堆代码,如果是十六进制编码,可以尝试解码,然后发现base64编码的图片,再转图片得到flag。 2. 引用[5]中提到了使用Unhide Files选项,选择Blowfish加密,密钥解密,以及使用PIL库处理图片。 另外,引用[3]提到通过post传参得到flag,但这里不太适用。引用[4]是比赛目录,没有直接帮助。 因此,我们可以按照以下步骤进行: 1. **检查文件类型**:使用`file`命令或十六进制编辑器查看每个文件的真实类型,因为文件扩展名可能被修改。例如,.sx文件可能是某种自定义格式,也可能是伪装的。 2. **尝试解压zip文件**:首先尝试解压两个zip文件(00002456.zip和00002460.zip)。如果它们有密码,则需要寻找密码。密码可能在其他文件中藏,比如图片、文本文件等。 3. **分析png图片**:使用常见的图片分析工具检查两个png图片(00002466.png和00002484.png)。例如: - 使用`binwalk`检查是否藏了其他文件。 - 使用`steghide`尝试提取藏信息(如果有密码,需要猜测密码)。 - 使用`zsteg`检查LSB。 - 查看图片属性、Exif信息,可能藏线索。 - 引用[5]中的方法:通过提取每个像素的RGB的最低有效位(LSB),然后进行异或等操作得到藏信息。 4. **分析sx文件**:.sx文件可能是未知格式。我们可以用文本编辑器或十六进制编辑器打开查看。如果包含可读字符串,可能提示下一步操作。也可能是某种编码的数据,需要转换。 5. **文件之间的关联**:注意这些文件可能是相互关联的。例如,zip文件的密码可能藏在某个图片中,或者sx文件需要和png文件结合使用。 具体步骤建议: **步骤1:检查文件类型** 对每个文件执行: ```bash file 00002456.zip file 00002460.zip file 00002482.sx file 00002466.png file 00002484.png ``` 如果结果显示zip文件实际上是其他类型,则按实际类型处理。比如,如果zip文件是png,则重命名为.png查看。 **步骤2:处理zip文件** 尝试解压: ```bash unzip 00002456.zip unzip 00002460.zip ``` 如果提示需要密码,则尝试常见的弱密码(如空密码、123456、password等),或者从其他文件中寻找密码。 **步骤3:分析png图片** - 使用`exiftool`查看图片的元数据: ```bash exiftool 00002466.png exiftool 00002484.png ``` - 使用`zsteg`检查LSB(针对PNG和BMP): ```bash zsteg 00002466.png zsteg 00002484.png ``` - 使用`steghide`提取藏信息(如果有嵌入数据且知道密码): ```bash steghide extract -sf 00002466.png # 如果没有密码,按回车尝试空密码 steghide extract -sf 00002484.png ``` 如果不知道密码,可以尝试从其他文件获取线索,或者尝试空密码、常见密码。 - 进行LSB分析:可以编脚本提取每个颜色通道的LSB,然后组合。引用[5]中提供了一个例子:提取RGB每个通道的最低位,然后进行异或操作(r^g^b),然后将结果生成二值图像。这种方法可以尝试。 **步骤4:分析sx文件** 用十六进制查看器(如`xxd`)或文本编辑器打开,观察文件头和内容。如果看到特定文件头(如PNG的`89 50 4E 47`,ZIP的`50 4B 03 04`等),则说明是伪装的,将文件扩展名改为正确的。如果看到可读字符串,可能包含线索。 如果sx文件是文本,可以尝试读取: ```bash cat 00002482.sx ``` **步骤5:综合线索** - 如果解压zip文件得到新文件,继续分析新文件。 - 如果图片分析得到密码,则用密码解压zip。 - 注意:sx文件可能是加密的,需要密钥,而密钥可能藏在图片中。 由于题目中提到了5个文件,我们还需要注意文件名中的数字,可能是某种顺序(如按数字排序)或索引。 **尝试引用[5]中的方法处理图片** 我们可以尝试用类似引用[5]的脚本处理两个png图片,看是否能得到藏信息。修改脚本以适应我们的需求。 例如,针对一张图片,提取每个像素RGB的LSB,然后将这些比特组合起来。引用[5]中是将每个像素的RGB的LSB进行异或(r^g^b),然后将结果为1的位置设为255(白色),0的位置不变(黑色?),然后生成一张新的二值图像。 我们修改脚本,分别处理两张图片: ```python from PIL import Image # 处理00002466.png img1 = Image.open('00002466.png').convert('RGB') width, height = img1.size pixels1 = img1.load() # 创建一个新的图像用于显示提取的LSB信息(按引用[5]方法) flag_bits = [] for y in range(height): for x in range(width): r, g, b = pixels1[x, y] # 获取每个通道的LSB r_lsb = r & 1 g_lsb = g & 1 b_lsb = b & 1 # 异或操作 bit = r_lsb ^ g_lsb ^ b_lsb flag_bits.append(bit) # 创建新图像,将每个bit转换为像素:1->255(白),0->0(黑) new_img1 = Image.new('L', (width, height)) for y in range(height): for x in range(width): idx = y * width + x if flag_bits[idx] == 1: new_img1.putpixel((x, y), 255) else: new_img1.putpixel((x, y), 0) new_img1.save('extracted1.png') # 同样处理00002484.png img2 = Image.open('00002484.png').convert('RGB') width2, height2 = img2.size pixels2 = img2.load() flag_bits2 = [] for y in range(height2): for x in range(width2): r, g, b = pixels2[x, y] r_lsb = r & 1 g_lsb = g & 1 b_lsb = b & 1 bit = r_lsb ^ g_lsb ^ b_lsb flag_bits2.append(bit) new_img2 = Image.new('L', (width2, height2)) for y in range(height2): for x in range(width2): idx = y * width2 + x if flag_bits2[idx] == 1: new_img2.putpixel((x, y), 255) else: new_img2.putpixel((x, y), 0) new_img2.save('extracted2.png') ``` 运行这个脚本后,查看生成的`extracted1.png`和`extracted2.png`,看是否藏了二维码、文字等信息。 另外,我们也可以尝试其他组合方式,比如只取R通道的LSB,或者R+G+B的LSB合并成一个字节等。 **步骤6:尝试sx文件** 如果上述步骤没有结果,我们再看sx文件。如果sx文件是加密的,可能需要密钥。密钥可能来自图片提取的信息。 如果sx文件是文本,并且包含类似base64的字符串,可以尝试解码。或者,它可能是某个加密脚本(如引用[5]中的加密脚本),需要逆向。 **步骤7:重新审视所有线索** 如果以上步骤都没有找到flag,可能需要考虑这些文件需要按特定顺序组合。例如,将多个文件的内容连接起来,或者使用某个文件的内容作为密钥解密另一个文件。 由于这是一个CTF题目,可能设计精巧,需要耐心和多种尝试。 **总结行动步骤:** 1. 使用`file`命令确认文件类型。 2. 尝试解压zip文件(无密码或常用密码)。 3. 检查png图片的元数据(exiftool)。 4. 使用zsteg、steghide(空密码)分析png图片。 5. 运行上述LSB处理脚本,查看提取的图像。 6. 分析sx文件(查看内容、文件头等)。 如果这些步骤后仍无进展,可能需要更多上下文或尝试其他方法(如文件合并、CRC校验等)。但根据引用提供的思路,图片(特别是LSB)和zip解压是重点。 </think>基于提供的文件和CTF Misc解题经验,我将逐步指导你分析这些文件并提取flag。以下是系统化的操作流程: ### 分析步骤 1. **检查文件类型**(使用`file`命令或十六进制查看器) ```bash file 00002456.zip # 确认是否为真实zip文件 file 00002460.zip file 00002482.sx # 检查.sx扩展名的真实类型(可能是伪装的) file 00002466.png file 00002484.png ``` - 如果`.sx`文件显示为`data`或未知类型,尝试重命名为`.zip`/`.rar`/`.7z`(常见伪装手段) - 重点关注PNG文件的魔术字节(前8字节应为`89 50 4E 47 0D 0A 1A 0A`) 2. **处理ZIP压缩包** - 优先解压`00002456.zip`和`00002460.zip`: ```bash unzip 00002456.zip unzip 00002460.zip ``` - 若需要密码,尝试以下来源: * PNG文件的LSB数据(见步骤3) * 文件名数字部分(如`2456`/`2460`) * 空密码或常见密码(`password`/`flag`/`ctf`) 3. **分析PNG文件** - 使用LSB(最低有效位)提取工具: ```bash zsteg 00002466.png # 检查LSB zsteg 00002484.png steghide extract -sf 00002466.png # 尝试空密码提取 ``` - 若工具无输出,使用Python脚本提取LSB数据(参考引用[5]): ```python from PIL import Image for img in ["00002466.png", "00002484.png"]: im = Image.open(img).convert("RGB") width, height = im.size bits = "" for y in range(height): for x in range(width): r, g, b = im.getpixel((x, y)) bits += str(r & 1) # 取R通道最低位 # 将比特流转为ASCII data = bytes(int(bits[i:i+8], 2) for i in range(0, len(bits), 8)) open(f"{img}_extracted", "wb").write(data) ``` 4. **处理.sx文件** - 若步骤1显示其为压缩包,重命名为`00002482.zip`后解压 - 若显示为文本,检查是否包含关键信息: ```bash strings 00002482.sx | grep -i "flag\|key\|password" ``` - 常见可能性: * 加密密钥(如Blowfish密钥,参考引用[5]) * Base64编码数据(使用`base64 -d`解码) * 十六进制数据(使用`xxd -r -p`转换) 5. **交叉验证线索** - 用PNG提取的数据解密ZIP文件 - 检查解压后的文件是否包含: * `flag.txt`(参考引用[2][3]) * 二次图片/文档 * 加密脚本(如引用[5]的Python脚本) - 若获得Base64数据,转换回二进制: ```bash base64 -d found_b64.txt > output.bin ``` ### 关键注意事项 1. **文件关联性**:文件名中的数字序列(`2456`→`2460`→`2466`→`2482`→`2484`)可能指示处理顺序 2. **高频漏洞点**: - ZIP伪加密(使用`zipdetails`检查加密位) - PNG IDAT块藏数据(使用`pngcheck -v`分析) - 文件拼接(尝试`binwalk -e`分离) 3. **终极手段**:若所有分析失败,将`00002482.sx`与PNG文件合并: ```bash cat 00002466.png 00002482.sx > combined.bin file combined.bin # 检测新文件类型 ``` ### 预期成果路径 ```mermaid graph LR A[ZIP文件] -->|解压| B[新文件/密码] C[PNG文件] -->|LSB提取| D[密钥/文本] D --> A E[.sx文件] -->|重命名/解码| F[压缩包/脚本] F --> G[flag] B --> G ``` **下一步建议**:优先执行步骤3的Python脚本处理PNG文件,通常LSB会直接包含密钥或flag片段(如引用[5]方案)。若发现加密数据,尝试文件名数字作为密钥(如`2482`)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值