본문 바로가기
정보보안/Dreamhack

[Dreamhack Wargame] Beginner : ex-reg-ex

by 용오동 2024. 12. 2.
반응형

 

☆ Beginner - ex-reg-ex ☆


[1] 문제

♣ ex-reg-ex는 Dreamhack CTF Season 3 Round #2 (Div2)에 출제된 문제이다.

♣ 위 문제는 정규표현식으로 작성된 문자열을 해석하여 플래그를 얻어내는 문제이다.

드림핵 워게임 - ex-reg-ex / 출처 : Dreamhack


[2] 풀이

 

서버를 생성하고 생성된 URL을 클릭하여 웹 서버에 접속한다.

드림핵 워게임 - ex-reg-ex / 출처 : Dreamhack

 

♣ 접속한 웹 페이지의 모습을 확인할 수 있다.

    > 주어진 웹 페이지에 Regex가 표시되어있고, 이를 통해 '정규 표현식'을 사용해야 한다는 것을 유추할 수 있다.

    > 또한 올바른 입력값을 전달하면 Flag값을 얻어낼 수 있다는 것을 알 수 있다.

 

♣ 주어진 문제 파일을 다운받아 코드를 확인한다.

드림핵 워게임 - ex-reg-ex / 출처 : Dreamhack

 

# 다운받은 app.py 파일의 소스코드의 내용은 다음과 같다.

#!/usr/bin/python3
from flask import Flask, request, render_template
import re

app = Flask(__name__)

try:
    FLAG = open("./flag.txt", "r").read()       # flag is here!
except:
    FLAG = "[**FLAG**]"

@app.route("/", methods = ["GET", "POST"])
def index():
    input_val = ""
    if request.method == "POST":
        input_val = request.form.get("input_val", "")
        m = re.match(r'dr\w{5,7}e\d+am@[a-z]{3,7}\.\w+', input_val)
        if m:
            return render_template("index.html", pre_txt=input_val, flag=FLAG)
    return render_template("index.html", pre_txt=input_val, flag='?')

app.run(host="0.0.0.0", port=8000)

 

# 주요 코드 해석

  • FLAG = open("./flag.txt", "r").read() "문제의 코드 속 FLAG 변수에 플래그 값이 저장되어 있다.
  • input_val = "" : input_val 변수는 사용자가 제출한 데이터를 저장하기 위한 변수이다. 기본값으로 빈 문자열을 설정한다.
  • if request.method == POST: : 이 조건문은 사용자가 데이터를 제출했을 때(POST 요청)만 내부 로직을 실행한다.
  • request.form.get("input_val", "") : input_val 변수에 사용자가 제출한 input_val 폼 데이터를 가져온다.
  • re.match(r'', input_val) : 입력 값이 특정 패턴과 일치하는지 확인한다.
  • if m :
        return ... : 사용자의 입력이 정규표현식에 매칭되면 index.html 템플릿을 렌더링한다. 렌더링 시 사용자 입력값(pre_txt)와 플래그 변수를 전달한다.
  • return render_template("index.html", pre_txt=input_val, flag='?') : 입력이 매칭되지 않으면 플래그 대신 ?를 반환한다.

 

# 정규 표현식 해석

 re.match(r'dr\w{5,7}e\d+am@[a-z]{3,7}\.\w+', input_val)
  •  dr : 문자열 dr을 매치한다.
  • \w{5, 7} : 숫자, 알파벳(대소문자), _(underscore) 5개 이상 7개 이하를 매치 한다.([A-Za-z0-9_])
  • e : 문자열 e를 매치한다.
  • \d+ : 숫자가 1개 이상 매치한다.
  • am@ : am@를 매치한다.
  • [a-z]{3,7} : 소문자 알파벳 3개 이상 7개 이하의 문자를 매치한다.
  • \.\w+ : . 이후 숫자, 알파벳(대소문자), _(underscore)가 1개 이상이면 매치한다.

 

♣ 해석된 정규 표현식에 맞추어 문자열을 작성한다.

1. drxxxxxe0am@xxx.000
2. dr12345e1am@abc.net
3. dr_____e0am@xxx.___

 

♣ 작성된 입력값을 input에 넣어 submit한다.

 

♣ 플래그 값을 얻어냈다. 문제의 답을 제출한다.

DH{e64a267ab73ae3cea7ff1255b5f08f3e5761defbfa6b99f71cbda74b7a717db3}

 

제출 결과


반응형