본문 바로가기

[Wargame Write-up]/CodeEngn Challenges

[CodeEngn Challenges] Advance RCE 07

 

Password의 일부를 알아내는 문제라서 쉬울 줄 알았다.

 

확인해보니 32bit, 64bit 운영체제에서 Serial이 다르게 발생한다. (저 XXXXXXXX는 동일하지만)

 

우선 폼의 형태는 다음과 같다.

 

 

 

패킹 여부를 알아보기 위해 PEiD로 봤더니, 무려 C#으로 짠 프로그램이다.

 

 

 

Jetbrains dotPeek이라는 툴을 이용하면 아래처럼 깔끔하게 C# 코드를 뽑아낼 수 있다.

 

아래의 button1_Click 메서드는 Check 버튼을 눌렀을 때 활성화되는 것이다.

 

큰 흐름을 분석해보자면

 

우선 길이 체크를 한다. Name은 6~27자 이내, Serial은 26자이어야 하며, 9번째, 18번째 문자는 '-'이어야 한다.

 

이후 3번의 반복문을 통해 '-'을 기준으로 나눠지는 문자열 3개를 각각 str1, str2, str3에 넣고 16진수로 변환한다.

 

그것을 각각 uint32_1, uint32_2, uint32_3에 넣는다.

 

그리고 textbox1 즉, name을 통해 hashCode를 생성하고, yreee 배열에 uint32_1과 uint32_2를 번갈아가며 2번씩 넣는다.

 

마지막으로 vxzzz 메서드의 결과, yreee[2](=uint32_1)와 hashCode, yreee[3](=uint32_2)와 num1를 비교하여 분기시킨다.

 

hashCode를 생성할 때 쓰이는 GetHashCode()의 결과가 32bit, 64bit에 따라 다르기 때문에 각각 Serial이 달라진다.

 

 

 

마지막 성공, 실패 분기에 사용되므로 아래의 vxzzz 메서드를 분석할 필요성이 생긴다.

 

위에서 사용한 파라미터를 보고 흐름을 읽다보면 답이 나온다.