CTF Wriet-Up
Welcom-Pawn [misc]
sonotree
2024. 11. 29. 16:03
문제 설명
you have a pawn, just promote it
=너는 폰을 가지고있다. 폰을 승진시켜라.
문제 분석
폰을 움직여 반대편 끝에 도달하면 퀸으로 승진된다. 그 외에는 딱히 구현된 기능이 보이지 않는다.
코드를 한번 살펴보자
EXPECTED_SEQUENCE = ['f1', 'a1', 'g1']
@app.route('/')
def chess_board():
return render_template('chess_board.html')
@app.route('/check_moves', methods=['POST'])
def check_moves():
move_sequence = request.json.get('moves', []) #사용자로부터 move_sequnce를 받아온다
if move_sequence[-3:] == EXPECTED_SEQUENCE: #만약 move_sequence 리스트의 뒤에서 3개의 요소가 EXPECTED_SEQUENCE와 같다면
flag_path = os.path.join(app.root_path, 'flag.txt') #운영체제에 맞게 폴더 구분자를 다뤄서 경로를 생성해준다
try:
with open(flag_path, 'r') as file:
flag_content = file.read().strip()
return jsonify({"flag": flag_content})
except FileNotFoundError:
return jsonify({"error": "Flag file not found"}), 404
else:
return jsonify({"message": "Incorrect move sequence"}), 400
코드를 살펴보니 f1, a1, g1에 기물을 위치시키면 if move_sequence[-3:] == EXPECTED_SEQUENCE: 해당 조건을 만족히켜 flag가 반환되는 것같다.
문제 풀이
폰을 퀸으로 승진시키기 전에는 시작 d열을 벗어나지 못하므로, 퀸으로 먼저 승진시킨다. 이후 f1, a1, g1에 퀸을 순서대로 위치시키면 flag가 출력된다(가장 최근에 위치한 곳을 배열의 가장 뒤에 push하기 때문에).
DH{Welcome_KUCIS:lzdq7ZKzHZ+3EESwM1CNgA==}