[Reversing.kr] CSHOP

#REVERSING

Reversing.kr의 CSHOP 문제풀이


Reversing.krCSHOP 문제인데 배점도 120점으로 쉬운 문제이나 교훈이 있는 문제이다.

프로그램을 처음 실행하면 GUI창이 뜨는데 아무것도 안보인다.

main

우선 본격적인 분석에 앞서 ExeinfoPE로 열어보면 아래와 같이 해당 프로그램이 .NET프로그램인 것을 알 수 있다.

exeinfoPE

.NETC#을 보자마자 든 생각은 '그냥 디컴파일 시키면 되겠는데?' 이다.

dotpeek으로 해당 프로그램을 열면 소스코드가 모조리 보인다.

그 중에서 가장 눈에 띄는 것은 Button Click 컨트롤이다.

이유는 이 프로그램을 실행했을 때 버튼은 보이지 않았는데 버튼 클릭 컨트롤 소스가 존재한다.

button_click_source

보이지는 않지만 저 버튼을 클릭하면 화면 속 라벨 텍스트가 바뀌어서 Flag가 보일 것이다.

근데 변수들의 이름이 다 똑같아서 당황스러울 수 있지만 사실 똑같지 않다.

var

변수 이름 끝에 공백처럼 보이는 공간이 있다. 해당 부분을 복사해서 메모장에 일일이 붙여넣기 하면 다음과 같다.

\u007F\u0014  = W
\u007F\u000A = 5
\u007F\u000D = 4
\u007F\u0011 = R
\u007F\u0003 = E
\u007F\u0019 = 6
\u007F\u0015 = M
\uFFFD\u0014 = I
\u007F\u000A = P
\u007F\u0002 = S
\uFFFD\u0014 = P
\u007F\u0015 = 6
\u007F\u0001 = S

유니코드에서 텍스트로 표현되지 않는 제어문자들을 이용해서 마치 변수들의 이름이 다 같은 것처럼 만들었다.

그리고 소스코드를 좀 아래로 내리다 보면 Text들의 위치를 지정하는 부분이 나온다.

location

Point의 좌표를 보면 y좌표는 모두 같고 x좌표만 오름차순으로 점점 증가한다.

즉, 저 변수들의 순서가 화면에 표시될 Flag 문자들의 순서인 것이다.

위 사진속 빨간 박스를 보면 여전히 공백처럼 보이는 부분을 순서대로 복사해서 위의 변수들과 대입하면

\u007F\u000A  = P
\u007F\u000D = 4
\u007F\u0014 = W
\u007F\u0015 = 6
\u007F\u0011 = R
\uFFFD\u0014 = P
\u007F\u0019 = 6
\u007F\u0001 = S
\u007F\u0003 = E
\u007F\u0002 = S

이렇게 Flag가 쉽게 구해진다. 위 변수 선언에서 변수 이름이 중복되는 것들이 몇개있는데 그때는 그냥 나중에 선언된 변수를 기준으로 보면 된다.

문제를 풀고 다른사람들의 풀이를 보니깐 버튼사이즈를 크게 만들어서 버튼이 실제로 클릭이 되도록 문제를 많이 풀었던데

일단 dotpeek은 소스 수정이 안된다. 소스 수정해서 실행하려면 Reflexil을 따로 설치해야 되는 것 같은데 더 귀찮은 거 같다.

이 문제는 그냥 쉽다. 그러나 교훈이 있다.

  • C#으로 GUI를 만들고, 내부 로직은 C++로 짜자.
  • C#으로 내부 로직 구현하지 말자. 소스 쉽게 털린다.