第一題
- 打開壓縮包得到的是一張PNG格式的圖片
- 首先拖放到010Editor中:
CTRL+F 搜索IHDR發現只有一個,沒有其他問題
- 然后放到KALI中分析一波:
圖片能夠在kali中打開,說明不是寬高的隱寫,因為如果修改了寬高在linux中是無法正常顯示的
- 然后binwalk分析一波:
同樣的沒有什么問題
- 最后就是放到 stegslove里面試一試了
簡單的科普一下png的知識
png支持RGBA四個通道,每個通道占8個二進制位,隱寫文件或數據一般都在各個通道的低位,因為低位的變化不會引起較大的視覺變化,圖片看上去還是原來的圖片,但是你不知道是在哪個通道,這里有4個通道,如果藏在一個通道的低位的話,有四種可能,如果藏在兩個通道的低位的話,可能進行各種運算操作后出現新的圖片,加減乘除與或異或
發現Red plane 0是空的,按理來說應該也是”雪花“的,所以應該是有問題的
然后 Analyse - Data Extract,查看該通道,得知是LSB隱寫
后面得知就是吧Alpha、Red、Green、Blue 0通道進行異或處理就能夠得到flag了,可以通過stegslove獲得,下面說一下通過python編寫腳本進行色道分離異或處理的方法:
#代碼參考自合天智匯
import cv2
import numpy as np
import os
def lowbit(x):
return x & 0x1
png= cv2.imread("flag_enc.png" , cv2.IMREAD_UNCHANGED)
# 新建一個temp文件夾保存異或之后的圖片
os.system("mkdir temp")
# 打開進入temp文件夾
os.system("cd temp")
for i in range(0,4):
for f in range(0,4):
dst= cv2.bitwise_xor(lowbit(png[: ,: ,i]),lowbit(png[: ,:, f]))
cv2.imwrite("temp/"+"xor_"+str(i)+"_"+str(f)+".png",dst*255)
for i in range(0,4):
for f in range(0,4):
dst= cv2.bitwise_or(lowbit(png[: ,: ,i]),lowbit(png[: ,:, f]))
cv2.imwrite("temp/"+"or_"+str(i)+"_"+str(f)+".png",dst*255)
for i in range(0,4):
for f in range(0,4):
dst= cv2.bitwise_and(lowbit(png[: ,: ,i]),lowbit(png[: ,:, f]))
cv2.imwrite("temp/"+"and_"+str(i)+"_"+str(f)+".png",dst*255)
然后就可以得到結果,很明顯能夠看到flag了:
第二題
下載題目壓縮包解壓后得到兩個文件 desc.txt 和 damaged.disk
desc.txt理面是一段英文,翻譯后就是:
Horse Clip-Clop
A strange filesystem is recovered from a damaged old hard disk.馬夾子
從損壞的舊硬盤恢復奇怪的文件系統。
然后百度、Google還是看不懂,就不對這個txt文件分析了
- 把 damaged.disk拖到010Editor中看看有什么信息
文件開頭,看不懂。。。。。。
往下繼續翻,CTRL+F 搜索一下 flag,key,ctf 無果(太天真了)
后面發現了PNG的文件頭,終於找到關鍵信息
往下找發現有兩個IHDR,CTRL +F 發現確實就是兩個然后裁剪出來補上文件頭得到兩張圖片
然后用PS將兩張圖片進行拼接,就得到flag了
第三題
下載得到一張圖片,一貫的套路,拖到010Editor里面看看先
真正有東西的是后面的這部分數字和字母:
科普一下
Exif : 可交換圖像文件格式(英語:Exchangeable image file format,官方簡稱Exif),是專門為數碼相機的照片設定的,可以記錄數碼照片的屬性信息和拍攝數據
Exif可以附加於JPEG、TIFF、RIFF 等文件之中,為其增加有關數碼相機拍攝信息的內容和索引圖或圖像處理軟件的版本信息。
還是binwalk分析一下看看:
沒什么特別,看來flag就在這一串的數字字母結合的數據里頭了,很明顯看起來這是16進制的編碼,Converter轉換一下
得到的是一堆的坐標,然后通過坐標畫圖
方法一:使用KALI 的 gnuplot
百度略微了解了一下gnuplot的用法,把坐標轉換成為 gnuplot 能夠識別的形式,用notepad++ 的替換即可完成,保存為txt文件,然后在Kali中進入gnuplot,執行 plot "文件名",得到一張二維碼:掃碼即可得到falg:
flag{40fc0a979f759c8892f4dc045e28b820}
方法二:利用Python編寫腳本
#代碼參考自合天智匯
import cv2
import os
import numpy as np
n=0
canvas= np.ones((300, 300, 3), dtype="uint8")
canvas=canvas*255
list=open("1.txt").read().split("\n")
list=[i.split(",")for i in list]
for p in list:
canvas[int(p[0]),int(p[1])]=[0,0,0]
cv2.imwrite("2.jpg",canvas)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
第四題
首先已經很明確的告訴了題目的相關信息
文件格式:BMP
工具:Winhex
類型:圖片隱寫
文件直接無法打開,到winhex中看一看
很顯然這不是bmp文件頭,所以這道題目就是加個頭部就可以了,最后的答案是這樣的,那么找一個bmp的文件頭加上去嘛
加完之后,依舊是打不開的啊???難道是覆蓋原來的地方么,那再試試吧!
還是打不開,看來是我想的太簡單了。。。然后找資料詳細了解一下bmp文件頭
BMP文件分析
BMP(全稱Bitmap)是Windows操作系統中的標准圖像文件格式,可以分成兩類:設備相關位圖(DDB)和設備無關位圖(DIB),使用非常廣。它采用位映射存儲格式,除了圖像深度可選以外,不采用其他任何壓縮,因此,BMP文件所占用的空間很大。
BMP文件的圖像深度可選1bit、4bit、8bit、16bit、24bit、32bit。BMP文件存儲數據時,圖像的掃描方式是按從左到右、從下到上的順序。由於BMP文件格式是Windows環境中交換與圖有關的數據的一種標准,因此在Windows環境中運行的圖形圖像軟件都支持BMP圖像格式。
數據段名稱 | 大小(byte) |
---|---|
bmp文件頭 | 14 |
位圖信息頭 | 40 |
調色板 | 由顏色索引數決定 |
位圖數據 | 由圖像尺寸決定 |
圖像通常保存的顏色深度有:wikipedia
- 每像素1位:支持2種不同的顏色(例如:黑色和白色)像素值存儲在每個位中,也即調色板有兩個;
- 每像素2位:支持4種不同的顏色,每1字節存儲4個像;
- 每像素4位:支持16種不同的顏色,每1字節存儲2個像素;
- 每像素8位:支持256種不同的顏色,每1字節存儲1個像素;
- 每像素16位:支持65536種不同的顏色,每2字節WORD存儲1個像素;
- 每像素24位:支持16,777,216種不同顏色(真彩色),每3字節存儲1個像素值,沒有調色板;
- 每像素32位:支持4,294,967,296種不同顏色,每4字節DWORD存儲1個像素,沒有調色板;
BMP文件頭
字節(byte) | 內容 (HEX) |
---|---|
0-1(2byte) | 4D 42(固定) 表示文件類型 |
2-5(4byte) | 表示文件的大小 |
6-7(2byte) | 00 00(固定)保留位 |
8-9(2byte) | 00 00(固定)保留位 |
a-d(4byte) | 4字節的偏移,表示從文件頭到位圖數據的偏移 |
位圖信息頭
字節 | 內容(HEX) |
---|---|
4byte | 28 00 00 00(固定)信息頭的大小 |
4byte | 寬度(以像素為單位) |
4byte | 高度(以像素為單位) 同時如果為正,說明位圖倒立(即數據表示從圖像的左下角到右上角),如果為負說明正向; |
2byte | 為目標設備說明顏色平面數,總被設置為1 |
2byte | 位數/像素數,十進制值有1、2、4、8、16、24、32 |
4byte | 說明位圖數據的壓類型( 00 00 00 00 表示不壓縮) |
4byte | 說明位圖數據的大小,即圖像大小=文件大小-偏移量 |
4byte | 水平分辨率 |
4byte | 垂直分辨率 |
4byte | 顏色索引數 |
調色板
不都有
題目
分析之后發現,不是所有的bmp文件頭數據都是一樣的,所以需要知道文件的大小,寬高才能夠匹配正確的文件頭
- 在這里可以看到文件大小為 230454 byte;
- 圖像大小為 230454-54=230400 byte;
- 那么寬高是是多少呢?
- 這里得看位圖是多少,現在常見的就是24位,每三個字節存儲一個像素
- 還有就是文件尾部看到的 00 00 00也可以得知是24位的
- 圖像大小=寬 x 高 x 3
- 得知是 320 x 240 x 3
覆蓋到文件頭得到下面圖片: