jyamethyst21 님의 블로그

[DreamHack] Web 파트 php7cmp4re 문제 풀이 본문

WARGAME 🔫

[DreamHack] Web 파트 php7cmp4re 문제 풀이

jyamethyst21 2025. 3. 31. 23:11

문제는 다음과 같다.

 

먼저 문제에 주어진 사이트에 접속을 시도해보았다.

사이트에 접속해보면 input1, input2에 어떠한 값 2개를 입력하고 제출버튼을 했을 때 flag가 출력되는 것으로 보여진다.

 

이제 문제에서 제공한 코드를 전부 살펴보도록 하겠다. 

코드1) flag.php

<?php
    $flag = 'flag{**Sample**}'
?>

 

코드2) index.php

<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>php7cmp4re</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-stop">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">php7cmp4re</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">index page</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav>
    <div class="container">
      <div class="box">
      <h4>Enter the correct Input.</h4>
        <p>
          <form method="post" action="/check.php">
              <input type="text" placeholder="input1" name="input1">
              <input type="text" placeholder="input2" name="input2">
              <input type="submit" value="제출">
          </form>
        </p>
      </div>

    <?php
        require_once('flag.php');
        error_reporting(0);
    ?> 
    </div> 
</body>
</html>

 

코드 3_전체) check.php

<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>php7cmp4re</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">php7cmp4re</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Index page</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav>
    <div class="container">
    <?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>";
    ?> 
    </div> 
</body>
</html>

 

코드 3_일부(핵심)_) check.php

 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;

 

 해당 문제에는 flag.php, index.php, check.php의 파일이 주어진다. 세개의 코드 파일을 다 열어보면 직접적으로 flag 값을 출력하는 코드와 관련있는 파일은 check.php임을 알 수 있다. check.php의 전체 코드에서 핵심 부분만 추출하면 코드 3_일부(핵심)_)과 같다.

 

input_1의 조건: 널값이지 않고 길이가 4미만이며, “8” 보다 작고 “7.A” 보다 작으며 “7.9” 보다는 커야한다.

input_2의 조건: 길이가 3미만 1 이상, 74 보다 작고 “74” 보다 커야한다.

 

코드에서 “”안에 숫자와 문자가 있는 것을 보고 바로 아스키 코드와 관련 있다는 것을 알아챘다. 아래와 같이 파이썬 코드를 활용하여 각 값을 아스키 코드로 변환하였다.

 

a="8"
b="7"
c="9"
d="."
e="A"
f="4"
print("8:",ord(a))
print("7.A:",ord(b),ord(d),ord(e))
print("7.9:",ord(b),ord(d),ord(c))
print("74:",ord(b),ord(f))


# 결과
#8: 56
#7.A: 55 46 65
#7.9: 55 46 57
#74: 55 52

 

코드의 결과를 보고 정리한 값을 다음과 같다.

 

input_1: 길이 4미만, 55 46 57<input_1<55 46 65, input_1<56

input_2: 길이 1이상 3미만, 55 52<input_2<74

 

상기 조건에 맞는 값을 아래 아스키표를 보고 찾아보았다.

어떠한 특정 값을 원하는 것은 아닌 것 같고 해당 범위에 맞는 값이기만 하면 되니까 조건에 맞게 아무거나 설정하였다.

설정값) input_1=7.;(55 46 59) , input_2=FF (70 70)

 

출처: https://velog.io/@exploit017/%EC%95%84%EC%8A%A4%ED%82%A4-%EC%BD%94%EB%93%9C%ED%91%9C

 

 

위 풀이를 토대로 아래와 같이 사이트에 값을 입력했더니 flag 값을 찾을 수 있었다.

 

 

 

⛳️ FLAG: DH{81df5f707394347306c1ce2693601349407013aedbf79ae8d97a502c3d138bfe}