본문 바로가기
CTF/PythonChallenge

[PCC] PythonChallenge Level 4 problem-soving

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

Level 4 problem-soving

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

생각보다 명쾌하게 풀리지 않아서 조금 찝찝했지만 우선은 Level 4 문제에 대해서 다시 도전해보았다.

[PCC] PythonChallenge Level 4 problem-soving

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

1. 문제 확인

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

follow the chain

www.pythonchallenge.com

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

일단 문제는 확인하였고 페이지에는 다른 Level 과는 달리 이미지 이외 다른 내용은 확인할 수 없었다.

728x90

2. 풀이 과정

일단 문제를 보고 다른 Level 과는 다르게 페이지에 이미지만 존재함에 따라서 우선적으로 이미지를 한번 클릭해보았다.

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

클릭해보니 위 이미지처럼 nothing=12345 파라미터가 붙으면서 새로운 내용을 확인할 수 있었다.

"and the next nothing is 44827(다음은 44827입니다.)"이라는 내용이다.

다른 힌트가 있을까 하여 이전 문제에서 처럼 해당 문제 페이지 페이지의 소스를 확인해 보았다.

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

일단은 주석으로 된 내용이 있었고, 역시나 다른 내용은 없었고 이미지를 클릭 시 nothing=12345 파라미터를 붙이는 소스 내용뿐 이였다.

그럼 주석 내용을 한번 더 확인해보면 "urllib may help. DON'T TRY ALL NOTHINGS, since it will neverend. 400 times is more than enough.(urllib가 도움이 될 수 있습니다. 끝이 없을 것이므로 모든 것을 시도하지 마십시오. 400번이면 충분합니다.)"라는 내용이었다.

urllib은 파이썬의 urllib 모듈을 이야기하는 것 같고, 400번 정도 계속 시도를 하면 정답 혹은 힌트를 얻을 수 있을 것 같았다.

그렇다면 일단 이미지를 클릭 후 확인 한 내용에 있었던 "44827"을 nothing 파라미터에 한번 넣어 보도록 하자.

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

동일하게 "45439" 값을 확인할 수 있었고, 다시 한번 "45439" 값을 넣어 보았다.

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

동일하게 94485 값을 확인할 수 있었다.

그러나 빨간색 글씨로 "Your hands are getting tired(손이 지겹다)"라는 내용이 추가되었다.

계속 nothing 파라미터에 나온 값을 입력하면서 최종적으로 정답 혹은 힌트를 얻을 수 있겠지만 그게 몇 번을 더 해야 하는지 알 수 없다.

아마도 주석에서 보았던 힌트처럼 400번은 해야지 알 수 있지 않을까 생각된다.

우선은 간단하게 자동적으로 화면에 나온 값을 nothing 파라미터에 입력하는 반복 작업을 파이썬 코드로 작성해 보도록 하자.

urllib 모듈도 좋지만 좀 더 익숙한 requests 모듈을 사용하도록 하겠다.

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


def return_nothing(nothing_str):
    check_url = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing={nothing_str}'.format(
        nothing_str=nothing_str
    )
    r = requests.get(url=check_url)
    ret = r.text
    print(ret)
    return ret.split('and the next nothing is')[1].strip()


if __name__ == "__main__":
    n = '44827'  # 처음 확인된 nothing 파라미터 값
    try:
        for i in range(400):
            n = return_nothing(n)
            print('{i} 번째'.format(i=i+1))
            print('nothing : {n}'.format(n=n))
    except Exception as err:
        sys.exit()
        


### OUTPUT ###
and the next nothing is 45439
1 번째
nothing : 45439
<font color=red>Your hands are getting tired </font>and the next nothing is 94485
2 번째
nothing : 94485

... 이하 생략 ...

83 번째
nothing : 3875
and the next nothing is 16044
84 번째
nothing : 16044
Yes. Divide by two and keep going.

일단 주석에서 확인했던 힌트대로 400번의 반복 작업을 진행하였다.

그러다 보니 84번째까지 진행했을 때 nothing 파라미터 값은 "16044"이고 "Yes. Divide by two and keep going.(예. 둘로 나누어 계속 진행합니다.)"라는 새로운 힌트를 얻게 되었다.

힌트 내용을 이용하면 "16044" 값을 2로 나누어서 계속 진행하라는 뜻임에 따라 "16044 / 2""8022" 값으로 다시 한번 해보도록 하자.

728x90
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import requests


def return_nothing(nothing_str):
    check_url = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing={nothing_str}'.format(
        nothing_str=nothing_str
    )
    r = requests.get(url=check_url)
    ret = r.text
    print(ret)
    return ret.split('and the next nothing is')[1].strip()


if __name__ == "__main__":
    n = '8022'  # 두번째 확인된 파라미터 값
    try:
        for i in range(400):
            n = return_nothing(n)
            print('{i} 번째'.format(i=i+1))
            print('nothing : {n}'.format(n=n))
    except Exception as err:
        sys.exit()
        
        
### OUTPUT ###
and the next nothing is 25357
1 번째
nothing : 25357
and the next nothing is 89879
2 번째
nothing : 89879
and the next nothing is 80119

... 이하 생략 ...

162 번째
nothing : 75635
and the next nothing is 52899
163 번째
nothing : 52899
and the next nothing is 66831
164 번째
nothing : 66831
peak.html

두 번째 확인된 파라미터 값 "8022"를 기준으로 다시 한번 반복 작업을 진행해본 결과 총 164번째 "peak.html"이라는 또 새로운 내용을 확인할 수 있었다.

이번에는 html 파일임에 따라서 브라우저에 한번 입력을 해보도록 하자.

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

브라우저에 입력한 URL에서 Level 5 문제가 나왔다.

Level 4 문제를 해결하였다.

일단 문제를 해결하였지만, 동일한 코드를 두 번에 나눠서 문제의 정답을 알아낼 수 있었다.

이제 나오는 데이터도 확인됨에 따라서 한번에 해당 정답이 나오는 코드로 변형하여 작성해보도록 하자.

Python Challenge를 하는 이유는 파이썬 코드를 이용해서 문제를 푸는 거니 이렇게 한번 더 코드를 작성하는 것도 또 다른 공부가 될 거라고 생각된다.

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


def return_nothing(nothing_str):
    check_url = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing={nothing_str}'.format(
        nothing_str=nothing_str
    )
    r = requests.get(url=check_url)
    if r.status_code != 200:
        sys.exit()
    ret = r.text
    print(ret)
    if ret == 'Yes. Divide by two and keep going.':
        return int(int(nothing_str) / 2)
    else:
        return int(ret.split('and the next nothing is')[1].strip())


if __name__ == "__main__":
    n = '44827'  # 처음 확인된 nothing 파라미터 값
    try:
        for i in range(400):
            n = return_nothing(n)
            print('{i} 번째'.format(i=i+1))
            print('nothing : {n}'.format(n=n))
    except Exception as err:
        sys.exit()
        
        
### OUTPUT ###
and the next nothing is 45439
1 번째
nothing : 45439
<font color=red>Your hands are getting tired </font>and the next nothing is 94485
2 번째
nothing : 94485
and the next nothing is 72198

... 이하 생략 ...

248 번째
nothing : 52899
and the next nothing is 66831
249 번째
nothing : 66831
peak.html

총 249번째만에 동일한 정답을 확인할 수 있었다.

Level 3 문제보다는 좀 더 쉽게 풀었다.

해결을 위해서 작성한 코드에 대해서는 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