컴퓨터에서는 문자를 인코딩할 시, 아스키 코드를 기반으로 문자를 변환하여 저장하게 된다. 이를 이용한 문제

php7cmp4re

Untitled

들어가면 입력을 받는 사이트가 나온다.

코드를 함 보자.

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>
flag.php
<?php
    $flag = 'flag{**Sample**}'
?>
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>

여기서, 우리는 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;
                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>";
    ?> 

2개의 입력창에 원하는 값을 입력할 경우, flag를 출력한다는 사실을 알 수 있다.

먼저, input1의 코드부터 살펴보자.

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

문자열의 길이는 3이하여야 하고, 문자 8보다 작으면서 7.A보다 작고, 그러면서 7.9보다 커야된다고 나온다.

Untitled

컴퓨터는 문자열을 그대로 문자열로 받지 않고, 숫자(아스키코드)로 변환해서 인식한다.

문자열 “8”은 숫자 8이 아닌, 아스키코드로 변환한 값 56으로 인식된다. 마찬가지로 7.A도 7.65로 인식될 것이다. 그러면 7.9는? 7.57로 인식된다.

7.:나 7.;를 입력해보자.

Untitled

input2는 아무거나 입력해 보았다.