일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- C
- 오라클
- ubuntu
- Database
- 파이썬 첼린지
- 러스트
- 자바 개념
- data communication
- 자바
- Operating System
- 자바 기초
- 파이썬
- 데이터베이스
- 러스트 프로그래밍 공식 가이드
- 파이썬 알고리즘
- 오라클DB
- 알고리즘
- 파이썬 챌린지
- 백준
- 운영체제
- Python challenge
- 우분투
- 백준 러스트
- 데이터 통신
- Reversing
- Rust
- 러스트 예제
- java
- Python
- OS
Archives
- Today
- Total
IT’s Portfolio
[Python Challenge] Level 7 풀이 본문
728x90
반응형
Python Challenge 7 풀이
Explanation
Secret Info Website
import re
from PIL import Image
from get_html_source import get_html
# url = 'http://www.pythonchallenge.com/pc/def/oxygen.png'
# A = get_html(url)
# with open('oxygen.png', 'wb') as f:
# f.write(A.get_content())
'''
save image to working directory
'''
- 해당 이미지를 작업 디렉터리에 넣는 코드
- 딱히 웹페이지에서 얻을 힌트는 없음
- 페이지 중간의 사진을 보면 색깔이 나열된 띠가 있음
- 사진의 픽셀을 분석해야 하는 문제 같음 => PIL module
- PIL module은
pip install PIL
이 아닌pip install pillow
로 패키지를 다운받아야 함
- PIL module은
Solution Process 1
with Image.open('oxygen.png', 'r') as img:
width, height = img.size
# with open('source.txt', 'wt') as f:
# for y in range(height):
# f.write(f'{y} {img.getpixel((0, y))}\n')
'''
characteristics of white to black: Same R,G,B values
43 (115, 115, 115, 255)
44 (115, 115, 115, 255)
45 (115, 115, 115, 255)
46 (115, 115, 115, 255)
47 (115, 115, 115, 255)
48 (115, 115, 115, 255)
49 (115, 115, 115, 255)
50 (115, 115, 115, 255)
51 (115, 115, 115, 255)
rows 43 ~ 51 are the same
height//2 == 47
'''
- Image 객체의 size 메서드는 너비와 높이 순으로 Tuple을 반환함
- White to Black 색깔의 특징은 RGB 값이 모두 같음
- 해당 이미지의 1열에 해당하는 RGB 값을 뽑아보면 43~51행이 같은 RGB 값을 갖고 있음
- 이미지 높이의 중간에 해당하는 47행을 기본값으로 설정하고 진행
Solution Process 2
# with open('source.txt', 'wt') as f:
# for x in range(width):
# f.write(f'{x} {img.getpixel((x, height//2))}\n')
'''
0 (115, 115, 115, 255)
1 (115, 115, 115, 255)
2 (115, 115, 115, 255)
3 (115, 115, 115, 255)
4 (115, 115, 115, 255)
5 (109, 109, 109, 255)
6 (109, 109, 109, 255)
7 (109, 109, 109, 255)
8 (109, 109, 109, 255)
9 (109, 109, 109, 255)
10 (109, 109, 109, 255)
11 (109, 109, 109, 255)
12 (97, 97, 97, 255)
...
606 (93, 93, 93, 255)
607 (93, 93, 93, 255)
608 (114, 112, 71, 255)
609 (112, 110, 69, 255)
628 (99, 85, 46, 255)
Repeat the same value 7 times
Values don't exceed 128(max of ASCII code) => Value can be changed to ASCII code
'''
- 47행의 모든 열을 살펴보면 동일한 값이 7번 반복되는 것을 알 수 있음
- 그리고 동일한 값이 128을 넘지 않음으로 보아 해당 값을 ASCII 코드값으로 변경할 수 있어 보임
Solution Process 3
except_row = [x for x in range(width) if len(set(img.getpixel((x, height//2))))>2][0]
'''
From 608 row, the pixel value of the real image => except 608 row ~
'''
- 분석 중인 이미지를 보면 끝자리에 띠가 끊겨있고 진짜 이미지가 있는 것이 보임
- 해당 행을 찾기 위한 코드
Solution Process 4
msg = ''
for x in range(0, except_row, 7):
msg += chr(img.getpixel((x, height//2))[0])
'''
smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]
'''
- 이미지 내 띠의 RGB 값을 ASCII로 변환함
- smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]
- 다음 레벨로 갈 수 있는 단어도 ASCII로 변환해야 할 것으로 보임
Solution Process 5
m = re.findall('[0-9]{3}', msg)
print(''.join((chr(int(c)) for c in m)))
'''
integrity
'''
- 해당 메시지의 숫자 값을 정규표현식으로 처리하여 한 번에 정답이 나오도록 코딩
Answer
URL 정답값: integrity
728x90
반응형
'Security Study > Wargame Explanation' 카테고리의 다른 글
[Python Challenge] Level 6 풀이 (0) | 2022.11.09 |
---|---|
[Python Challenge] Level 5 풀이 (2) | 2019.11.24 |
[Python Challenge] Level 4 풀이 (0) | 2019.11.24 |
[Python Challenge] Level 3 풀이 (0) | 2019.11.22 |
[Python Challenge] Level 2 풀이 (0) | 2019.11.20 |
Comments