holyshield puzzle
이런식으로 이미지가 주어지는데 이걸 합쳐서 하나의 이미지로 만들어야한다
http://swlock.blogspot.kr/2015/12/script-python-tile.html 우선 이 글을 참고했다
파일 이름이 00_00.png이런식인데 1단계는 쉽게 통과할 수 있다
2단계는 base64인데 디코딩을해서 파일이름을 위와같이 만들어주고 합치면된다
이제 3단계인데 3단계는 MD5로 되어있다 md5는 복고화가 일일이 안되니
반대로 생각해보면된다 파일 형식은 00_00.png이런식이다 그러므로 01_01.png이름을 md5로 해서 찾으면 된다
1 2 3 4 5 6 7 8 9 10 11 12 13 | import os import hashlib for x in range(1, 100): for y in range(1, 97): try: a = hashlib.md5("%02d_%02d.png" % (x, y)).hexdigest() os.rename(a, "%02d_%02d.png" % (x, y)) except WindowsError: pass | cs |
우선 이런식으로 이름을 정렬해준다 그다음은 1~2단계와 같이 합쳐주기만 하면 끝
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | from pytesser import * """ save file name """ savefilename = "out_new.png" """ load file name """ loadfilename = [] for x in range(1, 100): for y in range(1, 97): loadfilename.append("%02d_%02d.png" % (x, y)) sizeColumn = 96 image = Image.open(loadfilename[0]) x = image.size[0]; y = image.size[0]; length = len(loadfilename); newimg=Image.new("RGBA",( int(sizeColumn*(x)) , int((((length-1)/sizeColumn)+1)*(y)) ) ) print "x,y:",x,y,int(sizeColumn),int(((length-1)/sizeColumn)+1),( int(sizeColumn*(x)) , int((((length-1)/sizeColumn)+1)*(y)) ) i = 0; for j in loadfilename: image = Image.open(j) box = (0,0,x,y) cutting = image.crop(box) print "process:",j,(i/sizeColumn),(i%sizeColumn),box,((x)*(i/sizeColumn),(y)*(i%sizeColumn)) newimg.paste(cutting,((x)*(i%sizeColumn),(y)*(i/sizeColumn))) i=i+1; newimg.save(savefilename,"PNG") | cs |
9000장이라 리스트에 넣고 하는 방법은 코드 효율이 안좋지만 일단 그걸 따지고 만들었던게 아니라서 1단계 2단계에서 썼던방법대로 하고 한 3분정도 기다렸다
기다리다가 지쳐서 껐지만 폴더를 보니 이런 사진이 있었다
'CTF > Write-up' 카테고리의 다른 글
holyshield BrokenPiano (0) | 2016.12.22 |
---|---|
holyshield sound (0) | 2016.12.20 |
holyshield ransome (0) | 2016.12.19 |
holyshield easylang (0) | 2016.12.19 |
holyshield StudyScala (0) | 2016.12.19 |