Python Challenge 26의 Url은 다음과 같다
Python challenge 26 : http://www.pythonchallenge.com/pc/hex/bin.html
구성
엄허; 부끄러운 짤이 우리를 반겨준다. 영어를 해석하면
"서두르세요. 배를 놓칠 거 같습니다."
이다. 특별한 증거가 보이지 않으니, 저기 뭐냐 주석으로 넘어가자
주석에 힌트가 쓰여있는대로면 우리는 그의 이메일을 받았을 것이라고 한다. 우선 사과를 해야 될 대상을 떠올려보자. 필자가 잘살았다고 떵떵거리진 않아도 하늘 아래 부끄러움 없이 살았는데, 뭐지? 과거를 돌아볼 필요가 있을 거 같다.
해결 아이디어
2021.06.03 - [Python/Python Challenge] - [Python Challenge 19] You are An Idiot!
이 문제의 마지막 레오폴드씨의 말을 기억하는가
그니까 우리가 뭘잘못했는지는 모르겠는데, 사과해야 된다고 한다. 사과하는 방법은 이메일로 하면 될 거 같다. 이메이 릉 19번 문제의 주석에 있다.
레오폴드 씨의 이메일은 leopold.moz@pythonchallenge.com이다. 메일을 보내자 얼마지나지 않아 다음과 같은 답변을 받을 수 있다.
일단 24문제를 풀었던 파일중 mybroken.zip이라는 파일이 있었다. 파일이 손상된 파일이었는데, 어딘가 해시로 장난질을 하는 게 있나 보다. 우선 해시를 저런 식으로 보냈다는 것은 정상적인 파일의 해시값이 저 모양이라는 것이다. 한번 mybroken.zip의 해시를 구해보자
### 26_1.py
import hashlib
if __name__=="__main__" :
with open("mybroken.zip","rb") as f:
data = f.read()
print(hashlib.md5(data).hexdigest())
결과는 "bbf6616928e23ecfef4b717f281c53cc" 이다. 레오폴드 씨가 보낸 해시랑은 다르다. 파일 또한 열어보면 어딘가 손상이 되었다는 안내를 받을 수 있다. 보통 이런 복구는 쉬운 일이 아닌데, Python Challenge는 다행히도, 한 바이트만 손상시켜놨다.(뭐 어딘지 모르고 뭔지 모르는 게 문제이긴 한데, 그건 때려보자)
### 26_2.py
import hashlib
if __name__=="__main__" :
tar = "bbb8b499a0eef99b52c7f13f4e78c24b"
stop = False
with open("mybroken.zip","rb") as f:
ori_dat = f.read()
for i in range(len(ori_dat)) :
if(stop==True) :
break
for b in range(256) :
tmp = ori_dat[:i]+bytes([b])+ori_dat[i+1:]
if(hashlib.md5(tmp).hexdigest()==tar) :
with open("notbroken.zip","wb") as f:
f.write(tmp)
stop = True
결과는 다음과 같은 사진이다.
스삐드! 위에 있던 문자열인 boat를 합치면 speedboat가 된다. 이게 답이다.
Answer Url : http://www.pythonchallenge.com/pc/hex/speedboat.html
* 이건 여담인데, zip 파일은 단순하게 CRC가 안 맞아서 안 열리는 거기 때문에, 요즘의 zip/unzip프로그램에서 대부분 해석해서 그냥 연다.
개그다.
'Python > Python Challenge' 카테고리의 다른 글
[Python Challenge 28] 륑륑륑 (2) | 2021.06.29 |
---|---|
[Python Challenge 27] 지퍼올리세요 (2) | 2021.06.26 |
[Python Challenge 25] 퍼즐맞추기 (0) | 2021.06.06 |
[Python Challenge 24] 보너스 타임! 기본으로 돌아갈 때 (0) | 2021.06.05 |
[Python Challenge 23] 보너스 타임! 기본으로 돌아갈 때 (0) | 2021.06.05 |