<!-- urllib may help. DON'T TRY ALL NOTHINGS, since it will never end. 400 times is more than enough. -->


사진을 클릭하면 URL에 ?nothing=[숫자] 가 추가되면서 아래와 같은 문구가 나옵니다.

변하는 숫자를 계속 입력하면 되는데 400번 해야 된다고 알려줍니다.



힌트로 urllib를 사용하라고 알려주지만 requests가 더 익숙해서 사용해봤습니다.

400회를 다 수행하면 다음 URL을 알려주게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
import requests
import re
 
number = ['0']
for i in range(400):
    url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="
    payload = url+number[0]
                     
    res = requests.get(payload)
    number = re.findall("[0-9]+",res.text)
 
    print(res.text)
cs


'Code Challenge > pythonchallenge.com' 카테고리의 다른 글

[pythonchallenge] level 3 equality  (0) 2018.12.13
[pythonchallenge] level 2 ocr  (0) 2018.12.13
[pythonchallenge] level 1 map  (0) 2018.12.12
[pythonchallenge] level 0  (0) 2018.12.12


하나의 소문자 주위에 3개의 대문자가 있다고 합니다.

소스 코드에 주석으로 나와있는 다량의 문자열들 사이에서 해당 값을 찾아내면 되는 문제입니다.



이 문제는 정규표현식을 이용해서 해결할 수 있습니다.


예를 들어, AAAaAAA 이렇게 되어 있으면 가운데에 있는 a값이 찾고자 하는 문자입니다.

정규표현식으로 만들면 [A-Z]{3}[a-z]{1}[A-Z]{3} 이렇게 되는데 해당 방식대로 하면 많은 값들이 나오게 됩니다.

[A-Z]{3}을 앞뒤로 해도 그 앞뒤로 다시 대문자가 올 수 있기 때문입니다.


그래서 [a-z]{1}[A-Z]{3}[a-z]{1}[A-Z]{3}[a-z]{1} 앞뒤로 소문자를 하나씩 넣어주면 해결이 됩니다.


python에서 정규표현식을 사용하려면 re 모듈을 이용하면 됩니다.

1
2
3
4
5
6
7
import urllib.request
import re
 
html = urllib.request.urlopen("http://www.pythonchallenge.com/pc/def/equality.html").read().decode()
data = re.findall("<!--(.*?)-->", html, re.DOTALL)[-1]
 
print([ payload[4for payload in re.findall("[a-z]{1}[A-Z]{3}[a-z]{1}[A-Z]{3}[a-z]{1}",data) ])
cs


'Code Challenge > pythonchallenge.com' 카테고리의 다른 글

[pythonchallenge] level 4 linkedlist  (0) 2018.12.13
[pythonchallenge] level 2 ocr  (0) 2018.12.13
[pythonchallenge] level 1 map  (0) 2018.12.12
[pythonchallenge] level 0  (0) 2018.12.12

소스 코드에 읽을 수 없는 문자열이 나와있는데 해당 문자열에서 단어를 찾으면 되는 문제입니다.




payload에 대한 값을 복사해서 돌리면 특정 값이 나오게 됩니다.

해당 문자를 찾으라고 해서 ascii code값으로 계산을 해봤습니다.

1
2
3
4
5
6
7
payload=""
result =''
for i in range(len(payload)):
    if(ord(payload[i]) >= 97 and ord(payload[i]) <= 122 ):
        result += payload[i]
 
print(result)
cs



이후 다른 풀이를 확인해 보니 Dictionary를 이용해 각각의 문자들이 몇 번 발생했는지 확인하고 찾는 방법이 있었습니다.

실행해보면 특수 문자들은 1000회 이상 쓰였지만 이 특정 문자들은 1회씩만 사용되어 확인할 수 있었습니다.

1
2
3
4
5
6
payload=""
={}
for ch in payload:
    d[ch] = d.get(ch,0)+1
 
print("".join(ch for ch in payload if d[ch] ==1))
cs


'Code Challenge > pythonchallenge.com' 카테고리의 다른 글

[pythonchallenge] level 4 linkedlist  (0) 2018.12.13
[pythonchallenge] level 3 equality  (0) 2018.12.13
[pythonchallenge] level 1 map  (0) 2018.12.12
[pythonchallenge] level 0  (0) 2018.12.12

읽을 수 없는 문자열이 나와있고, 사진에는 K → M, O → Q, E → G만 나타나 있습니다.

이 의미는 암호학에서 알 수 있는 전치암호를 사용한 암호문 입니다.


abcdefghijklmnopqrstuvwxyz 알파벳을 나열해서 보면 k,o,e가 m,q,g가 될 때 모두 우측으로 2칸 이동한 값을 사용했다는 것을 알 수 있습니다.



python3로 작성한 코드입니다.

모든 알파벳은 ascii code로 나타낼 수 있습니다. 해당 ascii code를 통해서 +2를 해주면 문자를 변환 시킬 수 있습니다.

하지만 'z'값 이후에는 다른 값이 들어있으므로 -26을 통해 다시 맨 앞으로 가져와야 합니다.


ord(): 문자를 ascii 값으로 변환

chr(): ascii값을 문자로 변환

1
2
3
4
5
6
7
8
9
10
11
12
13
payload  ="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. "
payload +="bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. "
payload +="sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
result =''
 
for i in range(len(payload)):
    if( ord(payload[i]) < 97 ):
        result += payload[i]
    elif( ord(payload[i])+2 <= 122 ):
        result += chr(ord(payload[i])+2)
    elif( ord(payload[i])+2 > 122 ):
        result += chr(ord(payload[i])+2-26)
print(result)
cs


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.

손으로 번역하지 말고 python함수를 이용하라고 합니다. ^_^

그리고 URL에 적용하라고 합니다.


map.html → ocr.jvon 로 바꿔서 입력하면 해당 파일을 받을 수 있습니다.

jvon 파일을 들어본 적 있는지 물어보는데 못 들어봤습니다..


map만 적용 시킨 ocr.html로 하니 2번 문제로 이동했습니다.



문제를 해결하고 maketrans()함수를 이용해서 간단하게 풀어봤습니다.

python2에서는 from string import maketrans 를 하고 string.maketrans() 하면 되고,

python3에서는 str.maketrans() 하면 됩니다.

1
2
3
4
5
6
7
8
9
payload  ="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. "
payload +="bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. "
payload +="sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
 
intab="abcdefghijklmnopqrstuvwxyz"
outtab="cdefghijklmnopqrstuvwxyzab"
transtab = str.maketrans(intab,outtab)
 
print(payload.translate(transtab))
cs


'Code Challenge > pythonchallenge.com' 카테고리의 다른 글

[pythonchallenge] level 4 linkedlist  (0) 2018.12.13
[pythonchallenge] level 3 equality  (0) 2018.12.13
[pythonchallenge] level 2 ocr  (0) 2018.12.13
[pythonchallenge] level 0  (0) 2018.12.12

PYTHONCHALLENGE라는 문제입니다.

CTF 문제를 푸는 도중에 해당 사이트의 존재를 알게 되어 시작합니다.


좀 내려가면 URL 링크가 있는데 해당 링크를 클릭하면 문제가 시작됩니다.

총 33개의 문제가 있다고 합니다.




HINT로 URL을 변경하라고 합니다.

URL을 보시면 0.html이 있고 해당 화면 왼쪽 위에 0이라고 기록되어 있습니다.

또, 모니터 사진에 이 쓰여 있습니다.

0의 값을 해당 값으로 바꾸라는 의미겠죠?


python challenge인 만큼 python을 사용해 봅시다.

pow(밑,지수) 함수를 이용해 간단하게 값을 구할 수 있습니다.


274877906944.html로 수정하면 1번 문제로 이동할 수 있습니다.


'Code Challenge > pythonchallenge.com' 카테고리의 다른 글

[pythonchallenge] level 4 linkedlist  (0) 2018.12.13
[pythonchallenge] level 3 equality  (0) 2018.12.13
[pythonchallenge] level 2 ocr  (0) 2018.12.13
[pythonchallenge] level 1 map  (0) 2018.12.12

+ Recent posts