[Dreamhack] phpreg

sy46·2023년 7월 21일
0

dreamhack

목록 보기
10/20
post-custom-banner

phpreg

STEP1 코드 해석

먼저 입력한 pw와 [a-zA-Z]를 비교하여 문자가 존재하면 안된다는 것을 알 수 있다.

또한, preg_replace를 통해 입력받은 input_name에 "nyang" 문자가 있다면 공백으로 바꾸고,
입력받은 input_pw에 위와 같은 정규표현식이 존재한다면 "d4y0r50ng"로 바꾸어준다는 것을 알 수 있다.

그리고 아래 코드를 통해 name은 dnyang0310이, pw는 d4y050ng+1+13이 되어야 한다는 것을 알 수 있다.

그렇기에 아래와 같이 입력을 해주었다.

nyang을 만나면 공백으로 지워버리기에 dnnyangyang0310에서 중간에 nyang이 지워진 dnyang0310이 최종적인 아이디가 되고, 비밀번호는 정규표현식대로 적어준 이후 +1+13을 따로 적어주면 된다.

정규표현식 해석

비밀번호를 보면 "\d*\@\d{2,3}(31)+[^0-8]\!" 라는 정규표현식이 나온다.
처음부터 해석해보면
\d* : 숫자 1번 이상 반복
\@ : 문자 @
\d{2,3} : 숫자 2번 혹은 3번 반복
(31) : 31이라는 숫자
[^0-8] : 0 - 8이 아닌 숫자
\! : 문자 !
을 입력해주면 된다.



STEP2 코드 해석

이제 step1을 통과했으므로 step2의 코드를 분석해보자. name = cmd이므로 입력받은 문자는 cmd에 저장된다는 것을 알 수 있다. 그 이후 cmd를 필터링해주는데,

만약 cmd에 /flag가 존재한다면 Error를, 아니라면 system(cmd)를 통해 php 코드를 실행시킨다.

그렇기에 문제에서 flag가 있다는 위치의 경로에 존재하는 파일을 탐색해보았다. ../dream/flag.txt 파일이 존재한다는 것을 알 수 있었으나, 필터링을 통해 flag라는 단어를 사용할 수 없으므로 정규표현식으로 표현해주었다.

dream/에 존재하는 모든 파일을 읽으라는 명령어를 통해 아래와같이 flag 값을 얻을 수 있었다.

post-custom-banner

0개의 댓글