

문제에서 주어진 PHP 코드를 분석해보면,
Nickname과 Password를 preg_replace()를 통해 가공한 뒤 특정 문자열과 일치하는지 비교한다.
$name = preg_replace("/nyang/i", "", $input_name);
$pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8\"]\!/", "d4y0r50ng", $input_pw);
if ($name === "dnyang0310" && $pw === "d4y0r50ng+1+13")
$input_name에서 "nyang" 문자열을 대소문자 구분 없이 제거한다."dnyang0310"과 같아야 한다."dnnyangyang0310" 이런식으로 입력하면 된다.$input_pw에서 특정 정규표현식 패턴이 "d4y0r50ng"으로 치환된다."d4y0r50ng+1+13"과 같아야 한다.정규표현식 분석 결과, Password는 아래 패턴을 만족해야 한다:
[숫자 0개 이상]@[2~3자리 숫자][31반복][9][!] 패턴을 먼저 매칭시킨다.+1+13이 붙어야 한다.따라서 입력할 Password 예시는 다음과 같다:
0@993131319!+1+13
0@99 → 숫자@2자리숫자313131 → (31)+9! → 9와 느낌표+1+13 → 그대로 남기기이제 Nickname과 Password를 올바르게 입력하여 Step 2로 넘어갈 수 있다.
Step 2로 넘어가면 명령어를 입력해 실행할 수 있다.
하지만 명령어 안에 flag라는 단어가 들어가면 Error가 발생한다.
else if (preg_match("/flag/i", $cmd)) {
echo "<pre>Error!</pre>";
}

따라서 cat ../dream/flag.txt처럼 직접 입력할 수 없다.
Linux에서는 *(와일드카드)를 사용해 파일 이름을 대체할 수 있다.
따라서 "flag"라는 글자를 직접 입력하지 않고, 경로를 패턴으로 우회할 수 있다.
실제 사용한 명령어 예시:
cat ../dream/fla*
fla*는 flag.txt를 매칭시킨다.flag라는 문자열을 직접 쓰지 않았기 때문에 필터를 통과한다.이 문제는 PHP의 preg_replace, preg_match를 통한 입력 가공과 필터링을 정확히 이해하고,
그 위에서 Linux 명령어의 유연성(와일드카드 사용)을 활용해 우회하는 사고를 연습할 수 있었다.
특히 "flag" 문자열이 금지되어 있을 때, 직접적인 문자열 입력 대신 쉘 특성(패턴 매칭, 와일드카드)를 이용해서 문제를 우회하는 발상이 매우 중요했다.
실제 실무나 해킹 실전에서도 필터링은 항상 뚫린다는 관점에서 다양한 우회법을 빠르게 떠올릴 수 있어야 한다는 교훈을 얻었다.