-
[L.O.S] Level 19 - xavisWargame/L.O.S 2022. 12. 7. 04:57반응형
Level 19 - xavis를 풀어보자.
어려운 문제인 것도 맞는 것 같고, 생각의 유연함이 필요한 문제인 것도 맞는 것 같다.
문제의 코드를 보면 필터링은 regex와 like를 하고 있다.
regex가 뭔지는 잘 모르겠지만, 넘어가도 될 것 같다.
얼핏 보기에 필터링되는 것도 별로 없고, 제한 사항이 없어 쉬운 문제인 것 같다.

<xavis의 php 코드 내용> pw의 길이를 알아보기 위해 입력을 했더니, 이전의 Level들 보다는 길다는 것을 알 수 있다.
파이썬 코드를 이용해 정확한 pw의 길이를 알아보니 12가 나왔다.


<pw의 길이를 알기 위한 파이썬 코드> 이제 admin의 pw를 알아보기 위해 코드를 작성해 실행하면 문제가 풀릴텐데, 수월한 문제이다.
하지만, 코드를 실행시키고 기다려봐도 결과가 출력되지 않는다.
무엇이 문제일까??

<pw의 값을 알기 위한 파이썬 코드> 생각을 조금 해보면 파이썬 코드에서 지정한 범위인 ascii 코드에서는 답이 나오지 않는다는 것을 알 수 있다.
그렇다면 이보다 더 큰 유니코드를 생각해보면 어떨까??
그리고 그것이 맞다면 이번 답은 기존의 pw였던 영어와 숫자가 아닐 것이다.
이 생각이 맞다는 것을 확인하기 위해 pw의 각 글자의 길이를 알아보도록 하자.
아래의 사진을 보면, pw의 첫 번째 글자의 길이가 4일 때 참이라는 것을 알 수 있다.
그리고 두 번째, 세 번째 글자의 길이도 같고, 네 번째부터는 Hello guest가 출력된다.
정확히 어떤 문자인지는 모르겠지만, 영어와 숫자가 아니라는 가정은 맞았다.


<pw의 각 글자의 길이> 다시 한 번 pw의 길이를 구해보도록 하자.
16진수로 pw를 나타내고 그것의 길이를 구하도록 파이썬 코드를 작성해 실행하였다.
그 결과 pw의 길이가 24라는 것을 알게 되었다.

<16진수로 표현한 pw의 길이> 16진수로 표현한 pw의 길이를 구했으니, 이제 그 값을 구해보도록 하자.
아래의 사진처럼 코드를 작성해 실행하면 pw의 값이 출력된다. (코드를 작성하는데 오래 걸렸다..)


<pw의 값> 24개의 길이인데, 3개의 글자라는 것을 알고 있으니 8개씩 나누어 chr 함수를 이용해 출력한다.
그랬더니 '우왕굳'이라는 한글 문자가 출력되었다.
pw에 우왕굳을 입력했더니 XAVIS Clear!가 출력되며 문제가 해결되었다.

<xavis 문제 완료> 추가하자면, 한글은 UTF-8에서 한 글자당 3 바이트로 표현이 가능하다.
여기서 한 글자의 길이가 4 바이트인 것은 UTF-8은 1 ~ 4의 가변 크기로 인코딩하기 때문이다.
(UTF-32는 한 글자당 4 바이트로 고정)
사실 여기서 쓰이는 인코딩 방식이 유니코드인 것은 맞는 것 같은데 정확히 무엇인지를 모른다.
Web Proxy를 이용해 헤더의 Content-Type을 확인하면 되지만, 그건 생략하도록 하자.
반응형'Wargame > L.O.S' 카테고리의 다른 글
[L.O.S] Level 21 - iron_golem (1) 2022.12.09 [L.O.S] Level 20 - dragon (0) 2022.12.08 [L.O.S] Level 18 - nightmare (0) 2022.12.06 [L.O.S] Level 17 - zombie_assassin (0) 2022.12.05 [L.O.S] Level 16 - succubus (0) 2022.12.05