幾個隱寫題目的總結

在幾個比賽中以及網上彙總了幾個隱寫題目,都是關於圖片的,所以為了以後的比賽可以寫出一些腳本來備用,彌補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進行按位與操作便可。

幾個隱寫題目的總結



分享到:


相關文章: