[第四届世安杯]low
本文最后更新于233 天前,其中的信息可能已经过时,如有错误可以直接在文章下留言

在攻防世界找的题,是Misc方向的,题目压缩包给了一个bmp文件,如图

图片题,首先用了Linux的file和binwalk命令看了一下,没有答案,然后用StegSolve打开,发现了类似二维码的部分,如图

但是接下来就不知道该怎么做了,之前一直做的Misc方向的题目都是用StegSolve自带的Data Extract功能,但是这个没啥办法,看了Writeup,一个做法是把bmp文件放入画图软件之中,然后另存为PNG图片,然后再用StegSolve打开就能看到答案的二维码了,但是手动改文件的扩展名却没用,太奇怪了,如图

具体什么原理,网上的Writeup又不说,还挺想知道为什么会这样的,真是难受,一些Writeup就是总是只说答案却不说一些比较难的题目或奇怪的题目的做法原理是什么,甚至有些网站抄来抄去答案,没啥意义。

正规做法是利用脚本解决这题,脚本如下

import PIL.Image as Image
img = Image.open('low.bmp')
img_tmp = img.copy()
pix = img_tmp.load()
width,height = img_tmp.size
for w in range(width):
   for h in range(height):
      if pix[w,h]&1 == 0:
         pix[w,h] = 0
      else:
         pix[w,h] = 255
img_tmp.show()

脚本处理之后即会弹出二维码,但是具体原理如何,说实话网上一堆也没有具体解释,我学习了一下,有了点想法,首先要了解一下何为LSB隐写(Least Significant Bit,最低有效位),推荐b站的这个视频还有CSDN的这篇文章

隐写术鉴赏_哔哩哔哩_bilibili

LSB隐写(最低有效位隐写)-CSDN博客

在计算机中,如果将一幅图像放大,我们可以看到它是由一个个的小格子组成的,每个小格子就是一个色块。如果我们用不同的数字来表示不同的颜色,图像就可以表示为一个由数字组成的矩阵(matrix),这样就可以在计算机中存储。这个小格子就是像素(pixel),矩阵的行数与列数,就是分辨率(resolution)。我们常说某张图像的分辨率是1280*720,指的就是这张图像是由1280行,720列的像素组成。反过来,如果我们有一个矩阵,将矩阵中的每个数值都转换为颜色,并在计算机中显示出来,就可以复现这张图像

我们可以理解为图像在计算机中是以点阵的形式存在的,我们可以理解为一个二位数组或者矩阵,每个点所在的行和列是它的坐标,元素的值可以理解为当前像素的值。

图片中的图像像素一般是由RGB三原色(红绿蓝)组成,每一种颜色占用8个bit,取值范围为0x00~0xFF,即有256种颜色,一共包含了256的3次方的颜色,即16777216种颜色,例如白色的RGB值即为(255,255,255),而黑色的RGB值即为(0,0,0),它的意思就是电脑中一种颜色由红绿蓝三种颜色以不同的程度混合而成,而这个程度就是数字的值。

但是倘若是黑白图像呢,一个图像的一个像素就可以直接用8bit的二进制数据来表示,一个像素也就是一个字节,最小值0最暗,即为黑色,最大值为255,即为白色。而中间的其他值也就是介于两者之间的不同程度的灰色。

很明显,本题目给的就是一张黑白的灰度图像,而刚刚用StegSolve出现了类似二维码的部分,那二维码呢?也是黑白的吧,而脚本的意思大概就如下

import PIL.Image as Image
#导入Python的PIL库
img = Image.open('low.bmp')
#打开'low.bmp'
img_tmp = img.copy()
#复制这个图像到一个新的变量img_tmp中
pix = img_tmp.load()
#获取img_tmp的像素数据
width,height = img_tmp.size
for w in range(width):
   for h in range(height):
#两个for循环遍历每一个像素
      if pix[w,h]&1 == 0:
         pix[w,h] = 0
#进行按位与操作
#如果像素的最低有效位(LSB)为0,那么它将该像素设置为0,像素块变成黑色
      else:
         pix[w,h] = 255
#否则,它将该像素设置为255,即白色
img_tmp.show()

也就是说,这题将隐写的信息隐藏在最低位中,且是看像素块二进制数据最低位的奇偶性,若这个最低位为奇数,则该像素隐藏的信息应该是白色,相反若这个最低为为偶数,则该像素隐藏的信息应该是黑色,这些黑黑白白其实就构成了一个二维码,而这个二维码也就是所要隐藏的信息。

扫二维码得出flag为flag{139711e8e9ed545e}

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇