webhacking.kr Challenge11 문제를 풀다가 php의 'preg_match' 함수를 만나게 되었다.

해당 문제에서는 정규식표현에 쓰이는 특수문자들이 있었다.

처음에는 특수문자가 왜 쓰이는지 알 수 없었고 곧 구글링을 통해 정규표현식임을 알 수 있었다.



webhacking.kr Challenge 11 write up!

if(preg_match($pat,$val)) { echo("Password is ????"); }

$pat="/[1-3][a-f]{5}_.*165.128.238.19.*\tp\ta\ts\ts/";

$pat을 나눠서 해석해보자

[1-3] : (1, 2, 3) 중에서 아무 숫자 하나 = 1

[a-f] : (a, b, c, d, e, f) 중에서 아무 문자 하나 = 1a

{5} : 앞에 나온 문자가 5번 나와야함 = 1aaaaa

_ : 정규표현식에 쓰이는 특수문자가 아님 = 1aaaaa_

.* : '.'는 어떤 문자 하나, '*'는 앞의 문자가 안나오거나 하나. 따라서 어떤문자를 안써줘도 된다 = 1aaaaa_

165 : 숫자이므로 그대로 작성 =  1aaaaa_165

. : 어떤 문자 하나(임의로 a 작성) = 1aaaaa_165a

128 : 숫자이므로 그대로 작성 =  1aaaaa_165a128

. : 어떤 문자 하나(임의로 a 작성) = 1aaaaa_165a128a

238 : 숫자이므로 그대로 작성 =  1aaaaa_165a128a238

. : 어떤 문자 하나(임의로 a 작성) = 1aaaaa_165a128a238a

19 : 숫자이므로 그대로 작성 =  1aaaaa_165a128a238a19

.* : 위와 같이 어떤 문자를 안써줘도 된다 = 1aaaaa_165a128a238a19

\t : Tap = <1aaaaa_165a128a238a19    > (Tap을 보여주기위해 <>안에 넣음)

p : 문자이므로 그대로 작성 = 1aaaaa_165a128a238a19    p

\t : Tap = <1aaaaa_165a128a238a19    p    > (Tap을 보여주기위해 <>안에 넣음)

a : 문자이므로 그대로 작성 = 1aaaaa_165a128a238a19    p    a

\t : Tap = <1aaaaa_165a128a238a19    p    a    > (Tap을 보여주기위해 <>안에 넣음)

s : 문자이므로 그대로 작성 = 1aaaaa_165a128a238a19    p    p    s

\t : Tap = <1aaaaa_165a128a238a19    p    a    s    > (Tap을 보여주기위해 <>안에 넣음)

s : 문자이므로 그대로 작성 = 1aaaaa_165a128a238a19    p    a    s    s


따라서 $val = "1aaaaa_165a128a238a19 p a s s"; 일때 인증키를 얻을 수 있다.



정규표현식(regular expression)이란? :

- 특정한 규칙을 가진 문자열의 집합을 표한하는데 사용하는 형식언어.

- 정해진 패턴을 사용해서 패턴에 일치하는 데이터 검색을 지워하는 표현식.



정규표현식의 문법 :

1. '.' : 임의의 한문자

ex)

c.s = cjs, cas, cbs, cds, ces, ...

.js = cjs, ajs, bjs, djs, fjs, ...


2. '*' : 바로 앞의 문자가 없거나 하나 이상(즉 0개 이상을 포함)

ex)

c*s = s, cs, css, ccs, cccs, ...

abc* = ab, abc, abcc, abccc, abcccc, ...

ka*b = kb, kab, kaab, kaaab, kaaaab, ...


3. '+' : 바로 앞의 문자가 하나 이상(즉 1개 이상을 포함)

ex)

j+s = js, jjs, jjjs, jjjjs, jjjjjs, ...

abc+ = abc, abcc, abccc, abcccc, abccccc, ...


4. '?' : q바로 앞의 문자가 없가나 하나(즉 1개 또는 0개 이상을 포함)

ex)

cj?s = s, cjs (두가지 표현이 유일)

c?at = at, cat (두가지 표현이 유일)


5. '^' : 바로 뒤의 문자열로 시작

ex)

^This = This is my Book, Thisead, ...

^a?bc = bc, abc, ...

^.e = he, me, request, settle, ...

^s.e? = sa, sae, sb, sbe (e는 있어도 되고 없어도 되고)


6. '$' : 바로 앞의 문자열로 종료

ex)

a?bc$ = eeabe, seebc, bc, ...

+.e$ = onthetoe, hctae, appetitlle, ...

s?c+$ = e, se, ee, eee, seee, seeee, ...


7. '[]' : [] 안에 있는 문자 중 하나, 범위는 '-'로 지정

ex)

[ab]cd = acd, bcd, ...

[a-z] = a부터 z까지

[a-zA-Z] = 대소문자 모두 a부터 z까지

[0-9] = 0부터 9까지

ag[a-z] = aga, agbcd, agzzz, ...

^ab[cd]ef = abcef, abdef, ...

^[a-zA-Z] = 영문자로 시작

^[a-zA-Z_] = 첫글자가 영어 대소문자와 '_' 만 사용 가능

^[가-힣]  =  한글로 시작

[^a-zA-Z0-9]  =  ^은 안으로 들어가면 제외(부정)의 의미가 된다. 영어 대소문자나 숫자로 시작 불가

[a-zA-Z0-9]$ = 영어 대소문자나 숫자로 종료


8. '{}' : 앞의 문자나 문자열 출현 횟수

ex)

a{2}b = aab, ... (a가 반드시 2번 나와야함)

a{2,}b = aab, aaab, aaaab, ... (a가 최소한 2번 이상 나와야함)

a{2, 4}b = aab, aaab, aaab, ... (a가 최소 2번 최대 4번 나와야함)


9: '()' : ()안에 있는 문자를 그룹화

ex)

a(bc){2} = abcbc (a다음으로 bc가 2번 나와야함)

a(bc)* = abcbcbc (a다음에 bc는 무제한으로 나올수 있음)


10. '|' : or 연산자

ex)

he|she = he is, she is


Reference

: http://ko.wikipedia.org/wiki/정규_표현식

: http://www.devholic.net/1000238


PS. 사실 2014.08.02에 작성했던 글이다.



'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 13번  (0) 2016.11.14
webhacking.kr 12번  (0) 2016.11.13
webhacking.kr 11번  (0) 2016.11.13
webhacking.kr 10번  (0) 2016.11.12
webhacking.kr 9번  (0) 2016.11.12
webhacking.kr 8번  (0) 2016.11.11

+ Recent posts