본문 바로가기
Dreamhack WarGame

[Dreamhack] ex-reg-ex 문제 풀이

by whiteTommy 2023. 11. 28.

Dreamhack CTF Season 3 Round #2 (🌱Div2) 에 출제된 문제입니다.

 

 

문제 파일을 받고, 주어진 웹에 접속한다.

 

Regex : email + dream과 같은 정보를 통해 정규 표현식에 관한 웹임을 알 수 있고, 무언가를 입력하고 submit 하면 input에 따른 Flag를 얻을 수 있음을 알 수 있다.

 

이제, 문제 파일을 보자.

#!/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)

 

위의 코드를 통해 (import re) Python 정규 표현식에 관한 내용임을 알 수 있다.

 

이제, 코드를 해석해보자.

 

문제에서 플래그는 flag.txt 파일과 FLAG 변수에 있다고 하였다. flag.txt 파일 내용이 FLAG 변수에 저장이 되고, 사용자가 입력을 한 값은 input_val 변수에 저장이 되며, 입력값과 정규 표현식인 r'dr\w {5,7} e\d+am@[a-z]{3,7}\.\w+'와 매치된 문자열 객체를 변수 m에 저장하여 참 값이면, FLAG 변수에 플래그가 저장된다.

 

이제, 정규 표현식을 해석해 보자.

r'dr\w{5,7}e\d+am@[a-z]{3,7}\.\w+'

 

r : 이스케이프 문자를 문자 그대로 인식한다

dr : 문자열 dr을 매치한다

\w {5,7} : [A-Z a-z 0-9 _]가 5개 이상 7개 이하를 매치한다

e : 문자열 e를 매치한다

\d+ : 숫자가 1개 이상이면 매치한다

am : 문자열 am을 매치한다

@ : 문자열 @를 매치한다

[a-z] {3,7} : 소문자 알파벳이 3개 이상 7개 이하면 매치한다

\. :.로 끝나는 문자를 매치한다

\w+ : [A-Z a-z 0-9 _]가 1개 이상이면 매치한다.

 

이를 바탕으로 문자열을 input  해보자.

 Input: dr00000e1am@aaa.0
 Flag: DH{e64a267ab73ae3cea7ff1255b5f08f3e5761defbfa6b99f71cbda74b7a717db3}