[DreamHack] Chess.com 풀이

코딩 파인애플·2026년 6월 23일

CHALLENGE SOLVING

목록 보기
2/5
post-thumbnail

안녕하십니까
코딩사과의 짭 코딩 파인애플입니다
이번에는 Chess.com에 관해 풀어보겠습니다.

Chess.com

https://dreamhack.io/wargame/challenges/2901

Chess.com입니다 정말 유명한 체스 사이트죠

import requests
from urllib.parse import urlparse
from difflib import SequenceMatcher
# 여기부터
def is_valid_attempt(url): # School Firewall
    if not url.isascii():
        return False
    if any(char.isupper() for char in url):
        return False
    if '%' in url:
        return False
    if not url.startswith("https://"):
        return False
    if "school" not in url.lower(): # Our school only allows domains about school.
        return False
    parsed = urlparse(url)
    domain = parsed.netloc
    if not domain.endswith('.com') or domain.split('.')[-1] != 'com':
        return False
    if 'school' not in domain:
        return False
    if parsed.username or parsed.password or "@" in url:
        return False
    if parsed.query:
        return False

    return True
# 여기까지가 중요함.

def get_html(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
    }
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()
        return response.text
    except Exception as e: # Please wait if chess.com is offline.
        print(f"Error fetching {url}: {e}")
        return None

def compare_sites(original_url, target_url):
    original_html = get_html(original_url)
    target_html = get_html(target_url)

    if not original_html or not target_html:
        return

    normalized_target_html = target_html.replace(target_url.replace("https://", ""), original_url.replace("https://", ""))

    similarity = SequenceMatcher(None, original_html, normalized_target_html).ratio()

    if similarity > 0.98:
        print('Thank you! Now I can play chess.com in school!')
        with open('flag.txt') as f:
            flag=f.read()
            print('Flag is '+flag)
    else:
        print("No! This is not a chess.com!")

print('I want to play chess.com at school!')
target = "https://www.chess.com" # I want to access at this site!
attempt = input('Input the address : ').strip()

if is_valid_attempt(attempt):
    print('Accessing to chess.com...')
    compare_sites(target, attempt)
else:
    print("Blocked by school WAF.")

일단 저는 윈도우 WSL을 통해서 nc host3.dreamhack.games 명령어로 들어가봤습니다

I want to play chess.com at school!
Input the address : potassium
Blocked by school WAF.

이렇게 다음과 같이 위 코드의 전제 조건을 하나라도 불만족 했다면
"Blocked by school WAF." 이 나오는 것을 알 수 있습니다.

따라서 저희는 위 코드에서 만족하는 전제 조건을 전부 분석해서 어떠한 수단을 동원해서라도 Chess.com에 들어가야합니다.

def is_valid_attempt(url): # School Firewall
    if not url.isascii(): return False
    # url에 아스키 문자 X
    if any(char.isupper() for char in url): return False
    # url에 대문자 X
    if '%' in url: return False
    # url에 '%' 포함 X
    if not url.startswith("https://"): return False
    # 시작이 'https://'이여야함
    if 'school' not in url.lower(): return False
    parsed = urlparse(url)
    domain = parsed.netloc
    # '도메인' 안에 'school'이 포함되어야함. (#을 통한 우회 X)
    if not domain.endswith('.com') or domain.split('.')[-1] != 'com': return False
    # url 끝은 반드시 .com 이여야함. (#을 통한 우회 X)
    if 'school' not in domain: return False
    # 'school'이 반드시 포함되어야함.
    if parsed.username or parsed.password or "@" in url: return False
    # URL 내에 인증 정보(username 또는 password)가 포함된 경우 or URL 문자열 자체에 '@' 기호가 포함된 경우 X
    if parsed.query: return False
    # 쿼리 스트링(query)이 존재하는 경우 X
    return True #참끼얏호우

이렇게 다음과 같은 조건을 만족해야합니다

그래서 처음엔 별의 별 것들을 다 넣어봤는데 안되었고
chesschool.com 이라는 도메인이 아직 팔리고 있다는 사실만 알아냈습니다 (2026-06-23일 기준) (?)

아무톤톤간에

이 문제를 풀기 위해서는 chess.com의 CNAME을 알아야합니다

CNAME(Canonical NAME)은 '실제 본명(도메인)'에 닉네임(별칭)을 붙여주는 DNS 레코드 종류 중 하나, '도메인 별칭'이라고도 불린다.

chess.com은 어째서인지 다음과 같은 CNAME을 보유하고 있습니다

https://schoolschoolschool.com #학교학교학교.com
https://pleasedontblockchess.com #제발체스막지마셈.com
https://superhardalgebraproblems.com #매우어려운대수문제들.com (?)
https://justdoinghomework.com #걍숙제중.com
https://schoolnetworkadminsarethebest.com #학교인터넷관리자짱임.com (?)
https://plansformyfuture.com #이따할꺼.com
https://c4355.com #c4355.com
https://chezz.xyz #체즈.com
https://www.chesskid.com #체스꼬마.com

따라서 다음과 같은 도메인들을 방문해도 모두 Chess.com으로 연결되기에 위 조건을 모두 만족하는 도메인을 넣으면 됩니다
I want to play chess.com at school!
Input the address : 。。。
Accessing to chess.com...
Thank you! Now I can play chess.com in school!
Flag is DH{secret}

평가 : (여러모로) 재밌는 문제.

profile
안녕하떼요 취미로 콤푸타 배우는 고든학교 6학년 유치원생이빈다.

0개의 댓글