2024. 5. 4. 00:52ㆍhacking : p_study/Dreamhack
phpreg
Description php로 작성된 페이지입니다. 알맞은 Nickname과 Password를 입력하면 Step 2로 넘어갈 수 있습니다. Step 2에서 system() 함수를 이용하여 플래그를 획득하세요. 플래그는 ../dream/flag.txt에 위치합니
dreamhack.io
📌 CTF 문제 풀이
첫번째 문제를 살펴보자.
문제 설명을 읽어보니 PHP로 작성된 페이지라는 것과 두가지 STEP이 존재한다는 것
또 system() 함수를 이용해서 플래그를 획득해야한다는 것과 ../dream/flag.txt에 플래그가 위치한다는
몇가지 힌트를 얻었다.
우선 서버를 생성했다.
들어가보니 이렇게 문모양 그림과 아래 닉네임과 패스워드를 입력하는 것이 있다.
아무거나 입력해봤더니 위에처럼 WRONG NICKNAME OR PW라고 떴다.
또 그냥 STEP2로 넘어가면 위와 같이 NOT GET REQUEST라고 뜬다.
일단 , 개발자 도구를 통해 코드를 살펴봐야겠다.
그냥 POST방식으로 넘기는 것과 HTML정보만 있어서, 문제파일을 다운받았다.
PHP파일이 있었고 STEP2에 대한 코드를 살펴봤다.
NAME과 PW에 대한 정보가 나와있고, 코드를 보자마자 이게 무슨의미인지 고민이 들었다.
위와 같이 입력했더니 alphabet in the pw 라는 문구가 떴다.
이 조건에 맞아 떨어졌나보다. 흠
하지만 이 이후에도 다양한 방법을 시도했지만 위와 같이 alphabet in the pw라는 문구만 떴다.
찾아보니까 먼저 입력한 pw와 [a-zA-Z]를 비교하여 문자가 존재하면 안된다고 한다.
그래서 pw안에 알파벳이 존재한다고 자꾸 뜬거였나보다.
[ 참고 학습 자료 ]
[Dreamhack] phpreg
또한, preg_replace를 통해 입력받은 input_name에 "nyang" 문자가 있다면 공백으로 바꾸고,입력받은 input_pw에 위와 같은 정규표현식이 존재한다면 "d4y0r50ng"로 바꾸어준다는 것을 알 수 있다.그리고 아래
velog.io
위를 통해 코드해석과 풀이에 도움을 받았다.
위 코드에서 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이 아닌 숫자
\! : 문자 !
을 입력해주면 된다.
RegExr: Learn, Build, & Test RegEx
RegExr: Learn, Build, & Test RegEx
RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).
regexr.com
정규 표현식(RegEx)을 이해 해보자! (justkode.kr)
정규 표현식(RegEx)을 이해 해보자!
그렇습니다. 지긋지긋한 정규 표현식 입니다. 막상 공부하자니 귀찮고, 거부감도 드는 그런 녀석입니다. 생긴 것도 기분 나쁘게 생겨가지고. 하지만 이 친구, 사실 한 번 알면 그렇게 어려운 친
justkode.kr
정규표현식은 사용하려면 익숙해지기위해 추가 공부가 필요할 것같다.
위 사이트를 참고해서 추가 공부하자!
문이 열렸다.
두번째 단계이다.
name = cmd이므로 입력받은 문자는 cmd에 저장된다는 것을 알 수 있는데, 그 이후 cmd를 필터링해준다.
만약 cmd에 /flag가 존재한다면 Error를, 아니라면 system(cmd)를 통해 php 코드를 실행시킨다고 한다.
문제에서 flag가 있다는 위치의 경로에 존재하는 파일을 탐색해볼 수 있다.
../dream/flag.txt 파일이 존재한다는 것을 알 수 있었으나, 필터링을 통해 flag라는 단어를 사용할 수 없으므로 정규표현식으로 표현해주어야한다.
(정규식 공부가 역시 필요할 것같다.)
리눅스 공부한 걸 많이 까먹었는데 이참에 리눅스 공부를 다시 되새겨봐야겠다.
기억을 되새겨보자면 cat은 보여주도록 하는 명령어이고, * 모든것을 표현하는 것이고.. 흠
문제 설명페이지에서 system() 함수를 이용해서 플래그를 획득해야한다는 것과 ../dream/flag.txt에 플래그가 위치한다는 점에서 위와 같은 작업들을 한 것을 알 수 있다.
REAKWON :: [리눅스] system함수 사용 방법과 구현(fork, exec, waitpid) (tistory.com)
[리눅스] system함수 사용 방법과 구현(fork, exec, waitpid)
fork, exec에 대한 상세 내용과 더 많은 정보와 예제를 담은 리눅스 교재를 배포했습니다. 아래의 페이지에서 리눅스 교재를 받아가세요. https://reakwon.tistory.com/233 리눅스 프로그래밍 note 배포 티스
reakwon.tistory.com
예전보다는 문제를 직관적으로 이해하기보다는 그 의미를 이해하려고 노력하면서 접근방법이 다양해진 것을 느낄 수 있다 하지만 아직은 공부가 부족해서 더 다양한 접근이 어렵고, 이렇게 도움을 받지 않으면 잘못된 길로 시도하는 것들이 많다는 것을 느낀다.
위와 같은 기초 공부들과 경험이 더 필요할 것 같다. 그래도 오랜만에 리눅스를 봐서 반가웠다..
첫번째 문제 끝!
'hacking : p_study > Dreamhack' 카테고리의 다른 글
5주차_CTF과제(Dreamhack : pathtraversal) (0) | 2024.05.10 |
---|---|
4주차_CTF과제(Dreamhack : baby-union) (0) | 2024.05.04 |
3주차_CTF과제(Dreamhack : Flying Chars) (0) | 2024.04.17 |
3주차_CTF과제(Dreamhack : php7cmp4re) (0) | 2024.04.17 |
2주차_CTF과제(Dreamhack : Carve Party) (0) | 2024.03.29 |