티스토리 뷰

3번째 글.

 

문제

 

 

6번 문제와 마찬가지로 잠겨져있는 글을 선택해보았다.

 

 

 

암호를 입력하라고 나온다.

바로 소스코드를 확인해 보았다.

 

 

이처럼 상단에 trans()라는 함수가 있었다. 특별히 볼 곳은

EncryptReadKey, UserPasswordEncryptFunc() 인 것 같다.

아마 UserPasswordEncryptFunc()에 인자값으로 사용자가 입력한 암호가 들어가면 그것이 인코딩되어

EncryptReadKey와 같으면 문제가 게시글에 접속할 수 있는 것 같다.

 

 

 

이전 문제와 마찬가지로 Utill.js를 확인해보았는데 input값을 encode해주는 것 같다.

나는 처음에 접근을 할 때  내가 지정한 input값으로 설정하고 EncryptReadKey 값을 그것에 맞게

바꿔주는 식으로 했는데 잘되지 않았다. 결국 위의 encode 함수를 분석하는 방식으로 변경하였다.

 

encode에서 알 수 있는 부분을 말해보겠다. 

먼저 입력값의 첫글자, 두번째 글자, 세번째 글자를 각각 chr1, chr2, chr3에 담는다.

 

여기서 의문이 들 수 있다.

만약에 입력값이 그냥 a라면? 

chr1에는 a의 아스키코드 값인 97이 담기겠지만 

chr2과 chr3에는 NaN이 담기게 된다. 그렇기 떄문에 입력값이 한글자라도 위의 코드에 의해서

encode된 값은 4글자가 될 것이다. 3글자씩 끊어서 읽기 때문에

3글자를 입력하면 4글자가 output으로 나오고 4글자를 입력하면 8글자가 나올 것이다.

그 다음은 7글자를 입력하면 12글자가 나올 것이다.

따라서 EncryptReadKey를 4글자씩 띄어서 보는 것이 편할 것이다.

 

iRAJ HaTR iRAJ HaLL FBOw rXoL F6j2 rSXC

 

이런식으로 말이다.

여기서 또 한가지를 유추 할 수 있다.

 

chr에는 숫자이든 다른 문자이든 상관없이 charCodeAt()에 의해서 아스키코드 숫자 값이 담기게 된다.

하지만 위에서 언급한 것처럼 입력된 문자를 3글자씩 나누었을 때

문자가 3글자 이상이 아니면 NaN이 값이 담기게 된다.

 

위의 코드를 보면 chr2가 NaN면 enc3과 enc4에 64를 담아주는데 

 

 

 

여기서 볼 수 있듯이 enc의 값은 _keyStr에 담겨있는 문자열의 인덱스번호 이다.

즉 64는 _keyStr의 65번째 문자인 "C"를 의미한다. 

EncryptReadKey를 다시보면 맨 마지막에만 C가 1개 들어가있다. 

그 뜻은 rSXC에 해당하는 글자가 2글자란 소리이다.

만약 한글자였으면 enc3과 enc4에 둘다 64가 담겨서 C가 2번 출력됐을 것이다.

 

 

 

이해를 쉽게하는 것을 돕기위해 EncryptReadKey의 맨 앞 4글자인 iRAJ를 가지고 설명하겠다.

enc4부터 거꾸로 유추하는 것이 편할 것이다. J는  _keyStr 52번째 값이다.

따라서 chr3 & 63의 값이 51이 나오면 된다.  이에 대응하는 chr3의 값은 's' 이다.

enc3에서 'chr3 >> 6' 이부분은 무조건 0 or 1이 나오게 되어있다. 

아스키코드 숫자값의 마지막은 127인데 이는 1111111이기 떄문에 왼쪽으로 6만큼 비트 쉬프트를 하면

1이 나오게 된다. 64보다 작은 값들은 6자리이기때문에 0이 나온다. 

따라서 enc3에서 (chr3 >> 6)을 OR해주면 무조건 자기자신 or 자기자신 +1 의 값이 나온다.

사실상 enc3은 chr2의 값에 따라 영향을 받는다고 볼 수 있다.

(추가로 chr2 & 15를 하게 되면 0~15사이의 값을 가지게 되고 <<2를 하게되면 0~60까지 4의 배수 값을 가지게 된다.)

 

그다음 enc1에서는 실수를 하면 안된다. 'i' 는 _keyStr 에서 17번째 값인데

왼쪽으로 2만큼 비트시프트를 해서 16이 될 수 있는 값은 65, 66, 67이 3가지이다...

따라서 enc2와 적절하게 비교를 잘해가면서 'iR' 이 나올 수 있도록 해야한다.

 

이렇게하다보면 iRAJ의 값은 'Bes' 라는 것을 알 수 있다. 

나같은 경우에는 iRAJ가 뒤에 한번 더 나오고 'Bes' 문자열 뒤에 올 수 있는 단어를 추측해서 풀 수 있었다.

(좀 노가다지만 이방법이 알고리즘을 만드는 것보다 빠르게 풀 수 있다고 판단하였다.)

알고리즘을 작성하고 싶지만 귀찮니즘으로인해 패스하겠다.