2024 SWLUG/Dreamhack

3주차_CTF 문제풀이(1) - php7cmp4re

un_plugged 2024. 5. 22. 12:15

▶문제

▶문제 속 용어 정리

PHP: Personal Home Page. 웹 사이트 제작에 사용되는 프로그래밍 언어이다.

▶풀이

문제 사이트에 접속했더니 위와 같은 화면이 나온다. 2개의 input값을 알아야한다.

일단 여기서 더 알아낼 수 있는건 없어서 문제 파일을 다운 받았다. check.php , flag.php, index.php 3가지 파일 중 우선 index.php 파일을 먼저 들어갔다.

index.php

알아보기 힘든 코드들이 많았다. 어차피 input 값만 알면 되니까 input에 관련된 부분만 보았다.

텍스트를 입력하고 제출을 클릭하면, 입력한 데이터가 check.php로 POST 방식으로 전송한다는 뜻이다. 그래서 check.php 파일을 열어보았다.

check.php

이 파일의 코드도 역시 복잡하다...여기서도 input 값 관련된 코드만 살펴보았다.

아까 index.php 파일에서 POST 방식으로 check.php로 전송한다 했는데 //POST request를 보니 전송되었을 때 코드인 것 같다. 그리고 input_1과 input_2에 대한 코드도 확인할 수 있다.

strlen: 문자열을 받아서 그것의 길이를 반환하는 함수

input_1과 input_2의 길이와 값에 대한 정보를 알려주고 있다!

① input_1의 길이는 4보다 작고 input_1은 "8"보다 작고 "7.A"보다 작으면서 "7.9"보다 크다.

② input_2의 길이는 1보다 크고 3보다 작고 input_2는 74보다 작고 "74"보다 크다.

숫자가 큰 따옴표로 표시되어있는 것을 보니 문자를 의미한다. 근데 7.A보다 작다는게 무슨 말일까 고민을 해보았는데...숫자와 문자의 연관성을 생각해보니 아스키 코드가 떠올랐다!

변환기를 활용하여 일단 따옴표 처리되어있는 것을 다 10진수로 바꾸어 보았다.

이제 input_1의 값을 구할 수 있을 것 같다. 55 46 57 10 < input_1 < 55 46 65

input_1 값이 딱 정해진 것은 아닌 것 같다. 길이는 4보다 작아야하니까 3으로 정하고...나는 아스키코드 표를 활용하여 55 46 58 정도의 값을 넣었다.

55 46 59는 7.:이다.

그 다음 input_2의 값을 구해보겠다.

74도 변환해보았다. input_2의 길이는 1보다 크고 3보다 작아야하니 2로 하고...

55 52 < input_2 < 74의 범위가 나온다. input_2도 마찬가지로 특정 값으로 정해진 것은 아니다.

한 60정도로 넣으면 좋을 것 같다고 생각했고 위의 아스키 코드 표를 참고해서 60이 < 임을 알았다. 근데 길이가 2이니까 <<로 하였다.

이 두 가지 input 값을 넣었더니

FLAG가 나왔다!

문제 풀이에 성공하였다!

▶참고

문제 풀이에 flag.php 파일을 사용하지 않아 풀이 후 한 번 열어보았다.

flag.php

특별한 것은 아니었고 PHP로 작성된 변수 $flag를 정의하고 있다. 이 변수에는 'flag{**Sample**}'라는 값이 할당되어 있는데 아마 input_1, input_2 값을 입력했을 때 나온 flag 형태같다.