없다.
문제에 들어가면 "Wrong"이란 글자와 함께 소스코드가 주어진다.
소스코드는 이렇게 되어 있다.
php부분만 분석하면 $pat
에는 정규표현식으로 값이 있다.
그리고 get으로 val
이란 이름에 값과 $pat
값이 같으면 문제가 풀리고, 다르면 "Wrong"이란 글자가 나온다.
<?php
$pat="/[1-3][a-f]{5}_.*$_SERVER[REMOTE_ADDR].*\tp\ta\ts\ts/";
if(preg_match($pat,$_GET['val'])){
solve(11);
}
else echo("<h2>Wrong</h2>");
echo("<br><br>");
?>
php 정규표현식을 찾아보면 문제를 풀 수 있다. 한 번 정규표현식을 정리해 본다.
문자 | 설명 |
---|---|
[1-3] | 1~3 중 하나 |
[a-f] | a~f 중 하나 |
{5} | 바로 앞에 있는 내용 5번 매치 |
_ | _ |
. | 임의의 한 문자(\n 문자 제외한 모든 단일 문자) |
* | 바로 앞에 있는 내용 최소 0회 이상 매치 |
\t | tab 문자(\t) |
그리고 $_SERVER[REMOTE_ADDR]
는 현재 접속중인 사용자의 ip주소를 의미한다.
"/[1-3][a-f]{5}_.*$_SERVER[REMOTE_ADDR].*\tp\ta\ts\ts/
그래서 정리를 하면 val값 문자열 안에 1~3 중 하나의 문자로 시작해야 하고([1-3]
), 그 다음은 a~f 중 하나의 문자가 있어야 하는데([a-f]
) 그 내용(a~f 중 하나)을 5번 반복한다.({5}
) 그 다음은 _가 있는 다음 \n문자를 제외한 한 문자가 있어야 하는데(.
) 그 내용이 없어도 되고, 여러개 있어도 된다.(*
) 그 다음 내 ip주소가 들어가고, 다시 \n문자를 제외한 문자가 없어도 되고 여러개 있어도 된다. 그 다음 탭이 들어가고(\t
), p가 들어가고 탭하고 a, 탭하고 s, 탭하고 s로 끝나면 된다.
위 내용을 정리하면 ?val=1aaaaa_1.1.1.1%09p%09a%09s%09s
이렇게 나온다.(1.1.1.1 대신 자신의 ip 주소를 넣으면 된다.)
ip 주소는 구글에 찾아보면 내 ip주소 알려주는 사이트가 있다.
%09는 tab의 url 인코딩값이다.
?val=1aaaaa_1.1.1.1%09p%09a%09s%09s
몇 가지 문제를 더 내 본다.
1.
?val=fda121aaaaf_1.1.1.1%09p%09a%09s%09s
은 정답일까 오답일까?
2.
?val=1aaaaa_asdc%00%03 cc1.1.1.1%09p%09a%09s%09s
은 정답일까 오답일까?
3.
?val=1aaaaa_%0a1.1.1.1%09p%09a%09s%09s
은 정답일까 오답일까?
정답은 1 - O, 2 - O, 3 - X 이다.
1번은 앞에 문자가 오든 뒤에 형식만 맞다면 문제가 없다.
(fda121aaaaf_1.1.1.1%09p%09a%09s%09s
)
2번은 \n을 제외한 아무 문자가 들어와도 상관이 없기 때문에 정답이다.
(1aaaaaasdc%00%03 cc
1.1.1.1%09p%09a%09s%09s)
3번은 \n이 들어갔기 때문에 오답이다.
(1aaaaa%0a
1.1.1.1%09p%09a%09s%09s)