Reversing.Kr - CSHOP (Reversing, 120pts)
이번 문제의 제목을 보아하니 C#과 관련된 문제일 듯이다. 우선 문제 파일을 받는 것부터 시작하자. 압축파일 형태로 제공되는데, 압축을 풀면 CSHOP.exe 파일 하나만 나온다. 해당 파일이 C#으로 작성되었는지 확인하기 위해 Detect it Easy를 사용하였다.
위 [그림 1]을 보면 이 파일은 .NET Framework로 개발된 것을 알 수 있다. 그리고 닷넷 프로그램은 당연히 C#으로 작성된다.
리버싱에 들어가기 전에, 우선 실행을 해보자. 해당 파일을 실행하면, 아래 [그림 2]과 같은 화면을 볼 수 있다.
실행을 해보니, 보다시피 아무 것도 없는 창 하나가 뜰 뿐이었다. 이전에 풀었던 ImagePrc처럼 그림을 그릴 수 있는 것도 아니었고, 그냥 아무런 입력도 받지 않은 빈 창이었다.
실행 화면만 보아서는 CSHOP.exe이 뭘 하는 것인지 잘 모르겠다. 이제 리버싱을 해야 할 차례다. 기존에 주구장창 분석했던 C/C++ 프로그램들과는 달리 C#으로 쓰인 프로그램은 디컴파일링이 쉬운 편(?)이다.
물론 C/C++도 내가 즐겨 사용하는 기드라나 Hex-rays 같은 걸 쓸 수도 있지만, 기드라는 아직 부족한 부분이 많고 Hex-rays는 성능은 확실하지만 나같은 학생은 엄두도 못낼 정도의 비싼 가격을 자랑한다.
반면에 C#의 대표적인 디컴파일러들(ILSpy, dotPeek, .NET Reflector 등)은 기본적으로 무료인 데다가, 디컴파일의 퀄리티 또한 매우 훌륭하다. 소스 코드를 거의 그대로 복원해주는 정도이다보니 C# 프로그램을 분석하는 데 있어 상당한 이점을 제공한다.
아무튼, 나는 dotPeek을 사용하여 해당 파일을 분석해보았다.
이 프로그램의 Main 함수는 단 세 줄로 매우 간결하다. 여기서 중요한 부분은 마지막 줄에서 FrmMain() 함수를 실행하는 부분이다. Main 함수에서는 이제 더 볼게 없으니 FrmMain()으로 넘어가보자.
FrmMain()의 길이는 Main()과는 달리 상당히 긴 편이다. 다만 중요하다고 생각되는 부분은 위 [그림 4]에서 나타난 부분 정도만 보면 될 듯 하다.
우선 _Click() 함수를 보면 다수의 문자들이 나열되어 있는 것을 확인할 수 있다. 이렇게 보이는 문자들을 순서대로 나열하면 “W54RE6MIPSP6S”인데, 이것은 당연하게도(?) 플래그가 아니었다. 당연히 이것만 보고서 문제가 풀리게 두었을리는 없다. 단순히 낚시일 수도 있고 문자들의 순서를 바꾸어야 플래그가 되는 것일 수도 있다.
아무튼 그 밑으로 내려가면 InitializeComponent() 함수가 나오는데, 해당 함수에서 버튼을 하나 생성하고, 해당 버튼을 클릭하면 _Click() 함수가 실행되는 것을 확인할 수 있다. 그런데 버튼의 크기가 (0, 0)으로 되어있다.
그 이후로도 살펴보면 label들의 이름, 사이즈 등을 설정해주고 마지막에 Form1_Load() 함수로 출력을 해주는 형태인 듯 한데.. 내가 C#을 정확히 모르다보니 설명하기가 쉽지 않다.
다만 확실히 말할 수 있는 것은 이 문제를 풀기 위해서는 크기가 0으로 생성된 버튼을 클릭해야 한다는 것이다. 그렇다면 크기가 0이어서 보이지도 않는 버튼을 어떻게 클릭할 것인가?
우선 코드를 수정해서 버튼의 크기를 충분히 눈에 보일 정도로 키우는 방법이 있을 것이다. 하지만 나는 다른 방법을 사용하였다. 이 방법은 굳이 코드를 수정할 필요 없이 간단하게 버튼을 클릭할 수 있다.
[그림 5]에서 버튼에 부여된 TabIndex 값이 0임을 알 수 있다. TabIndex는 해당 객체가 Focus 되는 순위 내지 우선순위를 나타내는데, 해당 값은 0에서부터 시작한다. 즉, TabIndex가 0인 객체는 프로그램 실행 시 기본적으로 Focus 되는 객체인 것이다.
따라서 이 프로그램에서 버튼이 기본적으로 Focus된 객체이므로, 눈에는 보이지 않아도 해당 버튼이 Focus된 상태라고 할 수 있다. 해당 상태의 버튼은 마우스 클릭을 하지 않아도 ‘Enter’ 키를 누르면 클릭한 것과 같은 기능을 한다.
결과적으로, 이 프로그램의 버튼을 누르려면 그냥 프로그램을 열고 ‘Enter’ 키를 치면 된다.
그럼 아래 [그림 7]과 같이 글자들이 나열되는 것을 볼 수 있는데, 순서대로 나열하면 플래그가 된다. 해당 값을 reversing.kr에 가서 입력하면 120점을 얻을 수 있다.
다음부터는 프로그램을 실행해볼 때 엔터키도 쳐보면서 풀어봐야겠다.