[los] xavis
상당히 어려웠던 문제이다... 솔직하게 인터넷 찾아보고 싶었다. 그런데 쉬운문제들은 봐도 상관없는데 어려운 문제는 안보고 푸는 재미가 있기때문에 좀 삽질을 많이 해보았고 혼자 풀어서 뿌듯했다
일단 bruteforce관련 문제이다. 그리고 regex와 like가 안되는데, regex는 정규표현식.
일단 pw 길이는 8일것이다.
귀신같이 아니였다 ㅋㅋㅋㅋ 물론 password 길이를 자동화 돌려도 되지만, 약간의 주의가 필요할 듯 보여서 (그리고 사실 부등호를 이용하면 이진탐색이 가능하고 이건 손으로 하는게 더 빠를 것 같아서. ) order by로 admin이 최상단에 위치하게 해주겠다.
비번은 12바이트이다. 사실 order by 쓸 필요가 없었던듯..
이제 자동화를 돌려주면 된다. addslashes우회만 해주면 딱히 주의점은 없다. 그런데 사실 저번과 같이 guest와 admin의 비밀번호가 겹칠 수도 있는점을 감안해 order by는 그대로 유지해주도록 하겠다.
그런데 생각대로 잘 안됬다... 패스워드에 널문자가 있다고 뜬다.. 그리고 admin은 뜨지도 않는다.
여기서부터 심각해졌다.
그래서 몇가지 가능성을 생각해 보았다. ascii가 아니라 인코딩 방식이 다를 수도 있을 것 같았다 . 그래서 인코딩 방식부터 알아보았다.
4바이트 인코딩이면 utf32일 확률이 높아보인다! 그리고 이건 3글자라는 것도 알 수 있겠다.
(사실 이 4바이트도 엄청난 삽질을 통해서 나온 결과이다. 난 당연하게 utf8 을 생각해서 0~3만 주구창창 넣어주고, 가변인코딩 처리는 어떻게 할지 생각하고 있었는데 0~3넣으면 Hello admin이 안떠서 혹시나 하고 4를 넣어봤더니 쿼리가 작동이 돼서, 4바이트 인코딩을 검색하니 나온것이 utf32였다.)
그리고 hex 함수와 conv 함수를 찾아냈다.
hex('a')=61을 반환한다. 그런데 0x가 붙어있지 않기때문에 이를 또 10진수로 바꿔주는 conv함수를 이용해야한다.
즉 conv(hex('a'),16,10) -> 97이 나온다.
또한 비트연산도 사용해야 한다. 4바이트를 가지고 오기 때문에 비트연산으로 1바이트씩 잘라줄 것이다. 이건 시스템해킹할때 배워둔게 도움이 됐다.
그리고 00~ff 까지 대입하는 코드는 시간이 15분 기다렸는데 안끝나서, 이진탐색으로 효율적으로 탐색하게 하였다.
이러면 수십초정도만에 끝난다!
마지막으로 나온 것을 utf32 디코딩 해준다. 예전에 rsa 2048만들때 c#에서 인코딩 관련해서 기억이 있기때문에 c#으로 했다.
우왕굳...
진짜 어려웠는데 우왕굳이라네여 한 3시간은 걸린거같은데;;