우선 해당 문제의 정보는 아래와 같다.
접속 정보 보기를 통해 문제 사이트에 들어가보니 아래와 같은 화면을 볼 수 있었다.
페이지 내에서 정보를 얻고자 아무 값이나 입력해보고 '제출' 버튼을 눌러보니 입력한 값이 'Input' 부분에 표시되는 것을 알 수 있었다.
페이지 내에서 더 알 수 있는 정보는 없어보이므로 함께 포함된 문제 파일에 있는 소스코드를 확인해보자.
#!/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)
여기서 def index() 부분을 통해 플래그를 얻기 위한 단서를 확인할 수 있었다.
문제 풀이에 관련이 있는 핵심 부분을 분석해보면 input_val 값과, 'dr\w {5,7} w\d+am@[a-z]{3,7}\.\w+'로 되어 있는 정규화 표현식을 비교하여 일치하며 flag 값을 출력해 주는 소스코드이다.
따라서, 정규화 부분을 해석하여 입력해야하는 값이 무엇인지 정리해보자면, dr+영숫자 5~7개+e+숫자1개+am+@+소문자 3~7개+.+영숫자 1개이다.
해당 조건을 모두 만족하는 값인 dr12345e1am@abc.1 을 입력하고 제출하니
플래그 값이 뜨는 것을 볼 수 있었다.
이렇게 얻은 플래그 값을 제출하니 문제를 해결할 수 있었다.
해당 정규화 식에 대해 알고있는 정보가 부족하여 하나씩 다 해석하지는 못했지만 이 문제는 코드에 대한 해석만 잘 이루어지면 쉽게 풀 수 있는 문제였던 것 같다. 물론 나는 코드를 제대로 해석하지는 못했기 때문에 정규화 식에 대한 충분한 이해가 이루어지도록 열심히 공부해야겠다!
[참고 자료] https://chulmin.tistory.com/155
'CTF' 카테고리의 다른 글
[Webhacking.kr] old-42 write-up (0) | 2023.09.20 |
---|---|
[Dreamhack] 🌱 simple-web-request (0) | 2023.05.25 |
[Dreamhack] proxy-1 (0) | 2023.05.21 |
[Dreamhack] broken-png (0) | 2023.05.21 |
[Dreamhack] simple-ssti (0) | 2023.05.21 |