R136A1

[ctf-d] 우리는 grayD의 49개 음영을 가지고 있습니다. :: else (PIL) 본문

FORENSIC/ctf-d

[ctf-d] 우리는 grayD의 49개 음영을 가지고 있습니다. :: else (PIL)

r136a1x27 2022. 1. 18. 23:24

grayD라고 했으니 grayscale(회색조) 범위 내에 있는 것을 유추할 수 있고

포토샵을 꺼내서 개념 확인을 해본다

 

색상 피커에서 왼쪽에 딱 붙어서 위로 쭉 올라가면 회색조 범위이다

R,G,B값이 모두 동일하게 증가하는 것을 확인할 수 있다.

같은 원리로 272727 a6a6a6 과 같이 색상 코드 또한 깔끔한데,

이는 R 8비트 / G 8비트 / B 8비트씩 사용하게 되어 두 자리씩 같은 16진수가 반복되게 된다


Python PIL을 사용하여 코드를 짜보자.

한 픽셀씩 데이터를 읽어 어떤 값을 가지고 있는지 확인한다.

데이터는 튜플이 반환되고, 이미지의 색채널에 따라 반환 형이 다른데

일반적인 RGB의 경우 (R, G, B)의 튜플로 반환된다

from PIL import Image

img = Image.open("shades.png")
width, height = img.size

data = []

for h in range(height):
    for w in range(width):
        pixel = img.getpixel((w, h)) # 튜플 (r, g, b)를 반환
        data.append(pixel[0])

print(sorted(list(set(data))))

문제에서 제시된 #000000 ~ #F5F5F5 범위 내에서만 관찰하면 될 것 같다 F5는 10진수로 245에 해당한다

[0, 5, 10, 15, 20, 25, 30, 35, 40, 
 45, 50, 55, 60, 65, 70, 75, 
 85, 90, 95, 100, 105, 110, 115, 120, 
 125, 130, 135, 140, 145, 150, 155, 160, 
 165, 170, 175, 180, 185, 190, 195, 200,
 205, 210, 215, 220, 225, 230, 235, 240, 
 245]

결과를 보면 5씩 증가하고, 80이 비어있음을 알 수 있다.

이를 색상코드로 변환하면 80=0x50이므로 505050이다.

 

Comments