본문으로 바로가기

[Plaid CTF 2015] Reversing - RE GEX

category CTF/Hacking Defense Contest 2015. 4. 21. 15:46

- 문제

RE GEX (250 pts)

Wow that's a big regex.... luckily regular languages are easy.
Server with this regex running at 52.6.11.111


파일 : 

re_gex_62d057a9a99036ae4ca64d84e02b4833.py


regex_57f2cf49f6a354b4e8896c57a4e3c973.txt


엄청 큰 정규표현식이 존재하며 정규표현식에 필터링되지 않는 문자열을 찾아야 한다.

정규표현식은 | 연산으로 여러 개의 표현식이 묶여 있다.

첫번째 정규표현식 .*[^plaidctf].* 는 문자가 모두 plaidctf로 구성되어야 한다는 것이며 두 번째 세 번째 정규표현식 .{,170}|.{172,}는 문자열 길이가 171글자라는 것을 확인할 수 있다. 

그 이후의 표현식들은 특정 자리의 문자가 오면 안되는 표현식이 존재한다. 

예를들면 네번째 표현식 .{88}[padt].{60}[licf].{6}[plai].{14} 는 89번째 문자가 [padt] 150번째 문자가 [licf] 157번째 문자가[plai]를 만족하면 안된다는 것이다.

처음 문제를 보고 접근한 방법은 문자열을 생성하여 문자열이 정규표현식에 매칭되는지 확인해보는 것이였다.


check (2).py


위처럼 확인을 하니 어느 정규표현식에 매칭되는지 확인할 수 없어 정규표현식을 한줄씩 나눠서 저장하였다.


split.pl


그 후에 check소스를 약간 수정하여 확인

check.py


이렇게 수정 후 확인을 하니 내가 입력한 문자열이 어느 부분의 정규표현식과 매칭되는지 확인할 수 있었다.

처음에는 결과 값을 보고 수동으로 한 글자씩 수정 후 답을 구하려고 했으나... 정규표현식은 2562개나 되는데 600번까지 진행 하는데 시간도 좀 걸리고 귀찮아서 코드로 작성하려고 하였다. 하지만 이 문제를 늦게 봐서 그런지 종료시간까지 코드 작성이 불가능할거 같아서 포기...

조금 일찍 봤으면 이 문제까지 풀 수 있지 않았을까.. 하는 아쉬움이 남는다