반응형
문제 파일을 받고, 주어진 웹에 접속한다.
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}
반응형
'해킹 > Dreamhack WarGame' 카테고리의 다른 글
[Dreamhack] blue-whale 문제 풀이 (1) | 2023.11.30 |
---|---|
[Dreamhack] phpreg 문제 풀이 (1) | 2023.11.28 |
[Dreamhack] Exercise: SSH 문제 풀이 (0) | 2023.11.20 |
[Dreamhack] baby-linux 문제 풀이 (0) | 2023.11.19 |
[Dreamhack] 64se64 문제 풀이 (0) | 2023.11.17 |