본문 바로가기
CTF/PythonChallenge

[PCC] PythonChallenge Level 1 problem-soving

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

Level 1 problem-soving

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

 

[PCC] pythonchallenge Level 0 problem-solving

Level 0 problem-solving pythonchallenge 사이트에 대해서는 간단히 먼저 설명을 했다. [PCC] pythonchallenge? 한번 풀어보자!!! pythonchallenge? 한번 풀어보자!!! 이리저리 인터넷 서핑 중에 우연히 pythonch..

happylie.tistory.com

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

[PCC] pythonchallenge Level 1 problem-soving

1. 문제 확인

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

물론 Level 0 문제를 풀면 바로 Level 1 문제의 주소로 리프레쉬(Refresh) 된다.

 

What about making trans?

everybody thinks twice before solving this. g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.

www.pythonchallenge.com

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

일단 문제는 확인하였고 Level 0 문제와는 달리 화면에 나온 이미지와 보라색으로 작성된 알 수 없는 문자열, 그리고 노란색으로 작성된 힌트 내용들이 보였다.

이제 한번 풀어보도록 하자.

728x90

2. 풀이 과정

처음 화면을 보고 생각한 부분은 이미지에 나와 있는 부분과 바로 아래 노란 글자였다.

"K -> M / O -> Q / E -> G" , "everybody thinks twice before solving this.(모든 사람들은 이것을 해결하기 전에 두 번 생각합니다.)"

이미지에 있는 3개의 단어로만 유추해보면 각 알파벳에서 옆으로 2번 이동하여 확인된 알파벳이었다.

이미지 아래 노란 글자의 내용도 "두 번 생각한다"라는 부분도 힌트가 되었다.

결국 보라색 글씨는 아래와 같이 기본적으로 사용하는 알파벳을 각각 옆으로 2번 이동하여 나온 알파벳으로 작성된 내용이며, 그것을 다시 정상적으로 변경해야 함을 알게 되었다.

# 알파벳 정의
# 기본 알파벳에서 오른쪽으로 2칸 이동(K -> M / O -> Q / E -> G)
    
alphabet = "abcdefghijklmnopqrstuvwxyz"
right_2_setp = "cdefghijklmnopqrstuvwxyzab"

Python Challenge에 대한 문제이니깐 이제 보라색 글씨를 변경하는걸 한번 파이썬 코드로 작성을 해보도록 하자.

여러 가지 방법이 있겠지만 우선은 오른쪽으로 2번 이동을 해야 하니 ASCII Code(아스키 코드)를 통해서 각 알파벳에 나온 값에 2를 더하여 출력해주면 해결될 것으로 생각했다.

그리고 yz는 ab로 다시 변환이 되어야 하니 y는 a로 z는 b로 변환하는 부분만 if문을 통해서 추가해주었다.

 

ASCII - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 1972 프린터 사용 설명서에 개시된 아스키 코드 차트표 미국정보교환표준부호(영어: American Standard Code for Information Interchange), 또는 줄여서 ASCII( , 아스키)는 영문

ko.wikipedia.org

# 1차 코드
#!/usr/bin/python
# -*- coding: utf-8 -*-

def ascii_to_char(origin_text):
    result = ""
    for i in origin_text:
        if i == " " or i == "." or i == "'" or i == "(" or i == ")":
            result += i
        else:
            if ord(i) + 2 == 123:
                result += chr(97)
            elif ord(i) + 2 == 124:
                result += chr(98)
            else:
                result += chr(ord(i) + 2)
    return result

if __name__ == "__main__":
    text_str = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
    print(ascii_to_char(text_str))
    
    
    
OUTPUT
i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.

"i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.(나는 당신이 그것을 손으로 번역하지 않았기를 바랍니다. 그것이 컴퓨터의 존재 이유입니다. 손으로 하는 것은 비효율적이어서 이 텍스트가 너무 깁니다. string.maketrans()를 사용하는 것이 좋습니다. 이제 URL에 적용하십시오.)"

보라색 글씨를 정상적으로 확인하고 나니 maketrans라는 내장 함수를 이용하고, 그리고 URL에 있는 값을 위와 같이 변경을 하는 게 정답인 것 알게 되었다.

우선적으로는 maketrans을 통해서 할 수 있다고 하니 해당 내장 함수를 이용해서 다시 한번 작성을 해보도록 하자.

맨날 사용하는 부분만 사용하다 보니 사실 maketrans는 이번에 처음 보았고, 사용해보았다.

 

Python String maketrans() Method

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

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

# alphabet = "abcdefghijklmnopqrstuvwxyz"
# change_alphabet = "cdefghijklmnopqrstuvwxyzab"
# Step 2
# K -> M : 2
# O -> Q : 2
# E -> G : 2


def ascii_to_char(origin_text):
    result = ""
    for i in origin_text:
        if i == " " or i == "." or i == "'" or i == "(" or i == ")":
            result += i
        else:
            if ord(i) + 2 == 123:
                result += chr(97)
            elif ord(i) + 2 == 124:
                result += chr(98)
            else:
                result += chr(ord(i) + 2)
    return result


def answer(origin_text):
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    change_alphabet = "cdefghijklmnopqrstuvwxyzab"
    trans_text = origin_text.maketrans(alphabet, change_alphabet)
    result = origin_text.translate(trans_text)
    return result


if __name__ == "__main__":
    text_str = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
    print(ascii_to_char(text_str))
    print(answer(text_str))




OUTPUT
i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.
i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.

이제 기존에 작성한 부분과 maketrans 내장 함수를 이용해서 작성한 부분과 모두 동일하게 나오는 것을 확인하였다.

Python 자체에 이런 함수들이 이미 구현이 되어 있었다. 그럼 이제 정답을 찾아보도록 하자.

URL에 있는 내용을 적용하라고 하는데 "http://www.pythonchallenge.com/pc/def/map.html"에서 정상적으로 변환이 가능한 부분은 HTTP 프로토콜을 제외하고 다 변경이 가능했다.

그러나, 도메인 및 하위 디렉터리가 변경되는 건 문제가 있을 것 같아 먼저 "map.html"에 대해서는 변환을 해보았다.

... 이하 생략 ...

if __name__ == "__main__":
    text_str = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
    html_str = "map.html"
    print(ascii_to_char(html_str))
    print(answer(html_str))



OUTPUT
ocr.jvon
ocr.jvon

변환을 하면 "ocr.jvon"으로 변경이 되고 이걸 입력해 보았다.

브라우저에 해당 경로로 입력하니 "ocr.jvon" 파일을 다운로드할 수 있었고, 그 파일을 열어보니 "Have you ever heard of jvon files!?(jvon 파일에 대해 들어본 적이 있습니까!?라고 작성되어있었다.

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

728x90

html 확장자에 대해서는 변환을 하는 게 아닌 것으로 확인되었으니 이제 "map -> ocr" 로만 변경하여 입력해 보았다.

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

ocr.html은 Level 2 문제의 경로였다. 위 과정을 통해서 Level 1 문제에 대해서는 이렇게 해결을 할 수 있었다.

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

 

GitHub - happylie/pythonchallenge_code: Problem solving code for pythonchallenge.com site

Problem solving code for pythonchallenge.com site. Contribute to happylie/pythonchallenge_code development by creating an account on GitHub.

github.com

앞으로도 계속 천천히 풀어나가면서 풀었던 내용에 대해서는 잘 작성해보도록 하겠다.

728x90
728x90


🌵댓글

 

loading