본문 바로가기
CTF/PythonChallenge

[PCC] PythonChallenge Level 5 problem-soving

by 선인장 🌵 2022. 8. 19.
728x90
728x90

PythonChallenge Level 5 problem-soving

바로 전에 Level 4 문제에 대해서 풀어 보았다.

다행히도 이전 Level 3 문제보다는 쉽게 풀었다. 그러나 계속 Level이 올라갈수록 점점 난해한 문제가 많을 것 같은 느낌이 든다.

시간이 걸리더라도 계속해서 한번 풀어나가 보도록 하자.

[PCC] PythonChallenge Level 5 problem-soving

자 이번에는 Level 5 문제에 대해서 풀어 보도록 하자.

1. 문제 확인

Level 4 문제를 풀고 나서 확인된 Level 5 문제의 주소는 아래와 같다.

 

peak hell

 

www.pythonchallenge.com

1. 문제 확인
1. 문제 확인

일단 문제는 확인하였고 화면에는 동산?? 산?? 언덕?? 과 같은 이미지 한 개와 "pronounce it(발음하다)"라고 작성된 내용을 확인할 수 있었다.

728x90

2. 풀이 과정

문제를 보고 "pronounce it(발음하다)" 내용과 이미지만 보고서는 무엇을 의미하는지 알 수가 없었다.

역시나 이전 문제들처럼 우선은 페이지 소스에 무언가 있을 수 있으니 한번 확인해보았다.

2. 풀이 과정
2. 풀이 과정

역시나 페이지 소스에는 주석으로 처리된 내용이 있었다.

"peak hell sounds familiar ?(피크 지옥이 친숙하게 들리나요?)" 도대체 무엇을 의미하는지 알 수가 없었다.

도저히 무엇을 의미하는지 알 수가 없어서 일단 HTML상에도 그렇고 이미지명에도 있는 peakhell이라는 단어를 검색해 보았다.

검색 결과에는 다른 사람들이 풀었던 내용들만 대부분 검색이 되었다.

일단 검색 결과에 나온 내용을 확인하지 않았다. 한번 보면 다음 문제들도 모를 때마다 검색하여 답을 얻을 것 같아서 다른 사람들이 작성한 내용은 하나도 확인하지 않았다.

두 번째로 peakhell이라는 태그에 연결된 소스파일인 "banner.p" 파일이 보여서 해당 파일을 클릭해보았다.

2. 풀이 과정
2. 풀이 과정

파일 역시 알 수 없는 문자열이 있는 상태라 어떻게 해결을 해야 하는지 아예 생각조차 나지 않았다.

그래서 이 상태 그대로 하루가 그냥 지나갔고 다른 일들을 하고 나니 3일 지나 버렸다.

728x90

3일 만에 다시 내용을 보았으니 역시 이전과 동일하게 정확한 의미를 찾지 못하였다.

다만, ".p"라는 확장자로 파일을 만든 의미가 있지 않을까 해서 ".p" 확장자로 연결되는 프로그램이 무엇인지를 찾아보았다.

지금까지 ".p" 확장자를 사용하는 부분을 본 적이 없었다.

 

P File Extension - What is a .p file and how do I open it?

Verified by FileInfo.com The FileInfo.com team has independently researched all file formats and software programs listed on this page. Our goal is 100% accuracy and we only publish information about file types that we have verified. If you would like to s

fileinfo.com

".p" 확장자의 의미를 보니 Python에서 pickel 모듈에 의해서 생성된 파일임을 알 수 있었다.

다시 나와 있는 내용을 보면서 곰곰이 생각해보니 "peak hell(픽힐) == pickel(피클)" 발음이 비슷하다.

그래서 힌트도 발음해보라는 거였고, 읽어보면서 친숙하게 들리는지에 대해서 적어놓은 거였다.

다행히도 파일의 확장자로 검색을 해서 확인이 되었으니 이해했지 영어권 나라 사람이 아니면 진짜 한 번에 이해할 수 있을까 라는 생각이 든다.

그럼 "banner.p"파일을 pickel 모듈을 사용하여 오픈하면 정답 혹은 힌트가 있을 것 같았다.

간단히 파일을 오픈하는 파이썬 코드를 작성해 보도록 하자.

banner.p
0.00MB

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pickle

with open('banner.p', 'rb') as f:
    data = pickle.load(f)
print(data)


### OUTPUT ###
[[(' ', 95)], [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 6), ('#', 3), (' ', 6), ('#', 4), (' ', 3), ('#', 3), (' ', 9), ('#', 3), (' ', 7), ('#', 5), (' ', 3), ('#', 3), (' ', 4), ('#', 5), (' ', 3), ('#', 3), (' ', 10), ('#', 3), (' ', 7), ('#', 4), (' ', 1)], [(' ', 3), ('#', 3), (' ', 3), ('#', 2), (' ', 4), ('#', 4), (' ', 1), ('#', 7), (' ', 5), ('#', 2), (' ', 2), ('#', 3), (' ', 6), ('#', 4), (' ', 1), ('#', 7), (' ', 3), ('#', 4), (' ', 1), ('#', 7), (' ', 5), ('#', 3), (' ', 2), ('#', 3), (' ', 5), ('#', 4), (' ', 1)], [(' ', 2), ('#', 3), (' ', 5), ('#', 3), (' ', 2), ('#', 5), (' ', 4), ('#', 4), (' ', 3), ('#', 3), (' ', 3), ('#', 4), (' ', 4), ('#', 5), (' ', 4), ('#', 4), (' ', 2), ('#', 5), (' ', 4), ('#', 4), (' ', 3), ('#', 3), (' ', 5), ('#', 3), (' ', 3), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 3), (' ', 4), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 6), ('#', 4), (' ', 2), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 10), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 7), ('#', 3), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 5), ('#', 2), (' ', 3), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 7), ('#', 3), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 10), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 14), (' ', 2), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 4), ('#', 4), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 12), ('#', 4), (' ', 1)], [('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 5), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 12), ('#', 4), (' ', 1)], [(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 5), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 12), ('#', 4), (' ', 1)], [(' ', 2), ('#', 3), (' ', 6), ('#', 2), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 4), ('#', 4), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 3), (' ', 6), ('#', 2), (' ', 3), ('#', 4), (' ', 1)], [(' ', 3), ('#', 3), (' ', 4), ('#', 2), (' ', 3), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 11), (' ', 3), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 4), ('#', 3), (' ', 4), ('#', 2), (' ', 4), ('#', 4), (' ', 1)], [(' ', 6), ('#', 3), (' ', 5), ('#', 6), (' ', 4), ('#', 5), (' ', 4), ('#', 2), (' ', 4), ('#', 4), (' ', 1), ('#', 6), (' ', 4), ('#', 11), (' ', 4), ('#', 5), (' ', 6), ('#', 3), (' ', 6), ('#', 6)], [(' ', 95)]]

결과값을 보니 리스트 구조에 또 리스트 구조로 되어 있어 일단은 첫 번째 리스트에 나오는 값마다 출력을 해보았다.

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pickle

with open('banner.p', 'rb') as f:
    data = pickle.load(f)

for row in data:
    print(row)
    

### OUTPUT ###
[(' ', 95)]
[(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)]
[(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)]
[(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)]
[(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)]
[(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)]
[(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)]
[(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)]
[(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)]
[(' ', 6), ('#', 3), (' ', 6), ('#', 4), (' ', 3), ('#', 3), (' ', 9), ('#', 3), (' ', 7), ('#', 5), (' ', 3), ('#', 3), (' ', 4), ('#', 5), (' ', 3), ('#', 3), (' ', 10), ('#', 3), (' ', 7), ('#', 4), (' ', 1)]
[(' ', 3), ('#', 3), (' ', 3), ('#', 2), (' ', 4), ('#', 4), (' ', 1), ('#', 7), (' ', 5), ('#', 2), (' ', 2), ('#', 3), (' ', 6), ('#', 4), (' ', 1), ('#', 7), (' ', 3), ('#', 4), (' ', 1), ('#', 7), (' ', 5), ('#', 3), (' ', 2), ('#', 3), (' ', 5), ('#', 4), (' ', 1)]
[(' ', 2), ('#', 3), (' ', 5), ('#', 3), (' ', 2), ('#', 5), (' ', 4), ('#', 4), (' ', 3), ('#', 3), (' ', 3), ('#', 4), (' ', 4), ('#', 5), (' ', 4), ('#', 4), (' ', 2), ('#', 5), (' ', 4), ('#', 4), (' ', 3), ('#', 3), (' ', 5), ('#', 3), (' ', 3), ('#', 4), (' ', 1)]
[(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 3), (' ', 4), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 6), ('#', 4), (' ', 2), ('#', 4), (' ', 1)]
[(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 10), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 7), ('#', 3), (' ', 2), ('#', 4), (' ', 1)]
[('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 5), ('#', 2), (' ', 3), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 7), ('#', 3), (' ', 2), ('#', 4), (' ', 1)]
[('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 10), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 14), (' ', 2), ('#', 4), (' ', 1)]
[('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 4), ('#', 4), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 12), ('#', 4), (' ', 1)]
[('#', 4), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 5), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 12), ('#', 4), (' ', 1)]
[(' ', 1), ('#', 3), (' ', 11), ('#', 4), (' ', 5), ('#', 4), (' ', 1), ('#', 4), (' ', 5), ('#', 3), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 12), ('#', 4), (' ', 1)]
[(' ', 2), ('#', 3), (' ', 6), ('#', 2), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 3), (' ', 4), ('#', 4), (' ', 4), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 3), (' ', 6), ('#', 2), (' ', 3), ('#', 4), (' ', 1)]
[(' ', 3), ('#', 3), (' ', 4), ('#', 2), (' ', 3), ('#', 4), (' ', 5), ('#', 4), (' ', 3), ('#', 11), (' ', 3), ('#', 4), (' ', 5), ('#', 4), (' ', 2), ('#', 4), (' ', 5), ('#', 4), (' ', 4), ('#', 3), (' ', 4), ('#', 2), (' ', 4), ('#', 4), (' ', 1)]
[(' ', 6), ('#', 3), (' ', 5), ('#', 6), (' ', 4), ('#', 5), (' ', 4), ('#', 2), (' ', 4), ('#', 4), (' ', 1), ('#', 6), (' ', 4), ('#', 11), (' ', 4), ('#', 5), (' ', 6), ('#', 3), (' ', 6), ('#', 6)]
[(' ', 95)]

첫 번째 리스트 결과가 안에 다른 리스트 구조로 튜플 형식으로 데이터가 여러 가지가 확인되었다.

튜플 형식에도 빈 값과 #으로 구성되어있는 거 보니 먼가 글자를 만드는 게 아닐까 생각이 들었다.

그런데 어떤 방식을 통해서 만드는지가 궁금했고 튜플 형식에 존재하는 숫자의 의미도 궁금했다.

첫 번째 줄에 95인데 두 번째 줄 숫자들을 더해보니 95였다 세 번째 줄 숫자들도 더해보니 95였다.

모든 줄이 95를 나타내는지 한번 알아보는 코드를 짜보았다.

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pickle

with open('banner.p', 'rb') as f:
    data = pickle.load(f)
    line = 0

for row in data:
    line = line + 1
    ret = []
    for r in row:
        ret.append(r[1])
    print("{line}행: {sum}".format(line=line, sum=sum(ret)))


### OUTPUT ###
1행: 95
2행: 95
3행: 95
4행: 95
5행: 95
6행: 95
7행: 95
8행: 95
9행: 95
10행: 95
11행: 95
12행: 95
13행: 95
14행: 95
15행: 95
16행: 95
17행: 95
18행: 95
19행: 95
20행: 95
21행: 95
22행: 95
23행: 95

총 Line(행)은 23개이며, 모든 합은 95 임을 알 수 있다.

그렇다면 23행으로 구성된 부분이며, #을 이용해서 위치 놓으면 정답 혹은 다른 힌트를 얻을 수 있을 것으로 생각이 들어 다시 한번 코드를 작성해보았다.

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pickle

with open('banner.p', 'rb') as f:
    data = pickle.load(f)
    line = 0

for row in data:
    line = line + 1
    ret = ""
    for r in row:
        ret += r[0] * r[1]
    print("{line}행: {ret}".format(line=line, ret=ret))


### OUTPUT ###
1행:                                                                                                
2행:               #####                                                                      ##### 
3행:                ####                                                                       #### 
4행:                ####                                                                       #### 
5행:                ####                                                                       #### 
6행:                ####                                                                       #### 
7행:                ####                                                                       #### 
8행:                ####                                                                       #### 
9행:                ####                                                                       #### 
10행:       ###      ####   ###         ###       #####   ###    #####   ###          ###       #### 
11행:    ###   ##    #### #######     ##  ###      #### #######   #### #######     ###  ###     #### 
12행:   ###     ###  #####    ####   ###   ####    #####    ####  #####    ####   ###     ###   #### 
13행:  ###           ####     ####   ###    ###    ####     ####  ####     ####  ###      ####  #### 
14행:  ###           ####     ####          ###    ####     ####  ####     ####  ###       ###  #### 
15행: ####           ####     ####     ##   ###    ####     ####  ####     #### ####       ###  #### 
16행: ####           ####     ####   ##########    ####     ####  ####     #### ##############  #### 
17행: ####           ####     ####  ###    ####    ####     ####  ####     #### ####            #### 
18행: ####           ####     #### ####     ###    ####     ####  ####     #### ####            #### 
19행:  ###           ####     #### ####     ###    ####     ####  ####     ####  ###            #### 
20행:   ###      ##  ####     ####  ###    ####    ####     ####  ####     ####   ###      ##   #### 
21행:    ###    ##   ####     ####   ###########   ####     ####  ####     ####    ###    ##    #### 
22행:       ###     ######    #####    ##    #### ######    ###########    #####      ###      ######
23행:

파이썬 코드를 동작시키면 "channel"이라는 단어를 확인할 수 있다.

이걸 한번 URL에 넣어 보았다.

2. 풀이 과정
2. 풀이 과정

입력한 URL에서 Level 6 문제가 나왔다.

Level 5 문제를 해결하였다.

역시 Level 이 올라갈수록 정답을 찾는 게 쉽지 않다.

점점 이해가 어려운 내용들이 많이 지고 여러 생각을 해야 해결을 할 수 있는 것 같다.

해결을 위해서 작성한 코드에 대해서는 Github을 통해서 확인할 수 있다.

 

GitHub - happylie/pythonchallenge_code: Problem solving code for pythonchallenge.com site(pythonchallenge.com 사이트 문제

Problem solving code for pythonchallenge.com site(pythonchallenge.com 사이트 문제 풀이 : PCC(PythonChallenge in Code))) - GitHub - happylie/pythonchallenge_code: Problem solving code for pythonchallenge.c...

github.com

앞으로도 지금처럼 다른 사람이 풀었던 내용을 보지 않고 천천히 풀어나가면서 풀었던 내용에 대해서는 잘 작성해보도록 하겠다.

728x90
728x90


🌵댓글

 

loading