본문 바로가기

0x00 /0x03 Challenge

- Codegate 2013 예선 - Misc 200

# 문제 : 82d3fdd1f294d8397f1966a3a2f207f0.7z 압축파일 제공
            압축을 풀어보니, 2가지 파일이 존재 ( encoded.key  ,  source.php )





[ 그림 1 ] source.php

- source.php 파일의 소스코드인데, 문자열을 해당 코드의 알고리즘을 이용하여 인코딩하는 내용이라는 것을 파악했다.







[ 그림 2 ] encoded.key

- encoded.key 파일을 열어봤더니, 엄청 많은 양의 문자가 인코딩되어 있었다.





# 앞의 2개의 파일을 확인해 본 결과, 우선 인코딩 원리를 파악하고, 디코딩 코드를 작성하여 인코딩된 문자들을
  디코딩하여 원래의 문자들을 확인해봐 할 것 같다.



# 인코딩 알고리즘 분석

- 우선 인코딩하는 부분의 코드를 살펴보면 인코딩할 문자열에서 PHP의 ord 함수를 이용하여 한 문자의 아스키코드 값을 읽어온다.
  그리고, 변수 $var1, $var2, $var3 을 이용하여 조건에 따라 인코딩한다.

- 결론적으로 다른 문자로 인코딩하는 부분은 $var2의 값이 13보다 클 때 해당한다.
  이 부분을 데이터를 가져와서 버퍼같은 곳에 넣는다고 생각할 때, 14bit 이상 데이터가 찼을 때 하위 13bit의 데이터를 가지고
  2개의 문자로 인코딩하는 방식이라고 분석을 했다. ($var2의 값을 읽어온 데이터가 저장된 버퍼의 크기라고 가정 했음)




[ 그림 3 ] 인코딩 알고리즘 (ABCD 문자열 인코딩 과정)






# 인코딩 알고리즘을 따라 직접 "ABCD"라는 문자열을 인코딩하면서, 알게 된 부분


- $var2 이라는 변수는 $var1 변수의 Bit 수만큼 수시로 재설정 된다는 점

- $var3 이라는 변수는 인코딩을 하기 위한 키값 같은 것으로 사용된다는 점 ($var3의 크기는 13Bit로 고정되어있다는 점)

- 그리고 for문 아래의 마지막에 있는 if 문은 문자열을 다읽어온 후 남아 있는 데이터를 버리지 않고, 마지막 까지 인코딩하는 것에 사용하기 
  위한 조건문이라는 점




# 이제 디코딩 함수를 만들어서 인코딩된 문자들을 디코딩해보도록 하자.

- 디코딩이란 것이 인코딩된 것을 원래의 상태로 복원하는 것인데, 인코딩 알고리즘을 분석한 결과를 가지고, 디코딩 함수를 작성 할 수
   있었다.

- 처음에 알고리즘 분석을 하지 않고, 무작정 디코딩 함수를 만들다가 많은 시행착오를 거쳤다.






# 디코딩 알고리즘

- 우선 인코딩은 특정 조건이 만족할 시 ($var2 값이 13초과할 시) 2개의 문자로 인코딩한다. 
  우리에게 제공된 encoded.key 파일에 있는 인코딩된 문자들을 2글자씩 가져와서, $var3의 값을 역으로 찾아낼 수 있다.

- 인코딩된 2개의 문자에서 첫 번째 문자는  [ $var3 % 91 ] 연산을 통하여 구한 나머지 값으로 인코딩 소스의 배열에 인덱스 값으로 인코딩
   했다.

-             〃                두 번째 문자는  [ $var3 /  91 ] 연산을 통하여 구한 몫의 값으로 인코딩 소스의 배열에 인덱스 값으로 인코딩 했다.
 
   위의 2가지 특징을 가지고, $var3 값을 쉽게 구할 수 있다.

- 나머지 부분들은 인코딩하는 특징들을 이용하여 반대로 구현하였다.







[ 그림 4 ] 인코딩 함수 작성

- 주의해야할 부분은 $var3의 최대 크기를 고려하여 코딩하는 부분이였다.
- $var3이 가질 수 있는 최대값은 8280 이다. 나머지값이 90이며, 몫이 90인 경우.
   이때의 $var3 값 = 90 + (90 * 91) = 8280 (14Bit)





# 작성한 디코딩 함수를 이용하여 encoded.key 파일에 저장된 인코딩 문자들을 디코딩해보도록 하자.






[ 그림 5 ] 인코딩된 문자들을 디코딩한 결과

- 디코딩한 문자들을 echo로 뿌려주었는데, 이런 모양이 나왔다. 실제론 너무 연하게 나와서, 이미지 파일을 조금 보정한 화면이다.








[ 그림 6 ] 페이지 소스 보기를 통한 실제 디코딩된 문자들

- 실제로 인코딩한 문자들을 찍은 모습이다.






# 참고 페이지