1. 程式人生 > >MISC總結——隱寫術(四)

MISC總結——隱寫術(四)

目錄

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

這應該是關於隱寫術問題的最後一篇文章了!!

如果有喜歡的請關注一下哦!!!!

隱寫術介紹:

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

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

第一部分:基於DCT域的JPG圖片隱寫

知識背景:

JPEG影象格式使用離散餘弦變換(Discrete Cosine Transform,DCT)函式來壓縮影象,而這個影象壓縮方法的核心是:

通過識別每個8×8畫素塊中相鄰畫素中的重複畫素來減少顯示影象所需的位數,並使用近似估演算法降低其冗餘度。

因此,我們可以把DCT看作一個用於執行壓縮的近似計算方法。因為丟失了部分資料,所以DCT是一種有失真壓縮(Loss Compression)技術,但一般不會影響影象的視覺效果。

在這個隱寫家族中,常見的隱寫方法有JSteg、JPHide、Outguess、F5等等

Stegdetect

實現JPEG影象Jphide隱寫演算法工具有多個,比如由Neils Provos開發通過統計分析技術評估JPEG檔案的DCT頻率係數的隱寫工具Stegdetect,

它可以檢測到通過JSteg、JPHide、OutGuess、Invisible Secrets、F5、appendX和Camouflage等這些隱寫工具隱藏的資訊,

並且還具有基於字典暴力破解密碼方法提取通過Jphide、outguess和jsteg-shell方式嵌入的隱藏資訊。

JPHS

一款JPEG影象的資訊隱藏軟體JPHS,它是由Allan Latham開發設計實現在Windows和Linux系統平臺針對有失真壓縮JPEG檔案進行資訊加密隱藏和探測提取的工具。

軟體裡面主要包含了兩個程式JPHIDE和JPSEEK, JPHIDE程式主要是實現將資訊檔案加密隱藏到JPEG影象功能,

而JPSEEK程式主要實現從用JPHIDE程式加密隱藏得到的JPEG影象探測提取資訊檔案,Windows版本的JPHS裡的JPHSWIN程式具有圖形化操作介面且具備JPHIDE和JPSEEK的功能。

Outguess Outgusee演算法是Niels Provos針對Jsteg演算法的缺陷提出的一種方法:

  • 嵌入過程不修改ECT係數值為0,1的DCT係數,利用為隨機數發生器產生間隔以決定下一個要嵌入的DCT係數的位置
  • 糾正過程消除對效應的出現

對應的,也有針對該演算法的隱寫工具,名字也叫Outguess。

JPHS

 在實驗機中找到隱寫術目錄,開啟圖片隱寫,開啟圖片隱寫第四部分資料夾
 在該資料夾找到JPhide.jpg
 雙擊開啟圖片,我們先確認一下圖片內容並沒有什麼異常
 使用Stegdetect對圖片的隱寫方式進行檢測
 從結果中得知是使用JPHide的隱寫,使用JPHS工具對隱寫資訊進行提取
 最後開啟儲存的檔案,flag是flag{Good_you_got_it}

Stegdetect的指令介紹

-q 僅顯示可能包含隱藏內容的影象。
-n 啟用檢查JPEG檔案頭功能,以降低誤報率。如果啟用,所有帶有批註區域的檔案將被視為沒有被嵌入資訊。如果JPEG檔案的JFIF識別符號中的版本號不是1.1,則禁用OutGuess檢測。
-s 修改檢測演算法的敏感度,該值的預設值為1。檢測結果的匹配度與檢測演算法的敏感度成正比,演算法敏感度的值越大,檢測出的可疑檔案包含敏感資訊的可能性越大。
-d 列印帶行號的除錯資訊。
-t 設定要檢測哪些隱寫工具(預設檢測jopi),可設定的選項如下:
j 檢測影象中的資訊是否是用jsteg嵌入的。
o 檢測影象中的資訊是否是用outguess嵌入的。
p 檢測影象中的資訊是否是用jphide嵌入的。
i 檢測影象中的資訊是否是用invisible secrets嵌入的。
-V 顯示軟體版本號。
如果檢測結果顯示該檔案可能包含隱藏資訊,那麼Stegdetect會在檢測結果後面使用1~3顆星來標識
隱藏資訊存在的可能性大小,3顆星表示隱藏資訊存在的可能性最大。

首先,在cmd中執行,Stegdetect,對目標圖片進行檢測

發現結果顯示是jphide隱寫的可能性很大。接著,我們使用工具JPHS提取資訊 這是一款針對Jphide演算法的隱寫工具,正如對症下藥,我們也得用對工具,才能更好的解決問題。

首先,在使用JPHS開啟圖片,點選Seek功能,緊接著會彈出一個密碼的輸入框,我們這裡預設為空口令,直接點選OK,將提取出來的資訊儲存為flag.txt。

Outguess

實驗

- 在實驗機中找到隱寫術目錄,開啟圖片隱寫,開啟圖片隱寫第四部分資料夾
- 在該資料夾找到Outguess.jpg
- 雙擊開啟圖片,我們先確認一下圖片內容並沒有什麼異常
- 使用Stegdetect對圖片的隱寫方式進行檢測
- 從結果中得知是使用JPHide的隱寫,使用JPHS工具對隱寫資訊進行提取
- 最後開啟儲存的問就,flag是flag{Good_you_got_it}

第一步,在cmd中執行,Stegdetect,對目標圖片進行檢測

從結果可以得知,這裡的隱寫方式是,Outguess。

第二步,使用Outguess工具提取隱寫資訊

點選Enter key功能,輸入密碼,這裡我隱寫的時候,使用的密碼是123456 點選Load image 載入目標圖片 點選Extract file功能,將提取出來的資訊儲存成flag.txt檔案。 開啟儲存後的檔案,flag是flag{Outguess}

小結: 從上面的實驗來看,JPG圖片常用的隱寫方式一般也是DCT域的隱寫了,不過一般在CTF賽場上,這種題目是可以直接用Stegdetect所檢測出來的。

第二部分:數字水印隱寫

知識背景:

數字水印 數字水印(digital watermark)技術,是指在數字化的資料內容中嵌入不明顯的記號。 特徵是,被嵌入的記號通常是不可見或不可察的,但是可以通過計算操作檢測或者提取。盲水印與傅立葉變換

這裡介紹的盲水印是以知乎某答主的頻域新增盲水印的文章為基礎,在2016HCTF的也出了一個隱寫題目,也是以頻域為背景的。 盲水印,是指人感知不到的水印,包括看不到或聽不見(沒錯,數字盲水印也能夠用於音訊)。

其主要應用於音像作品、數字圖書等,目的是,在不破壞原始作品的情況下,實現版權的防護與追蹤。

對影象進行傅立葉變換,起始是一個二維離散傅立葉變換,影象的頻率是指影象灰度變換的強烈程度,將二維影象由空間域變為頻域後,

影象上的每個點的值都變成了複數,也就是所謂的複頻域,通過複數的實部和虛部,可以計算出幅值和相位,計算幅值即對複數取模值,

將取模值後的矩陣顯示出來,即為其頻譜圖。但是問題來了,複數取模後,數字有可能變的很大,遠大於255,如果資料超過255,

則在顯示影象的時候會都當做255來處理,影象就成了全白色。因此,一般會對模值再取對數,在在0~255的範圍內進行歸一化,

這樣才能夠準確的反映到影象上,發現數據之間的差別,區分高頻和低頻分量,這也是進行傅立葉變換的意義

頻域盲水印隱寫

 在實驗找到隱寫術目錄,開啟圖片隱寫,開啟圖片隱寫第五部分資料夾
 在該資料夾找到ori.jpg,res,png
 雙擊開啟圖片,我們先確認一下圖片內容並沒有什麼異常
 執行我提供的指令碼,提取水印


有必要提以下的是,如果用mathlab生成的盲水印隱寫是不需要原圖的,這裡我能力有限,只能做到需要原圖才能提取水印。

python decode.py --original <original image file> --image <image file> --result <result file>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

# coding=utf-8

import cv2

import numpy as np

import random

import os

from argparse import ArgumentParser

ALPHA = 5

def build_parser():

parser = ArgumentParser()

parser.add_argument('--original', dest='ori', required=True)

parser.add_argument('--image', dest='img', required=True)

parser.add_argument('--result', dest='res', required=True)

parser.add_argument('--alpha', dest='alpha', default=ALPHA)

return parser

def main():

parser = build_parser()

options = parser.parse_args()

ori = options.ori

img = options.img

res = options.res

alpha = options.alpha

if not os.path.isfile(ori):

parser.error("original image %s does not exist." % ori)

if not os.path.isfile(img):

parser.error("image %s does not exist." % img)

decode(ori, img, res, alpha)

def decode(ori_path, img_path, res_path, alpha):

ori = cv2.imread(ori_path)

img = cv2.imread(img_path)

ori_f = np.fft.fft2(ori)

img_f = np.fft.fft2(img)

height, width = ori.shape[0], ori.shape[1]

watermark = (ori_f - img_f) / alpha

watermark = np.real(watermark)

res = np.zeros(watermark.shape)

random.seed(height + width)

= range(height / 2)

= range(width)

random.shuffle(x)

random.shuffle(y)

for in range(height / 2):

for in range(width):

res[x[i]][y[j]] = watermark[i][j]

cv2.imwrite(res_path, res, [int(cv2.IMWRITE_JPEG_QUALITY), 100])

if __name__ == '__main__':

main()

`

提取盲水印 original 是輸入原圖, image是之後跟的是加入了水印的圖, result是儲存水印圖片。

結果

如果是像HCTF那樣的隱寫題,只需要有mathlab這個強大的工具,再運用提取盲水印的程式碼,是不需要原圖的,程式碼如下。

imageA = imread('3.bmp','bmp');
fftA = fft2(imageA);
imshow(fftshift(fftA))
imshow(fft(rgb2gray(imread('shimakaze.bmp'))), [1,2]);

接下來就是最後一部分了

第三部分:圖片容差隱寫

知識背景:

容差 容差,在選取顏色時所設定的選取範圍,容差越大,選取的範圍也越大,其數值是在0-255之間。

容差比較的隱寫

beyond compare beyond compare是一款很適合用來對圖片進行比較的工具,就圖片而言,它支援容差、範圍、混合等模式。

  • 實驗:
 在實驗中找到隱寫術目錄,開啟圖片隱寫,開啟圖片隱寫第六部分資料夾
 在該資料夾找到 pokemon_1.jpg,pokemon_2.jpg
 開啟工具Beyond Compare,選擇圖片比較,匯入兩張圖片
 在左下角慢慢修改容差,
 在容差的修改過程中得到了flag

開啟工具,選擇圖片比較,匯入pokemon_1.jpg,pokemon_2.jpg

選擇容差模式,並調整容差大小

小結: 如果在CTF賽場中,就隱寫這一部分,出題人給於兩張或者多張圖片,一般都是需要對圖片的內容進行比較的。

思考:

  1. Stegsolve 也有圖片的比較的功能,是否能完成這個隱寫?如果不可以為什麼?

DCT.zip (0.074 MB) 下載附件