Dreamhack phpreg 문제 풀이

    728x90

    1. 문제 설명

    문제는 간단하다. php로 작성된 페이지에서 알맞게 입력하고 flag를 찾으면 되는 문제이다.

     

    2. 문제 풀이

    페이지에 접속하면 다음과 같이 페이지가 출력된다.

     

    step2.php를 보면, dnyang0310이 name으로, d4y0r50ng+1+13이 pw로 가야되는 것을 확인할 수 있다. 다만 위에 보면 알겠지만 preg_replace에서 name에는 nyang을 공백으로, /\d*\@\d{2,3}(31)+[^0-8\"]\!/"를 d4y0r50ng으로 치환해준다는 것을 확인 가능하다. 나아가 pw에 알파벳이 들어가면 오류 메시지를 출력하도록 코딩되어 있다.

     

    name의 dnyang0310에서 nyang이 치환 당해도 남아있을 수 있도록 하려면 dnnyangyang0310처럼 nyang이란 문자열 양끝에 떨어뜨려서 한번더 넣어주면, 사이에 낀 nyang이란 단어가 공백으로 치환되며 양끝에 떨어져 있던 nyang이 합쳐지면서 name에 성립하게 된다.

     

    pw의 /\d*\@\d{2,3}(31)+[^0-8\"]\!/은 php 정규표현식을 알아야 한다.

    \d : (0-9) 사이의 숫자

    * : 0번 이상 반복

    \@ : @

    \d{2,3} : (0-9) 사이의 숫자를 2번 이상, 3번 이하 반복

    (31) : 숫자 31

    + : 바로 앞문자 1회 이상 반복

    [^0-8\"] : 0에서 8사이 숫자와 "를 제외한 문자(즉, 이 문제에서는 숫자 9나 다른 특수기호를 사용하면 된다.)

    \! : !

    즉, 여러 가지 조합이 나올 수 있는데, 여기서는 6@11319!로 정해서 하면 pw에는 6@11319!+1+13를 입력해야 한다.

     

    실제로 입력해보면 정상적으로 Step 2로 넘어간 것을 확인할 수 있다. Step 2는 command를 입력하면 작동하는 구조이다. ../dream/flag.txt를 찾으면 되는 문제이니, 파일을 읽을 수 있는 cat명령어를 사용하면 될것 같다.

     

    다만 문제가 있는데, command창에 flag라는 문자열을 입력하면 오류 메시지를 띄운다는 것이다. 이럴때에는 flag단어를 직접 사용할 필요 없이, fla*.txt나 fl*.txt 정도로 입력해줘도 실행이 된다.

     

    cat ../dream/fl*.txt를 입력했더니 정상적으로 실행이 가능한 것을 확인할 수 있다.

     

    3. 정리

    정규식 해석과, php의 preg_replace나 preg_match가 어떤 기능을 하는지만 알면 손쉽게 풀 수 있는 문제이다.

    댓글