在幾個比賽中以及網上彙總了幾個隱寫題目,都是關於圖片的,所以為了以後的比賽可以寫出一些腳本來備用,彌補stegsolve等隱寫工具的不足。
第一個題目
題目是如圖所示一個圖片
一堆雜色,隱隱約約好像有字,看了看元數據裡沒啥東西,binwalk也沒隱藏啥東西,改了改高度也沒隱藏的信息,用Stegsolve看了看預設的幾個通道,也沒啥東西,估計就是在像素的低位藏了東西了吧,下面科普一下png的知識
png支持RGBA四個通道,每個通道佔8個二進制位,隱寫文件或數據一般都在各個通道的低位,因為低位的變化不會引起較大的視覺變化,圖片還是原來的圖片,但是你不知道是在哪個通道,這裡有4個通道,如果藏在一個通道的低位的話,有四種可能,如果藏在兩個通道的低位的話,可能進行各種運算操作後出現新的圖片,加減乘除與或異或,具體的運算符也沒幾個,這樣的話全部列舉出來也不費多長時間,用python寫個腳本留著以後用就好了
importcv2
importnumpy as np
importos
deflowbit(x):
returnx&0x1
png= cv2.imread("flag_enc.png" , cv2.IMREAD_UNCHANGED)
os.system("mkdirtemp")
os.system("cdtemp")
fori in range(0,4):
forf 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)
fori in range(0,4):
forf 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)
fori in range(0,4):
forf 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)
Stegsolve的combine功能太麻煩了,還要提取通道再運算,況且你也不知道是哪兩個通道進行運算,所以我們用opencv直接提取出所有通道,暴力把所有通道的所有運算結果都生成圖片,一眼就看出來了哪個有flag
第二個題目
忘了哪的題了,最後有一堆座標,座標,RGB之類的無非就是圖片,看看最大的座標都沒超過300的,就用opencv創建畫布,寫進去就好了,腳本優化了一下,本來是循環300*300的畫布,判斷座標是否在txt裡,加上判斷操作就很慢了,這裡直接用numpy的ones函數創建了畫布是白色的,那就循環座標的數組改掉畫布的像素就好了,運行比較快不用等
importcv2
importos
importnumpy as np
n=0
canvas= np.ones((300, 300, 3), dtype="uint8")
canvas=canvas*255
list=open("123.txt").read().split("\n")
list=[i.split(",")for i in list]
forp in list:
canvas[int(p[0]),int(p[1])]=[0,0,0]
cv2.imwrite("2.jpg",canvas)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
掃描後得到
flag{40fc0a979f759c8892f4dc045e28b820}
第三個題目
分析數據包後得到一個txt,裡面又是數字,但是這次每行是三個數字,範圍從0到255之內,沒有超過的,於是猜測是像素點,但是我們不知道圖片的長寬就沒有辦法生成圖片,拉到txt最下面發現是98457行,於是嘗試分解質因數
即111*887,flag的話,那就是一長串字符,應該是887*111吧
import cv2
import os
import numpy as np
canvas = np.zeros((111, 887, 3), dtype="uint8")
list=open("ce.txt").read().split("\n")
for y in range(0,887):
for x in range(0,111):
arr=list[x+(y)*111].split(",")
canvas[x,y]=[arr[0],arr[1],arr[2]]
cv2.imwrite("2.jpg", canvas)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)
圖片的題目們用opencv-python來寫腳本解題還是很方便快捷的。圖片直接是numpy數組,方便操作,也方便獲取低位,直接和0x1進行按位與操作便可。
閱讀更多 合天網安實驗室 的文章