제 4회 해킹방어대회 문제4번 풀이

동명대학교 Think

최 영 남

문제 : 쉬어가는 페이지이다. 게임을 즐기며 취약점을 찾아라.

(플래쉬) 점수를 10000000점 이상 획득하시면 게임에 성공, -500점이면 게임에 실패합니다.

본 문제는 쉬어가는 문제가 아님을 위의 화면을 봄으로서 직감적으로 알 수 있을것이다.

풀이 : 다운로드받은 swf화일과 클래스가 만들어진 액션스크립트 화일을 이용한 string값 전송

우선 위 게임을 50점씩 긁어모아(그나마 해골을 획득하면 저축해둔 점수도 까먹으면서 미끌어진다.) 천만점의 점수를 얻기는 시간이 너무 촉박하므로 swf파일을 로컬 퍼스컴으로 다운로드받아 디컴파일 한 후 점수체계의 일부를 수정하고, 천만점의 점수에 도달했을 때 클래스에 포함된 encryption을 이용하여 해당 서버로 strings값을 전송할 수 있도록 하자.

1단계 : 우선 swf파일을 다운로드받는다.

swf 파일을 서버에서 바로 디컴파일 작업할수는 없으므로 개인의 퍼스컴으로 다운로드 받아야 한다. 필자는 본 파일을 다운로드 받기 위해서 해당 swf파일을 링크한 별도의 html을 만들어 활용하였다.

만들게 될 html 파일의 코드는 다음과 같다.

<html>

<body>

<a href="http://125.143.183.27/stage4/game.swf">다운로드</a>

</body>

</html>

다운로드 라는 링크를 마우스 오른쪽버튼으로 클릭하면 다음과 같은 메뉴가 나온다.

우리는 □다른이름으로 대상 저장□ 메뉴를 선택하도록 하자.

저장을 할 위치를 지정해주면 swf파일은 모두 다운로드 받아진 것이다.

2단계 : 다운로드받은 swf파일을 디컴파일(실행형태의 swf파일을 편집가능한 fla형태 파일로 변환) 하자.

swf 파일은 다운로드 받았지만 우리는 (설령 Macromedia Flash가 설치되어 있다 하더라도) 이 파일을 실행하는것 외에는 할수 있는것이 없다. 즉, 출판된 플래시 형태의 파일로는 굉장히 무기력한 자신을 발견하게 되는것이다. 우리는 본 파일을 편집가능한 fla 파일로 변환하여야 한다.

상용 혹은 공개용 플래시 디컴파일러는 인터넷을 찾아보면 지천으로 찾아볼 수 있으니 구할 수 있는 방법은 본 풀이에서 설명하지 않는다. 단, 필자는 본 플래시 파일을 디컴파일 하기위해 Sothink SWF Decompiler를 이용했다는것을 밝힌다.

<Sothink SWF Decompiler의 실행화면>

Sothink SWF Decompiler를 이용하면 SWF파일을 쉽게 FLA 파일로 디컴파일 할 수 있다. 디컴파일을 하기 위해 화면의 우측에 보이는 Resources 탭에 있는 game.swf 항목의 왼쪽의 체크박스를 클릭한다. 체크박스를 클릭하여 game.swf 파일이 선택되었다면 화면 상단 좌측의 Export FLA 버튼이 활성화 될것이다.

FLA 확장자를 가진 편집가능한 플래시 파일로 디컴파일했다면 이 디컴파일 된 파일을 플래시에서 편집해야 한다. 우리가 집중적으로 공략하여 편집하여야 할 부분은 □점수처리□에 관련된 부분이다.

3단계 : 편집 가능한 플래시 파일의 점수처리에 관련한 부분을 수정하여 천만점에 빨리 도달하도록 하자.

<플래시 MX 2004를 이용하여 디컴파일된 FLA 파일을 불러왔다.>

편집가능한 FLA 파일에서 점수처리와 관련한 부분은 틀림없이 액션스크립트에 존재하고 있다. 액션스크립트창을 열어보자.(액션스크립트창을 열지 않더라도 무비클립으로 지정된 심볼내에 위치한 Playing 프레임의 액션 레이어를 보면 점수처리와 관련된 액션스크립트가 작성되어 있다.)

액션스크립트에서 우리가 공략해야할 부분은 점수처리에 관련한 부분이다. Symbol41의 Action Layer: Frame 10을 참조하면 점수처리와 관련한 액션스크립트가 작성되어 있다.

필자는 천만점에 빨리 도달하도록 만들기 위하여 본 액션스크립트의 61번줄(□score = score + 50;□ 을 □score = score + 2000000;□)과 73번줄(□score = score - 100;□ 을 □score = score + 2000000;□)을 수정하였다. 즉, 컴퓨터를 획득하든, 해골을 획득하든 개당 2백만점을 얻어 5개만 획득하면 게임이 끝나도록 하는 구조로 수정한 것이다.

수정을 하였다면 해당 소스를 다른이름으로 저장하고 Pulish하여 Test를 해 보자.

만일, 정상적으로 액션스크립트가 수정되었다면 오른쪽 화면과 같이 성공메시지를 볼 수 있을 것이다. 하지만 우리가 원하는 것은 이것이 아니라 다음 단계로 넘어가는 패스워드를 원하는 것이다. 따라서, 액션스크립트 코드에 숨겨져 있을 다른 무언가를 찾아야 한다.

4단계 : 메서드를 전송할 URL의 수정과 클래스가 저장된 액션스크립트 화일을 다운로드받자.

위 화면에서 보듯이 심볼 41의 Action Layer:Frame20에 입력되어있는 액션스크립트를 살펴보면 GetURL 메쏘드를 사용하는걸 볼 수 있다. 플래시 액션스크립트의 getURL 메쏘드는 URL을 호출하는 메쏘드이므로 저 부분이 상대주소로 입력되므로써 Publish된 SWF화일과 같은 디렉토리에 있는 php파일을 찾는것을 알 수 있다.

따라서 getURL("http://125.143.183.27/stage4/vIcT0rySo0re.php?score=" + myScore, "") 이렇게 수정해야 할 것이다.

여기서 또 유심히 봐야할 부분은 해당 액션스크립트 라인 1번의 □var mycrypt = new libcrypt();□ 코드이다. 해당 코드는 현재의 플래시 파일에서 외부 클래스를 사용하는것으로 봐야 한다. 플래시에서의 외부 클래스는 일반적으로 액션스크립트파일(as 확장자)을 참조한다. - 주의! 외부 액션스크립트 파일에 입력된 클래스를 호출하여 사용하는것은 액션스크립트 2.0에 제한된다. 만일, 내부 클래스를 이용하는 플래시 파일이 있다면 그것은 액션스크립트 1.0을 이용하는 것이므로 본 풀이법과 차이를 보이게 될 것이다.

외부 클래스를 호출하여 사용하는것을 알게되었다면 클래스가 저장된 액션스크립트파일은 어떻게 구해야 할 것인가. 보통 클래스파일의 경우 swf 파일과 같은 위치에 저장하거나 □http://swf파일.url/classes/□의 경로에 위치하는것이 일반적이다. 또한, 해당 액션스크립트파일의 이름과 확장자는 반드시 □클래스이름.as'가 되어야 하므로 우리가 유추해볼 수 있는 파일명은 libcrypt.as 파일이 된다. 이 파일은 다행스럽게도 swf와 같은 위치에 저장되어 있었다.

as 파일의 URL은 □http://125.143.183.27/stage4/libcrypt.as□이므로 다운로드 받자.

다운로드 받을때 반드시 편집가능한 플래시파일(FLA파일), 퍼블리시된 플래시파일(SWF파일)이 저장된 곳과 같은 위치에 다운로드 받도록 하자.

모든 것이 완료되었다면 이제 최종적으로 파일을 퍼블리시하여 테스트해 볼 차례다.

5단계 : SWF파일로 퍼블리시 하면서 클래스를 지정하자.

마지막 단계다. 플래시에서 클래스를 지정하였다면 무비를 퍼블리시 하는것 보다는 Export를 이용하여 외부 액션스크립트 파일패스를 지정하는것이 유리할 것이다.

플래시의 파일 -> Export -> Export Movie 메뉴를 선택하자.

어떤 파일로 저장할 것인지 물어보는 대화상자가 나타날 것이다. 적당한 이름을 써주고 저장한다.

저장한다는 버튼을 누르고 나면 다음 대화상자가 나타난다.

우리가 주의해야 할 부분은 왼쪽의 붉은색으로 표시된 부분이다.

우리는 swf파일을 퍼블리시 하면서 외부 클래스를 이용해야 함으로 액션스크립트 버젼을 ActionScript 2.0으로 바꾸도록 하자. ActionScript 2.0 항목으로 바꾸면 Settings 버튼이 활성화 될 것이다.

Settings 버튼을 누르면 ActionScript Settings 창이 보일것이다. 여기서 우리가 변경해야 할 부분은 Classpath 부분이다. □+□ 버튼을 누르면 클래스가 선언된 액션스크립트 파일의 위치를 정할 수 있다. 우리는 swf, fla 파일과 같은 위치에 as 파일을 저장해 놓았으므로 상대주소 □.□을 입력하자.

ActionScript Settings 창에서 OK버튼을 이용해 빠져나오고 Export Flash Player 창을 마찬가지로 OK 버튼을 이용해 확인하였다면 최종적으로 클래스가 포함된 swf 화일이 퍼블리시 되었을 것이다.

가벼운 마음으로 테스트 해 보자.

이제 컴퓨터든 해골이든 5개만 획득을 하면 위와같이 아름다운 결과물을 맛보게 될 것이다.

수고하셨습니다.