Skip to content

Instantly share code, notes, and snippets.

@ubuntor
Created October 18, 2015 17:56
Show Gist options
  • Save ubuntor/892c0d050c97180df172 to your computer and use it in GitHub Desktop.
Save ubuntor/892c0d050c97180df172 to your computer and use it in GitHub Desktop.
import zlib
import struct
import sys
import codecs
from PIL import Image
s = open('flag.puzzle','rb').read()
size = 57
def xor(data, byte):
return bytes([data[i]^byte for i in range(len(data))])
prekey = b'\x65\x30\x56\xc3\x78' + bytes([255,75,191,247,71,55,227,111,83,38,76,37,244])
good = b''
for i in range(len(prekey)):
good += xor(s[size*i:size*(i+1)],prekey[i])
print(good)
pregood, good = good.split(b'IDAT')
pregood += b'IDAT'
print(good)
dd = ''
for k in range(len(prekey),19):
print('chunk',k)
chunk = s[size*k:size*(k+1)]
maxi = 0
maxc = 0
for i in range(256): # vary?
try:
d = zlib.decompressobj()
g = good + xor(chunk,i)
#print(g)
dd = d.decompress(g)
#print(dd,len(dd))
if any([dd[j] not in [0,1,2,3,4] for j in range(0,len(dd),115)]):
continue
#print([dd[j] for j in range(1,len(dd),115)])
if (any([dd[j] not in [255] for j in range(1,len(dd),115)])
or any([dd[j] not in [255] for j in range(114,len(dd),115)])):
continue
print(k,i)
count = dd.count(b'\xff')
if count > maxc:
maxi = i
maxc = count
print(k,maxi,maxc)
#good = g
except zlib.error:
continue
if maxc == 0:
print("fail")
sys.exit(1)
good += xor(chunk,maxi)
im = Image.new('1',(912,912))
for i in range(0,len(dd)-115,115):
for j in range(114):
for k in range(8):
im.putpixel((j*8+k,i//115),dd[i+1+j])
im.show()
im.save('good2.png')
'''
good = pregood + g + xor(s[size*19:size*20],0x1b)
# crc fix
crc = struct.pack(">I",zlib.crc32(b'IDAT'+good.split(b'IDAT')[1].split(b'IEND')[0][:-8]))
good = good[:-16]+crc+good[-12:]
# palette fix
good = good.split(b'PLTE')[0] + b'PLTE\x00\x00\x00\xff\xff\xff\xa5\xd9\x9f\xdd' + good.split(b'PLTE')[1][10:]
#print(good)
open('good.png','wb').write(good)
'''
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment