游戲秘籍
題目名稱:游戲秘籍
題目說明:做為程式員我的,竟然無法調出30條命,我用筆記記錄下來了,
0x01 LSB隱寫
下載后是一張魂斗羅的圖片30.png,先用zsteg 30.png查看一下,發現有PK開頭的字符,可能是壓縮包,用zsteg -E "extradata:0" 30.png > 30.zip提取壓縮包,
0x02 壓縮包重組
用010editor打開,發現一段提示:Need_Find_The_Passwd_to_unzip_file0,保存壓縮包后,雙擊打開發現壓縮包損壞,而且開頭是50 4B 01 02, 
打開一個正常壓縮包會發現開頭是50 4B 03 04,而且在結尾處會有50 4B 01 02和50 4B 05 06等欄位,懷疑需要將壓縮包重組,搜索05 06、03 04 欄位,發現均缺少50 4B,加上后重組順序,壓縮包可以正常打開,但需要密碼,
0x03 IDAT資料隱寫
目標轉到原圖30.png,對影像嘗試各種隱寫無果,用010editor打開,發現存在很多*ERROR: CRC Mismatch @ chunk[17]; in data: 5468655f; expected: 4a57f189類似的錯誤,

將in data:后的資料拷貝出來,按照順序生成二進制檔案,得到hint:The_hint_is:U1kkgG:VbDE3[1oy[1EeDEy0ghSzF>>>>上面字串異或零叉零三然后在BASE64解碼,You_

寫python腳本獲得密碼What?That_is_a_passwd?!解壓壓縮包得到Flag.txt,到這一步感覺已經勝利在望了,沒想到才剛剛開始= = ,
import base64
str1 = "U1kkgG:VbDE3[1oy[1Ee`DEy`0ghSzF>>>>"
flag_base64=""
for i in range(len(str1)):
a = ord(str1[i])^0x03
flag_base64 += chr(a)
print(flag_base64)
flag = base64.b64decode(flag_base64)
# What?That_is_a_passwd?!
0x04 LaTeX公式
打開txt檔案發現是一串下面的編碼,游戲筆記 \begin{array}{c}\begin{array}{c}\begin{array}{c|ccccc}\\\uparrow\uparrow&0&1&2&3&4\\\hline0&1&1&1&1&1,查了很久資料發現是LaTeX代碼,官方給出Hint2:MD真好用,繼續查資料發現在md語法中兩個$$中可以加入LaTeX代碼,就會表示成公式,


0x05 二維碼
看到了5行5列的表格,全是由01組成,想到了二維碼,根據題目魂斗羅調30條命,百度發現秘籍是 上上下下左右左右BABA,(這里也是一個小Bug,可能主辦方沒想那么多,我開始也沒想那么多,就用上上下下左左右右ABAB來排列的),具體代碼如下:
from PIL import Image
from zlib import *
MAX = 23
pic = Image.new("RGB", (MAX, MAX))
str = "1111111000010110111111110000010011110101000001101110101101101010111011011101001101110101110110111010010000001011101100000100000101010000011111111011010010111111100000000110111100000000111011111110110110001001000001010000001111101111101001101001000100010101111111001000110101100111100000111100101110001000001110101000001010101111110011111111111010000000010101010001101111111110100101101010101100000101111111000100011011101010000111111010110111010000110011110110101110101110011111011011000001010110101100011111111110111001001100001"
i = 0
for y in range(0, MAX):
for x in range(0, MAX):
if(str[i] == '1'):
pic.putpixel([x, y], (0, 0, 0))
else:
pic.putpixel([x, y], (255, 255, 255))
i = i+1
pic.show()
pic.save("flag.png")
生成了一個23x23的二維碼,但是怎么掃都不對,開始做題的時候也覺得23x23的尺寸不合理,但是想到已經到這一步了,可能不會再有坑了,沒想到果然又是一個坑,
0x06 零寬位元組隱寫
其實在用Typora打開LaTeX代碼的時候就發現了很多紅點,最后5分鐘,主辦方又提示注意隱寫才想到零寬位元組隱寫,加上想到version2 二維碼的標準大小應該是25x25才恍然大悟,但時間已經來不及了,零寬位元組隱寫解密網站:https://330k.github.io/misc_tools/unicode_steganography.html,注意不要全部復制,要單行解密,最終生成一個二維碼掃描得到flagBMZCTF{y0u_f1nd_the_4l@g},
from PIL import Image
from zlib import *
MAX = 25
pic = Image.new("RGB", (MAX, MAX))
str = "1111111011001011101111111100000100011110010100000110111010111011001010111011011101001110101101011101101110100010000000101110110000010010001101010000011111111010101010101111111000000001110111110000000011101111101101010110001000001010110100010100010011100000101100000001111101111101001100100010001000101011111110001000011010110011110000001111100101110010100111000110110100100110100000111101011000001010101111110101111111111110100000000100101101000110111111111011001011101010101100000101111111110001000110111010110000111111101011011101000001100011110110101110101011001111110110110000010100110110110001111111111011110011001100001"
i = 0
for y in range(0, MAX):
for x in range(0, MAX):
if(str[i] == '1'):
pic.putpixel([x, y], (0, 0, 0))
else:
pic.putpixel([x, y], (255, 255, 255))
i = i+1
pic.show()
pic.save("flag.png")
總結:
感覺這道Misc題出的很好,師傅很用心了,聽主辦方說這題最終只有一解,還是在最后幾分鐘,感覺很可惜,但確實學到了很多東西,尤其是md添加LaTeX公式這種操作,還加深了對零款位元組的理解,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/401488.html
標籤:其他
上一篇:暢玩三子棋(可選擇棋盤大小)
