PHP 언어의 이해
아스키코드


php 7.4로 페이지가 작성되어 있다고 한다. 소스코드를 분석해보자

if ($_SERVER["REQUEST_METHOD"] == "POST") {
위 코드를 보면 서버에 요청하는 메소드가 POST일 경우에만 동작한다고 한다.
$input_1 = $_POST["input1"] ? $_POST["input1"] : "";
input1의 값이 비어있지 않다면 input1에 할당하고 비어있다면 빈 문자열을 할당한다.
input2도 동일하게 설정되어 있다.

조건문을 하나씩 따라가다 보면 "echo $flag;" 을 통해 FLAG를 반환하고 있다.
FLAG를 반환하는 중첩조건문을 만족시키면 FLAG를 찾을 수 있다.
if($input_1 != "" && $input_2 != "")
input1과 2는 빈칸이 아니어야 한다.
if(strlen($input_1) < 4)
input1의 문자열 길이는 4보다 작아야한다.(3글자 이하)
if($input_1 < "8" && $input_1 < "7.A" && $input_1 > "7.9")
input1은 8보다 작고 7.A보다 작고 7.9보다 커야한다.
->7.A라는 실수는 없으므로 아스키코드를 사용하면 해석할 수 있지 않을까?
if(strlen(input_2) < 3 && strlen(input_2) > 1)
input2의 문자열 길이는 1보다 크고 3보다 작은 2다.
if($input_2 < 74 && $input_2 > "74")
input2는 74보다 작아야하고 문자열 74보다 커야한다.
-> 아스키코드를 사용해서 비교해볼 수 있겠다.
input1 -> 7.A보다 작고 7.9보다 커야한다.
7.A를 아스키코드로 바꾸면 55 46 65,
7.9를 아스키코드로 바꾸면 55 46 57,
57과 65사이의 임의의 숫자 58로 하고
55 46 58을 다시 아스키코드를 통해 변환하면 "7.:"
input2 -> 정수 74보다 작고 문자열 74보다 커야한다.
문자열 74를 아스키코드로 바꾸면 55 52
74보다 작고 55 52 보다 큰 두 글자의 문자열 55 53 을 아스키코드로 변환하면 75이다.

input1과 input2에 각각 7.: 과 75를 대입하면

Good try! 라는 답이 나온다 아마 input2의 값이 문자열이 아니라 정수로 인식해서 그럴 것이다.
아스키 코드에서 숫자를 지나 문자로 인식하는 가장 첫번째 58의 문자 :를 확인하고

input1과 input2에 각각 7.: 과 7:를 대입하면

FLAG를 획득할 수 있다.