[문제 다운로드]
문제에서 주는 as 파일을 Sublime Text에서 열어보면 ActionScript라고 나온다.
소스의 아랫부분으로 가보면 위와 같이 크기가 855인 배열의 내용을 순서 안가리고 채우는 것을 볼 수 있다.
추측하기로는 특정 데이터를 하드코딩한 것이라 생각하여 위와 같은 방식으로 C++언어로 직접 파일을 빼보았다.
위와 같은 데이터가 나온다. 60h부터는 생략했다.
그런데 소스코드를 잘 보면 위와 같은 2중 for문 구간이 있는데 내부 for문에서 특이한 일이 일어나고 있다. idx는 arrSwf의 처음부터 끝까지를 탐색하기 위해 쓰이는데 내부 for문의 시작조건이 그 idx의 mod(5)*4이다. 무슨 얘기냐 하면 저 for문은 데이터의 20바이트만큼을 참고한다는 뜻이다.
그래서 결론내리자면 윗 반복문은 암호화, 복호화가 일어나는 부분인데 20바이트 단위로 그것이 일어난다는 것이다.
좀 더 넓은 scope에서 바라보자면 위와 같이 FillData() 함수를 실행하여 만들어진 (하드코딩된) 데이터를 arrSwf에 집어넣고 그것을 복호화하는 것이 반복문의 기능이라고 할 수 있다.
하나 더 참고할 점은 para라는 변수인데, 암호화에 이용되는 key라고 생각하면 된다. 이 문제의 암호화 방식은 단순한 XOR이 아니라, key와 첫 20바이트를 XOR하여 암호화한 다음 그렇게 암호화된 20바이트를 다음 key로 이용하여 그 다음 20바이트와 XOR을 시키고 같은 방식으로 결과로 나오는 20바이트를 그 다음 20바이트를 암호화하는데에 쓰이는 key로 이용한다.
결론은 맨 처음 20바이트를 암호화/복호화하는데 쓰이는 key를 알면 나머지를 모두 풀 수 있다. 그런데 그 key를 어떻게 알 수 있는가?
친절하게도 위와 같은 주석으로 힌트를 남겨놓았다. 좀 알아보면 SWF파일의 헤더는 20바이트임을 알 수 있고, 위 주석에 있는 정보를 이용하면 헤더를 직접 만들 수 있다. 맥에선 SWF를 만드는 툴이 있는지 정수가 위 정보를 이용하여 아래와 같이 헤더 데이터를 만들어주었다.
위 헤더와 처음 암호화된 20바이트를 XOR하면 key를 알 수 있다!
처음에 나온 key는 위와 같았다. 저 상태는 리틀 엔디언 방식이라 4바이트 단위로 순서가 바뀌어있다. 빅 엔디언 방식으로 바꿔보면 아래와 같다.
Pelcomh HolyShield~!
뭔가 나오긴 했는데 맨 처음의 Pelcomh는 잘못 복호화된 것 같다. 실제로 헤더 정보 중 버전정보를 비롯하여 몇 가지 변수가 힌트로 주어지거나 하여 이 부분을 명확히 해줬어야 한다고 생각한다.
아무튼 적당히 말을 맞춰보면 아래와 같다.
Welcome HolyShield~!
미리 얘기하겠지만 이건 key가 아니다. 아래가 제대로 된 key이다. =..=;;
Welcome_HolyShield~!
공백 대신 언더바여야 한다~ 하하~~~
저걸 이용하여 복호화를 한 후 swf파일을 만드는 가장 간단한 방법은 우리에게 주어진 액션스크립트 코드를 재활용하는 것이다.
폰트가 Open Sans라서 ~가 -처럼 보이긴 한데 하이픈이 아니라 물결표를 넣어야한다 헤헤..
변수 para를 초기화하는 부분만 “Welcome_HolyShield~!”로 바꾸고 Intellij 등에서 컴파일하면 아래와 같이 flag를 보여주는 swf파일이 생긴다.
FLAG is HoN3