CTF-圖片隱寫-PNG圖片修改寬高值的py3爆破

今天拿到一個(gè)png圖片隱寫的題疚俱。
對于這種windows下可以打開,linux下無法打開的png文件,當(dāng)然是第一時(shí)間懷疑寬和高做了手腳墓陈。

爆破crc校驗(yàn)所需要了解到的PNG文件頭知識(shí)
- (固定)八個(gè)字節(jié)89 50 4E 47 0D 0A 1A 0A為png的文件頭
- (固定)四個(gè)字節(jié)00 00 00 0D(即為十進(jìn)制的13)代表數(shù)據(jù)塊的長度為13
- (固定)四個(gè)字節(jié)49 48 44 52(即為ASCII碼的IHDR)是文件頭數(shù)據(jù)塊的標(biāo)示(IDCH)
- (可變)13位數(shù)據(jù)塊(IHDR)
    - 前四個(gè)字節(jié)代表該圖片的寬
    - 后四個(gè)字節(jié)代表該圖片的高
    - 后五個(gè)字節(jié)依次為:
    Bit depth、ColorType第献、Compression method贡必、Filter method、Interlace method
- (可變)剩余四字節(jié)為該png的CRC檢驗(yàn)碼庸毫,由從IDCH到IHDR的十七位字節(jié)進(jìn)行crc計(jì)算得到仔拟。
寬和高做了手腳的位置

但我只有手頭抄的別人python2.7的腳本,放在python3下運(yùn)行不了(……)
在不斷的調(diào)試中發(fā)現(xiàn):

  • 有數(shù)值超過了127岔绸,ascii不認(rèn)
  • binascii在python3下不支持unicode編碼理逊,必須輸入字節(jié)碼,改成b''就能運(yùn)行了盒揉,但沒辦法payload拼接在一起爆破
  • python3把文本和二進(jìn)制分開晋被,字節(jié)碼不能拼接
  • 用string.encode('utf-8')倒是能運(yùn)行了,但是沒爆破出來刚盈,仔細(xì)一看發(fā)現(xiàn)編碼會(huì)把超過ascii范圍的譬如\xf4拆成b'\xc3\xb4'
  • ……

搜了一圈又冷靜下來羡洛,覺得字節(jié)碼不能拼接就不拼接嘛……走別的路徑行不行?
行。
搜到bytearray()是個(gè)好東西欲侮,相比bytes字節(jié)串崭闲,bytearray是可修改的。是的我們知道在python2里可直接str拼接威蕉,但是我決定堅(jiān)守在python3里(其實(shí)就是懶得裝)刁俭,于是開始了數(shù)組賦值的過程。

python3.6下的代碼如下
import zlib
import struct
crc32key = 0xCBD6DF8A #補(bǔ)上0x韧涨,winhex下copy hex value牍戚。
data = bytearray(b'\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xF1\x08\x06\x00\x00\x00')   #winhex下copy grep hex。
n = 4095 #理論上0xffffffff,但考慮到屏幕實(shí)際/cpu虑粥,0x0fff就差不多了
for w in range(n):#高和寬一起爆破
    width = bytearray(struct.pack('>i', w))#q為8字節(jié)如孝,i為4字節(jié),h為2字節(jié)
    for h in range(n):
    height = bytearray(struct.pack('>i', h))
        for x in range(4):
            data[x+4] = width[x]
            data[x+8] = height[x]
        crc32result = zlib.crc32(data)
        if crc32result == crc32key:
            print(width,height)
            return None

一開始用的n是65535娩贷,感覺要花掉一生的時(shí)間第晰,自己手動(dòng)取消了()
就算這樣,本來也是沒有最后這行return的彬祖,我只是把65535換成了4095茁瘦。跑出結(jié)果我花了58s的時(shí)間,丟給老師涧至,他在虛擬機(jī)里只用了3s腹躁。
想要挽回自己的尊嚴(yán)()
想要買臺(tái)新電腦()


心得
  • 今天為了做這道題把png啊struct啊crc啊bytes啊甚至py2到py3的知識(shí)全都過了一遍∧吓睿基礎(chǔ)知識(shí)還是要扎實(shí)啊纺非,或者出問題的時(shí)候再冷靜點(diǎn)()
  • 其實(shí)寫到這里我覺得為什么不直接rb讀文件再slice一下而要手動(dòng)從winhex貼呢,如此的不neat赘方。但是好困了我要睡覺……

20170727更新:一鍵解決png圖片crc隱寫的代碼

import zlib
import struct
#讀文件
file = CommonFile+'2.png' 
fr = open(file,'rb').read()
data = bytearray(fr[12:29])
crc32key = eval(str(fr[29:33]).replace('\\x','').replace("b'",'0x').replace("'",''))
#crc32key = 0xCBD6DF8A #補(bǔ)上0x烧颖,copy hex value
#data = bytearray(b'\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xF1\x08\x06\x00\x00\x00')  #hex下copy grep hex 
n = 4095 #理論上0xffffffff,但考慮到屏幕實(shí)際,0x0fff就差不多了
for w in range(n):#高和寬一起爆破
    width = bytearray(struct.pack('>i', w))#q為8字節(jié)窄陡,i為4字節(jié)炕淮,h為2字節(jié)
    for h in range(n):
        height = bytearray(struct.pack('>i', h))
        for x in range(4):
            data[x+4] = width[x]
            data[x+8] = height[x]
            #print(data)
        crc32result = zlib.crc32(data)
        if crc32result == crc32key:
            print(width,height)
            #寫文件
            newpic = bytearray(fr)
            for x in range(4):
                newpic[x+16] = width[x]
                newpic[x+20] = height[x]
            fw = open(file+'.png','wb')#保存副本
            fw.write(newpic)
            fw.close
            return None
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市跳夭,隨后出現(xiàn)的幾起案子涂圆,更是在濱河造成了極大的恐慌,老刑警劉巖币叹,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件润歉,死亡現(xiàn)場離奇詭異,居然都是意外死亡颈抚,警方通過查閱死者的電腦和手機(jī)踩衩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驱富,你說我怎么就攤上這事锚赤。” “怎么了褐鸥?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵线脚,是天一觀的道長。 經(jīng)常有香客問我晶疼,道長酒贬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任翠霍,我火速辦了婚禮,結(jié)果婚禮上蠢莺,老公的妹妹穿的比我還像新娘寒匙。我一直安慰自己,他們只是感情好躏将,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布锄弱。 她就那樣靜靜地躺著,像睡著了一般祸憋。 火紅的嫁衣襯著肌膚如雪会宪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天蚯窥,我揣著相機(jī)與錄音掸鹅,去河邊找鬼。 笑死拦赠,一個(gè)胖子當(dāng)著我的面吹牛巍沙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荷鼠,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼句携,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了允乐?” 一聲冷哼從身側(cè)響起矮嫉,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牍疏,沒想到半個(gè)月后蠢笋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡麸澜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年挺尿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡编矾,死狀恐怖熟史,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窄俏,我是刑警寧澤蹂匹,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站凹蜈,受9級特大地震影響限寞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仰坦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一履植、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悄晃,春花似錦玫霎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眷蚓,卻和暖如春鼻种,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沙热。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工叉钥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人校读。 一個(gè)月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓沼侣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親歉秫。 傳聞我的和親對象是個(gè)殘疾皇子蛾洛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1 字符編碼簡介 1.1 ASCII ASCII:American Standard Code for Infor...
    hufengreborn閱讀 8,321評論 3 23
  • 一. 什么是編碼 將明文轉(zhuǎn)換為計(jì)算機(jī)可以識(shí)別的的編碼文本稱為“編碼”, 反之從計(jì)算機(jī)可識(shí)別的編碼文本轉(zhuǎn)回明文為“解...
    Techml閱讀 4,822評論 0 3
  • 一雁芙、什么是編碼 編碼是指信息從一種形式或格式轉(zhuǎn)換為另一種形式或格式的過程轧膘。 在計(jì)算機(jī)中,編碼兔甘,簡而言之谎碍,就是將人能...
    milomallo閱讀 437評論 0 0
  • 字符集和編碼簡介 在編程中常常可以見到各種字符集和編碼洞焙,包括ASCII,MBCS,Unicode等字符集蟆淀。確切的說...
    蘭山小亭閱讀 8,464評論 0 13
  • 我時(shí)常流著眼淚熔任,等不到一個(gè)電話褒链。 我時(shí)常翻看著車票,等不到一場久別重逢疑苔。 我時(shí)常手寫著計(jì)劃甫匹,等不到一個(gè)未來。 我時(shí)...
    榴蓮姑娘r閱讀 770評論 3 6