본문으로 바로가기

[LOS]18번 nightmare

category Wargame/LOS(eagle-jump) 2017. 8. 4. 04:07


나이트메어..


굉장히 힘든문제였다...ㅠㅠ





굉장히 조건이 까다로워서 힘들었다.


길이가 최대 6글자까지만 입력가능하다....


닫는 쿼터,괄호,주석만 해도 반이상을 써버리는데 조건은 언제 쓸 수 있는건지....




'어떻게 풀지?' 라는 사고에 싸여 방황하던중


몇시간이 지나고서야 어디에 중점을 두어야할지 감이 잡히기 시작했다.



아무래도 뒤의 쿼리문때문에 주석은 필요한게 맞는것 같다.


그렇다면 주석을 우회하는 방법은?


;%00


;과 NULL 두글자를 사용해야한다.


주석을 사용한다면 손수 싱글쿼터와 괄호를 막아주어야하니 두글자를 더 써야한다.


즉 ');%00 현재까지 총 4글자를 사용했다.


나머지 두글자를 이용해 참을 만들어야한다.


이 부분에서 한번 더 막힌다.


남은 글자는 총 두글자


참으로 만들기 위해선 하나는 연산자가 되야할 것이고 하나는 값이어야하는데...





pw=('') 이것이 없는값이니 거짓인 0과 같다?



오??


정확하지 않게 풀렸으니 자세히 알아보자



aaa는 원래 있는 아이디임에도 해당 아이디를 제외하고 나머지 내용이 모두 나왔다


이를통해 =0이 부정 역할을 한 것임을 알 수 있다.






('aaa')=0 을 따로 계산했을 때의 결과가 궁금해서 또 알아보니 아래와 같았다.



'a'='a'  --> 참


'a'=1 --> 거짓


'a'=0 --> 참


mysql에서 나오는 결과들이다.


이해가 안될수도 있다.


아래는 위의 상황에 대한 검색결과이다.




문자들이 자동적으로 숫자로 필요에 의해 변환된다는 말이다.


이 뜻은 숫자와 문자열을 비교하기 위해서 문자열의 처음부터 숫자를 추출해낸다. (문자를 만나기 전까지)


이 때, 대부분의 문자열의 첫글자는 숫자가 아니기 때문에 숫자랑 비교하기가 어렵다.


그렇기 때문에 숫자가 아닌 문자들은 모두 0으로 변환된다.




만약 맨 첫글자가 숫자라면 해당 숫자와 결과값이 같다.




아래는 mysql에 직접 실험해본 것이다.




이를 통해서 이 문제가 어떻게 저렇게 풀렸는지 이해할 수 있다.





'Wargame > LOS(eagle-jump)' 카테고리의 다른 글

[LOS]20번 dragon  (0) 2017.08.09
[LOS]19번 xavis  (0) 2017.08.07
[LOS]17번 succubus  (0) 2017.08.04
[LOS]16번 zombie_assassin  (0) 2017.08.03
[LOS]15번 assassin  (0) 2017.08.03