MISC總結——隱寫術(三)

轉載自:https://www.cnblogs.com/lxz-1263030049/p/9392923.html

目錄

 

這一篇是繼上一篇之後的另一篇關於隱寫術在ctf比賽中常見的套路問題:

MISC總結——隱寫術(一)詳情請見:https://blog.csdn.net/xuchen16/article/details/82969608

MISC總結——隱寫術(二)詳情請見:https://blog.csdn.net/xuchen16/article/details/82970062

本文參考自:先知社區:https://xz.aliyun.com/t/1844

隱寫術介紹:

隱寫術是關於信息隱藏,即不讓計劃的接收者之外的任何人知道信息的傳遞事件(而不只是信息的內容)的一門技巧與科學。

英文寫作Steganography,而這篇內容將帶大家瞭解一下CTF賽場上常見的圖片隱寫方式,以及解決方法。有必要強調的是,隱寫術與密碼編碼是完全不同的概念。

 

第一部分:基於LSB原理的圖片隱寫

首先:我們需要明白什麼是LSB隱寫:

LSB,最低有效位,英文是Least Significant Bit 。我們知道圖像像素一般是由RGB三原色(即紅綠藍)組成的,

每一種顏色佔用8位,0x00~0xFF,即一共有256種顏色,一共包含了256的3次方的顏色,顏色太多,而人的肉眼能區分的只有其中一小部分,

這導致了當我們修改RGB顏色分量種最低的二進制位的時候,我們的肉眼是區分不出來的。


Stegosolve介紹 :
CTF中,最常用來檢測LSB隱寫痕跡的工具是Stegsolve,這是一款可以對圖片進行多種操作的工具,包括對圖片進行xor,sub等操作,對圖片不同通道進行查看等功能

複製代碼

 在實驗中找到隱寫術目錄,打開圖片隱寫,打開圖片隱寫第三部分文件夾
 在該文件夾找到chal.png
 雙擊打開圖片,我們先確認一下圖片內容並沒有什麼異常
 使用Stegsolve打開圖片,在不同的通道查看圖片
在通道切換的過程中,我們看到了flag
 最後的flag是flag:key{forensics_is_fun}

複製代碼

用Stegsolve打開圖片,並在不同的通道中切換:

最後得到flag:key{forensics_is_fun}

思考的問題:

  1. 我們如何實現這種LSB隱寫的?是否可以通過photoshop這樣的工具實現?
  2. 查閱更多關於LSB隱寫的資料。

 

有難度的LSB隱寫:

我們從第一個部分可以知道,最簡單的隱寫我們只需要通過工具Stegsolve切換到不通通道,我們就可以直接看到隱寫內容了,

那麼更復雜一點就不是這麼直接了,而是隻能這樣工具來查看LSB的隱寫痕跡,再通過工具或者腳本的方式提取隱寫信息。

複製代碼

在實驗中找到隱寫術目錄,打開圖片隱寫,打開圖片隱寫第三部分文件夾 在該文件夾找到LSB.bmp
雙擊打開圖片,我們先確認一下圖片內容並沒有什麼異常
使用Stegsolve打開圖片,在不同的通道查看圖片
在通道切換的過程中,來判斷隱寫痕跡
編寫腳本提取隱寫信息。
最後打開提取後的文件,得到flag

複製代碼

 

 

首先:從Stegsolve中打開圖片
首先點擊上方的FIle菜單,選擇open,在題目文件夾中找到這次所需要用的圖片whereswaldo.bmp

其次:切換到不同通道,通過痕跡來判斷是否是LSB隱寫
分析是否有可能是LSB隱寫,我們開始點擊下面的按鈕,切換到不同通道,我們逐漸對比不同通道我們所看到的圖片是怎麼樣子的。
我們發現在Red plane0和Greee plane 0以及B略 plane 0出現了相同的異常情況,我們這裏基本可以斷定就是LSB隱寫了

編寫代碼提取信息
因爲是LSB隱寫,我們只按位提取RGB的最低位即可,代碼如下:

複製代碼

from PIL import Image

im = Image.open("extracted.bmp")
pix = im.load()
width, height = im.size

extracted_bits = []
for y in range(height):
    for x in range(width):
        r, g, b = pix[(x,y)]
        extracted_bits.append(r & 1)
        extracted_bits.append(g & 1)
        extracted_bits.append(b & 1)

extracted_byte_bits = [extracted_bits[i:i+8] for i in range(0, len(extracted_bits), 8)]
with open("extracted2.bmp", "wb") as out:
    for byte_bits in extracted_byte_bits:
                byte_str = ''.join(str(x) for x in byte_bits)
        byte = chr(int(byte_str, 2))
        out.write(byte)

複製代碼

 

打開我們需要提取信息的的圖片,y,x代表的是圖片的高以及寬度,進行一個循環提取。
運行代碼,extracted.py,打開圖片即可。

Return Top

 

思考的問題:

  1. 我們這裏用的LSB隱均對R,G,B,三種顏色都加以修改是否可以只修改一個顏色?
  2. 參考2016 HCTF的官方Writeup學習如何實現將一個文件以LSB的形式加以隱寫。

 

題目.zip (0.624 MB) 下載附件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章