CTF-Pixel系列题目分析

对于ctf比赛中,遇见频率并不高的像素题进行一个小总结。

1.Pixel_Signin

乍一看是一个像素点的图片

看一下大小是31*31

编写脚本,转化成rgb数字看看

from PIL import Image
file = Image.open("Pixel_Signin.png")
fi = open("res.txt", "w")
print("Image size:", file.size)
for i in range(31):
    for j in range(31):
        r, g, b = file.getpixel((j, i))
        print(r, g, b, file=fi)
fi.close()

发现结果有挺多还是落在字母数字对于的ascii字符上的。尝试把这个rgb数字转成对应的字符

flag = ""

with open("res.txt", "r") as f:
    lines = f.readlines()

for line in lines:
    parts = line.strip().split()
    for value in parts:
        num = int(value)
        try:
            flag += chr(num)
        except ValueError:
            pass  

print(flag)

得到一串字符

Gur dhvpx oebja sbk whzcf bire gur ynml qbt vf na Ratyvfu-ynathntr cnatenzÿn fragrapr gung pbagnvaf nyy gur yrggref bs gur nycunorg. Gur cuenfr vf pbzzbayl hfrq sbe gbhpu-glcvat cenpgvpr, grfgvat glcrjevgref naq pbzchgre xrlobneqf, qvfcynlvat rknzcyrf bs sbagf, naq bgure nccyvpngvbaf vaibyivat grkg jurer gur hfr bs nyy yrggref va gur nycunorg vf qrfverq.Gur rneyvrfg xabja nccrnenapr bs gur cuenfr jnf va Gur Obfgba Wbheany. Va na negvpyr gvgyrq Pheerag Abgrf va gur Sroehnel , rqvgvba, gur cuenfr vf zragvbarq nf n tbbq cenpgvpr fragrapr sbe jevgvat fghqragf N snibevgr pbcl frg ol jevgvat grnpuref sbe gurve chcvyf vf gur sbyybjvat, orpnhfr vg pbagnvaf rirel yrggre bs gur nycunorg N dhvpx oebja sbk whzcf bire gur ynml qbt. Qbmraf bs bgure arjfcncref choyvfurq gur cuenfr bire gur arkg srj zbaguf, nyy hfvat gur irefvba bs gur fragrapr fgnegvat jvgu N engure guna Gur. Gur rneyvrfg xabja hfr bs gur cuenfr fgnegvat jvgu Gur vf sebz gur  obbx Vyyhfgengvir Fubegunaq ol Yvaqn Oebafba. Gur zbqrea sbez fgnegvat jvgu Gur orpnzr zber pbzzba rira gubhtu vg vf fyvtugyl ybatre guna gur bevtvany fgnegvat jvgu N.N  rqvgvba bs gur Ybf Natryrf Urenyq Fhaqnl Zntnmvar erpbeqf gung jura gur Arj Lbex Urenyq jnf rdhvccvat na bssvpr jvgu glcrjevgref n srj lrnef ntb, fgnss sbhaq gung gur pbzzba cenpgvpr fragrapr bs abj vf gur gvzr sbe nyy tbbq zra gb pbzr gb gur nvq bs gur cnegl qvq abg snzvyvnevmr glcvfgf jvgu gur ragver nycunorg, naq ena bagb gjb yvarf va n arjfcncre pbyhza. AFFPGS{Unehxv_vf_AFF_FHCREZNA_fb_guvf_gnfx_vf_rnfl} Gurl jevgr gung n fgnss zrzore anzrq Neguhe S. Phegvf vairagrq gur dhvpx oebja sbk cnatenz gb nqqerff guvf.Nf gur hfr bs glcrjevgref terj va gur yngr gu praghel, gur cuenfr ortna nccrnevat va glcvat yrffba obbxf nf n cenpgvpr fragrapr. Rneyl rknzcyrf vapyhqr Ubj gb Orpbzr Rkcreg va Glcrjevgvat N Pbzcyrgr Vafgehpgbe Qrfvtarq Rfcrpvnyyl sbe gur Erzvatgba Glcrjevgre , naq Glcrjevgvat Vafgehpgbe naq Fgrabtencuref Unaq-obbx. Ol gur ghea bs gur gu praghel, gur cuenfr unq orpbzr jvqryl xabja. Va gur Wnahnel ,vffhr bs Cvgznaf Cubargvp Wbheany, vg vf ersreerq gb nf gur jryy xabja zrzbevmrq glcvat yvar rzoenpvat nyy gur yrggref bs gur nycunorg. Eboreg Onqra-Cbjryyf obbx Fpbhgvat sbe Oblf  hfrf gur cuenfr nf n cenpgvpr fragrapr sbe fvtanyvat.Gur svefg zrffntr frag ba gur ZbfpbjÿJnfuvatgba ubgyvar ba Nhthfg , , jnf gur grfg cuenfr GUR DHVPX OEBJA SBK WHZCRQ BIRE GUR YNML QBTF ONPX . Yngre, qhevat grfgvat, gur Ehffvna genafyngbef frag n zrffntr nfxvat gurve Nzrevpna pbhagrecnegf, Jung qbrf vg zrna jura lbhe crbcyr fnl Gur dhvpx oebja sbk whzcrq bire gur ynml qbt? Qhevat gur gu praghel, grpuavpvnaf grfgrq glcrjevgref naq gryrcevagref ol glcvat gur fragrapr.Vg vf gur fragrapr hfrq va gur naahny Mnare-Oybfre Angvbany Unaqjevgvat Pbzcrgvgvba, n phefvir jevgvat pbzcrgvgvba juvpu unf orra uryq va gur H.F. fvapr ���������������������������������������������

放到cyberchef里面试一试,猜测可能是rot13

拿到flag

NSSCTF{Haruki_is_NSS_SUPERMAN_so_this_task_is_easy}

2. GHCTF 2025 mypixel

下载下来的附件仍然是一个像素图,我们还是尝试上一题的方法,提取像素点rgb数值,进行观察👀

观察数据,应该是存在非数字字母字符的,而且不少

拖入道zsteg进行分析

zsteg -a '/home/kali/桌面/attachment.png' 

给这个内嵌的压缩包提取出来

zsteg -E b8,rgb,lsb,xy '/home/kali/桌面/attachment.png' > hidden.zip

解压后发现是这样一张图

这张图只有黑白,我们看下规格,编写脚本将黑白转化成01字符串,再拖入解码工具试试

脚本如下

from PIL import Image
img = Image.open("output.png").convert("RGB")
width, height = img.size
binary_data = ""
for y in range(height):
    for x in range(width):
        r, g, b = img.getpixel((x, y))
        if (r, g, b) == (0, 0, 0):
            binary_data += '1'
        else:
            binary_data += '0'
with open("image_binary.txt", "w") as f:
    f.write(binary_data)

print("<u>转换完成,已保存为 </u>image_binary.txt")

将结果放到cyberchef,点一下魔法棒🪄

这个定位码是汉信码的特征,找个在线的解密

得到flag  NSSCTF{f92a7a2e-9606-4319-9d97-942de4f0315a}

3.GDOUCTF 2023 pixelart

打开附件,很明显能观察到图片中的小白点,用sinpaste截取一段和一个像素点比较,发现一个像素点到另一个像素点之间到距离是12,想办法给这些像素点全部提取出来看看怎么个事!,编写脚本处理

from PIL import Image

# 加载用户上传的图像
original_image = Image.open("arcaea.png")

# 设置采样间隔
step = 12
new_width = original_image.width // step
new_height = original_image.height // step

# 创建新图像
new_image = Image.new("RGB", (new_width, new_height))

# 每隔 step 像素取一个像素点
for x in range(new_width):
    for y in range(new_height):
        pixel = original_image.getpixel((x * step, y * step))
        new_image.putpixel((x, y), pixel)

# 保存新图像
output_path = "extracted_every_12px.png"
new_image.save(output_path)

print(output_path)

发现提取出来,拿到fake flag

猜测可能还是像素相关的lsb隐写,用zsteg梭哈

得到 flag{J3st_2_cats_battling}

4.CISCN 2022 东北 pixel

这个题目也和像素有关,主要考点为pixel 根据描述,只能看懂其中的数字

把数字全部取出来 258523871198,提取完然后解压 发现是一个dat文件,文件格式不详,使用puzzlesolver能检测一手文件类型

放到b神的工具里继续梭一手,拿到解压密码

得到如下图片

继续用b神工具,PixelJihad解密

flag{3dba7e5c09b0da5182a373e3cbb99670}

5.ctfshow七夕杯 你会lsb吗?

下载下来文件没后缀,用010查看一手

看见字符倒过来了,应该是把文件逆序了,写个python脚本再倒一次即可

with open('./zip', 'rb') as f:
    g = f.read()
with open('./reversed.zip', 'wb') as ff:
    ff.write(g[::-1])

会得到如下图片

binwalk,foremost分离没啥结果 打开010继续看,发现有个ctfshow 那应该是带密码的图片解密

成功解密

得到一堆emjoy编码信息,找个在线解密

https://aghorler.github.io/emoji-aes/

提示轮换无效,仔细找了下点开advance,当旋转=2时能发现可以成功解密

好了,今天分享就到这里,谢谢大家观看。

点一个关注吧,欢迎点赞转发本文~~

### CTF竞赛中图像像素提取技巧与方法 在CTF竞赛中,图像像素提取是一项常见的挑战任务。以下是几种常用的技巧和方法: #### 使用PIL库进行像素值操作 对于从图像中提取像素值的任务,可以使用Python的`PIL`库(现称为`Pillow`),这是一个强大的图像处理库[^1]。通过编写脚本来读取或修改图像的像素值,能够实现对原始数据的分析。 ```python from PIL import Image # 打开图像文件 image = Image.open('example.png') # 获取图像尺寸 width, height = image.size # 提取像素pixels = list(image.getdata()) # 将像素值转换为RGB元组列表 rgb_pixels = [(pixel[0], pixel[1], pixel[2]) for pixel in pixels] print(rgb_pixels[:10]) ``` 上述代码展示了如何加载一张图片并获取其像素值。如果题目提供了具体的像素值,则可以通过类似的逻辑重建图像。 --- #### JPEG隐写术原理及其逆向工程 当涉及JPEG格式时,通常会涉及到离散余弦变换(DCT)系数的操作[^2]。隐藏信息的过程可能包括以下几个方面: - **解压JPEG**:将JPEG文件还原为其内部表示形式——DCT系数矩阵。 - **加密信息嵌入**:利用Blowfish或其他加密算法生成伪随机序列,并基于此选择特定位置的DCT系数进行修改。 - **重新压缩**:将修改后的DCT系数再次打包成标准JPEG文件。 为了从中提取线索,可尝试以下方式: - 利用专门工具(如Stegsolve.jar)查看不同颜色通道下的潜在隐藏信息。 - 对于已知密码的情况,按照描述流程模拟整个过程以验证假设。 --- #### GIF动画帧分离与模式发现 针对动态GIF文件,例如提到的`running_pixel.gif`案例[^4],第一步通常是将其拆分为单帧静态图片以便进一步研究。具体做法如下所示: ```bash # 假设已经安装 GifSplitter 工具 GifSplitter.exe running_pixel.gif output_folder/ ``` 运行该命令后,将会获得一系列独立的小幅图像存放在指定目录下。随后可通过编程手段批量读取这些子图的内容特征寻找关联性规律。 另外,在某些场景里还需要关注各帧间是否存在重复部分以及它们之间的相对偏移量等问题。 --- #### 综合运用多种技术解决复杂情况 除了单独依赖某一种策略外,还可以考虑结合其他高级功能一起解决问题。比如借助第三方应用程序 `ImageStrike` 来完成更复杂的任务,它支持的功能范围广泛涵盖了盲水印提取、二维码扫描等多个领域[^3]。 综上所述,面对不同的输入条件选用恰当的技术组合至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值