php로 작성된 페이지입니다.
알맞은 Nickname과 Password를 입력하면 Step 2로 넘어갈 수 있습니다.
Step 2에서 system() 함수를 이용하여 플래그를 획득하세요.
플래그는 ../dream/flag.txt에 위치합니다.
플래그의 형식은 DH{...} 입니다.

php 파일을 notepad++로 열었다. index.php에는 별다른 게 없었고, 그냥 폼 태그를 이용해 닉네임과 패스워드를 입력받고 step2.php로 넘겨주는 것을 확인할 수 있었다.

step2.php를 확인하면, 최종적인 닉네임과 패스워드 값이 각각 dnyang0310, d4y0r50ng+1+13이어야 함을 확인할 수 있다.
그런데 조건이
- 패스워드 값에 알파벳이 포함되면 안되고
- preg_replace 함수를 거쳤을 때의 최종 값이 dnyang0310, d4y0r50ng+1+13이어야 하는 것을 확인할 수 있다.
$name = preg_replace("/nyang/i", "", $input_name);
$pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8\"]\!/", "d4y0r50ng", $input_pw);
*preg_replace(정규 표현식, 교체할값, 인풋): 인풋에 있는 값이 정규표현식에 있으면, 해당 값을 교체할 값으로 교체함.
- name: nyang이라는 문자열을 아무것도 아닌 값으로 교체한다. 즉, dnnyangyang0310 이런 방식으로 정규 표현식을 피해갈 수 있다. 해당 문자열의 nyang을 제거하면 dnyang0310이 되기 때문이다.
- pw:
\d* = 숫자 0개 이상(숫자가 아예 없거나 여러개 있을 수 있음)
\@ = 골뱅이
\d(2,3) = 숫자 2~3개
(31)+ = 31 반복(31 덩어리가)
[^0-8\"] = 0~8숫자와 큰따옴표를 제외한 문자 1개
\! = !
-> @12319!+1+13라는 값을 쓰면 해당 정규 표현식을 만족시키고, 따라서 @12319가 교체할 값인 d4y0r50ng로 대체된다. 또, pw가 충족해야 하는 값인 d4y0r50ng+1+13이 되기 위해 그 뒤에 +1+13만 붙여주면 되는 것이다.

사이트에서 각각 닉네임과 패스워드에 위의 값들을 넘겨주면, step2로 무사히 넘어간 것을 확인할 수 있다.

command를 입력하면 system($cmd) 함수로 명령어를 그대로 실행해 출력해주는 것을 확인할 수 있다.
기본적으로 flag.txt를 읽기 위해 명령어 cat ../dream/flag.txt를 생각할 수 있겠지만, 사진과 같이 flag라는 문자열을 직접적으로 쓰는 것은 막혀있다.
-> cat ../dream/**ag.txt와 같은 방식으로 flag 문자열을 우회하여 커맨드를 넘겨줄 수 있다.

해당 값을 입력해 주면 우회가 정상적으로 되었고, 최종적으로 플래그 값이 나오는 것을 확인할 수 있다.
개인 공부 목적으로 작성된 글이며, 틀린 정보나 해석이 있을 수 있음.
https://dreamhack.io/wargame/challenges/873
'소학회 > 워게임' 카테고리의 다른 글
| [web]Dreamhack_web-misconf-1 (0) | 2026.03.30 |
|---|---|
| [reversing]Dreamhack_rev-basic-1 (0) | 2026.01.27 |
| [reversing]Dreamhack_simple-operation (0) | 2026.01.13 |
| [misc]Dreamhack_Exercise: SSH (0) | 2025.11.04 |
| [pwnable]Dreamhack_baby-bof (0) | 2025.09.30 |