IT’s Portfolio

[Python Challenge] Level 1 풀이 본문

Security Study/Wargame Explanation

[Python Challenge] Level 1 풀이

f1r3_r41n 2019. 11. 19. 18:28
728x90
반응형

http://pythonchallenge.com 

 

The Python Challenge

What people have said about us: "These sorts of things are in my opinion the best way to learn a language.", brberg at Media Cloisters "It's the best web site of the year so far.", Andy Todd at halfcooked "Addictive way to learn the ins and outs of Python.

www.pythonchallenge.com

 

지난번 Warming Up 단계를 거쳐 Level 1 풀이이다.

문제를 보자.

사진은 K->M, O->Q, E->G를 가르키고있고

밑에 분홍 문자열은

"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."

 

문제를 보니 문자열의 k는 m으로 o는 q, e는 g로 바꾸라는 것 같다.

 

하지만 아닌 것 같다.

노란색 힌트는 "문제를 풀 때 두 번정도 더 생각하라" 는 뜻이다.

a b c d e f g h i j 'K' l 'M' => k에서 두 번째는 m이다.

a b c d e f g h i j k l m n 'O' p 'Q' => o에서 두 번째는 q이다.

a b c d 'E' f 'G' => e에서 두 번째는 g이다.

 

위의 사실을 생각해보니 문자열에 있는 모든 알파벳을 2번 앞당기는 스크립트를 짜면 읽을 수 있는 문자열이 나올 것 같다.

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."

check = ""

for i in range(0, len(str)):
    if str[i] == " ":
        check = check + " "
        continue
    elif str[i] == ".":
        check = check + "."
        continue
    elif str[i] == "'":
        check = check + "'"
        continue
    elif str[i] == "(":
        check = check + "("
        continue
    elif str[i] == ")":
        check = check + ")"
        continue
    else:
        checking = ord(str[i])+2
        if checking>122:
            checking = 96+checking-122
            check = check + chr(checking)
        else:
            check = check + chr(checking)

print(check)

"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에 적용하십시오."

 

string.maketrans() 라는 함수를 쓰라고 한다.

URL에 있는 map을 바꾸는게 정답인 듯 하다.

import string

str = "map"
a = "abcdefghijklmnopqrstuvwxyz"
b = "cdefghijklmnopqrstuvwxyzab"
check = str.maketrans(a, b)

print(str.translate(check))

URL 정답값: ocr

 

최신화

2022.10.20

msg = "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."

# 일반적인 코드
# result = ""

# for i in list(msg):
#     if i.isalpha():
#         if ord(i)+2 > 122:
#             result += chr(96+(ord(i)+2)-122)
#         else:
#             result += chr(ord(i)+2)
#     else:
#         result += i

# print(result)

# string.maketrans()와 translate()를 사용한 코드
dec1 = "abcdefghijklmnopqrstuvwxyz"
dec2 = "cdefghijklmnopqrstuvwxyzab"
dec = msg.maketrans(dec1, dec2)

print(msg.translate(dec))

'''
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.
'''
  • 스크립트 축약 및 속도 개선

 

Level 2로 갈 수 있는 URL = http://www.pythonchallenge.com/pc/def/ocr.html

string.maketrans( from, to ) 함수

from에 있는 문자를 to의 문자로 치환하는 함수. 같은 위치의 문자가 변하기 때문에 from과 to의 길이가 같아야 함.

translate() 메소드에 전달할 인수를 만드는데 사용됨.

728x90
반응형
Comments