Dreamhack - php7cmp4re

·2025년 7월 11일

Dreamhack-Writeups

목록 보기
19/52
post-thumbnail

php7cmp4re

문제 링크

https://dreamhack.io/wargame/challenges/1113

문제 설명

php 7.4로 작성된 페이지입니다.
알맞은 Input 값을 입력하고 플래그를 획득하는 문제입니다.
플래그 형식은 DH{} 입니다.

풀이과정

  1. 제시된 check.php파일을 확인해 보았습니다.

    <?php
     require_once('flag.php');
     error_reporting(0);
     // POST request
     if ($_SERVER["REQUEST_METHOD"] == "POST") {
       $input_1 = $_POST["input1"] ? $_POST["input1"] : "";
       $input_2 = $_POST["input2"] ? $_POST["input2"] : "";
       sleep(1);
    
       if($input_1 != "" && $input_2 != ""){
         if(strlen($input_1) < 4){
           if($input_1 < "8" && $input_1 < "7.A" && $input_1 > "7.9"){
             if(strlen($input_2) < 3 && strlen($input_2) > 1){
               if($input_2 < 74 && $input_2 > "74"){
                 echo "</br></br></br><pre>FLAG\n";
                 echo $flag;
                 echo "</pre>";
               } else echo "<br><br><br><h4>Good try.</h4>";
             } else echo "<br><br><br><h4>Good try.</h4><br>";
           } else echo "<br><br><br><h4>Try again.</h4><br>";
         } else echo "<br><br><br><h4>Try again.</h4><br>";
       } else{
         echo '<br><br><br><h4>Fill the input box.</h4>';
       }
     } else echo "<br><br><br><h3>WHat??!</h3>";
     ?>

    가 핵심 input1 과 input2를 알아내는 핵심 코드임을 유추해볼 수 있었습니다.

  2. input1을 해결하기 위해 관련 코드를 확인해 보았습니다.

    if($input_1 != "" && $input_2 != ""){
         if(strlen($input_1) < 4){
           if($input_1 < "8" && $input_1 < "7.A" && $input_1 > "7.9"){

    위의 코드를 확인한 결과입니다.

    • input1 과 2 모두 공백이면 안됩니다.
    • input1의 길이는 4자리 미만이여야 합니다.
    • input1은 8보다 작고, "7.A"보다 작고, "7.9"보다 커야합니다.
  3. 갑자기 등장한 "7.A", 문자를 보고, 문자마다 고유한 숫자 값을 부여한 아스키코드 관련된 문제가 아닌지 유추해 보았습니다.

  4. 아스키코드 변환기 ( https://ko.rakko.tools/tools/76/) 를 사용하여, 7.9가 55 46 57 , 7.A가 55 46 65 임을 확인하였습니다.

    그 사이의 랜덤한 아스키 코드 55 46 58 을 변환하였더니 7.: , input1의 입력값을 알아낼 수 있었습니다.

  5. input2를 해결하기 위해 관련 코드를 확인해 보았습니다.

    if(strlen($input_2) < 3 && strlen($input_2) > 1){
               if($input_2 < 74 && $input_2 > "74"){

    위의 코드를 확인한 결과입니다.

    • input2의 길이는 3 미만 1 초과여야 합니다. 즉, 2여야 합니다.
    • input2는 숫자 74보다 작고, 문자열 "74" 보다 커야합니다. 즉, 문자열 74의 아스키코드와 숫자 74의 사이여야 합니다.
  6. 아스키코드 변환기를 사용하여 "74"가 55 52 임을 확인하였습니다.

    55 53 , 55 54 ... 등을 변환해가며 숫자 74보다 작은 길이 2의 문자를 찾아내면 됩니다.
    랜덤한 값인 55 60 을 변환해보니 7< 임을 확인하였습니다.

    이는 74보다 작은 값이고, 문자열 "74"보다 아스키코드의 값이 큼으로 input2의 입력값 또한 알아낼 수 있었습니다.

  7. input1 : 7.: , input2 : '7<' 로 로그인을 시도하였고, 성공적으로 플래그를 획득할 수 있었습니다.


배운점

  • 문자마다 고유한 숫자 값을 부여한 아스키 코드에 대해 학습할 수 있었습니다.
  • 대소비교의 문제에서 갑자기 문자열 등, 쉽게 비교할 수 없는 상황이 온다면 아스키 코드를 활용한 문제임을 유추해볼 수 있었습니다.
  • 문제를 확인하기 위한 php 파일을 읽는법을 학습할 수 있었습니다.

Summary (English)

  • The challenge involves understanding ASCII-based string comparison in PHP.
  • input1 must be a string:
    • Less than 4 characters
    • Greater than "7.9" and less than "7.A" and "8"
    • This leads to input1 = "7.:" (ASCII: 55 46 58), which fits within the required ASCII range between "7.9" (55 46 57) and "7.A" (55 46 65).
  • input2 must:
    • Be exactly 2 characters long
    • Be numerically less than 74 but lexicographically greater than "74"
    • "7<" satisfies the condition (7< = ASCII 55 60)
  • Inputting input1 = "7.:" and input2 = "7<" reveals the flag.
  • Learned:
    • How ASCII codes affect string comparison
    • How to read and analyze PHP conditionals
    • To identify when string comparisons rely on ASCII ordering in CTF challenges
profile
CTF 풀이 및 실습 중심 학습을 기록합니다.

0개의 댓글