반응형

이걸 왜 ctf때 못 풀었지... 너무 쉬운건데 아쉬웠다ㅠㅠㅠ

두가지 step을 돌파하면 flag를 준다.

첫화면이다. nickname과 password가 나온다.

step 1에 대한 code snippet은 아래와 같다.

            // pw filtering
            if (preg_match("/[a-zA-Z]/", $input_pw)) {
              echo "alphabet in the pw :(";
            }
            else{
              $name = preg_replace("/nyang/i", "", $input_name);
              $pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8]\!/", "d4y0r50ng", $input_pw);

              if ($name === "dnyang0310" && $pw === "d4y0r50ng+1+13") {
                echo '<h4>Step 2 : Almost done...</h4><div class="door_box"><div class="door_black"></div><div class="door"><div class="door_cir"></div></div></div>'

필터링을 우회하고, 정규표현식을 만족하며 $name === "dnyang0310" && $pw === "d4y0r50ng+1+13" 요롷게 되도록 만들어야한다.

name은 nyang을 없애버리는 것을 오히려 이용하면 되고,

pw에 대해 해석해보면, 

\d* : 0개 이상의 숫자

\@ : 문자그대로 @

\d{2,3} : 2개에서 3개의 연속된 숫자

(31)+ : 문자그대로 31

[^0-8] : 숫자 0부터 8 사이가 아닌 어떤 문자

\! : 문자 그대로 !

 

더하여 pw filtering부분에서 알파벳을 쓰면 안된다고 나와있다. 모든 조건을 만족하는 것은 아래와 같다.

dnyanyangng0310
123@123319!+1+13

다음 step은 뭔가 입력받는 곳이 존재한다.

code에 의하면 shell command를 입력받는다.

cat flag를 바로 시도해보았다.

필터링이 존재한다.

 // cmd filtering
                else if (preg_match("/flag/i", $cmd)) {
                  echo "<pre>Error!</pre>";
                }

여기서도 정규표현식이 활용된다. cat fl* 이런식으로 쓰면,  fl 로 시작하는 파일을 불러온다.

그러나 결과가 안나온다.

생각해보니 현 디렉터리에 flag파일이 없을 수 있다는 생각이 들어서 확인해보았다.

역시나 없다.

한줄로만 command를 보낼 수 있기에 ; 를 활용하여 여기저기 디렉터리를 좀 뒤져보았다.

아래의 명령을 보낼 시 찾을 수 있다.

cd ../dream; ls

이제 아래의 command를 보내면 flag가 나온다.

cd ../dream; cat fl*

반응형

'wargame' 카테고리의 다른 글

Broken Buffalo Wings  (0) 2023.09.10
LoS - zombie assassin  (0) 2023.08.27
type confusion  (0) 2023.08.27
tmitter  (0) 2023.08.26
Robot-only  (0) 2023.07.21

+ Recent posts