본문 바로가기

Reversing/CodeEngn

[CodeEngn] Advance RCE L07풀이

https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 세미나, 워크숍을 현업 실무자들과 함께 운영하고 있는 비영리 커뮤니티입니다.

ch.codeengn.com


그림 1

Name CodeEngn Serial 28BF522F-A5BE61D1-XXXXXXXX이다.

XXXXXXXX 구하시오.

그림 2

파일을 실행시켜보았더니 name serial 입력하는 칸이 있고

Codeengn 주어진 시리얼 + 12345678 입력하고 check 눌렀는데 아무 일도 일어나지 않았다.

Exeinfo 확인해보았다.

그림 3

보니. NET파일이라고 한다.

Dnspy 이용하여 분석해보았다.

 파일을 열어서 확인해보니 windowsformsapplcation2 부분에 form1이라는 영역이 있어서 확인해보았더니 button1_click이라는 부분이 있길래 일단 해당 부분으로 이동해보았다.

그림 4
그림 5

위의 코드를 대충 분석해보았다.

 

Testbox1 name 들어가는 위치인 같고 길이가5 이상 하고

Testbox2 길이는 26이고 배열의 8,17번째에는 ‘-‘ 와야 그다음으로 진행할 있다.

Tesstbox2 serial 값이 들어가는 같다.

 

이어서 for문을 확인해보니 serial 0~7번째 배열까지는 text 저장, 이어서 num 저장하고

Serial 9~16번째 배열은 text2 저장, 이어서 num2 저장

마지막으로 serial 18~25번째 배열을 text3 저장, 이어서 num3 저장하고 있다.

Num4에는 name 값을 어떤 함수에 넣어서 나온 값을 저장하는 같다.

 

Serial = A-B-C라고 가정하고 정리해보면

 

Num = A / Num2 = B / Num3 = C / Num4 = 함수(name)

 

대충 이렇게 되는 같다.

그리고 이어서 보면 name값을 가지고 GetHashCode()라는 함수를 통해 해시값을 생성하고 결과를 hashcode라는 변수에 담고 있다.

 

그리고 num3 = num3 ^ hashcode 하고 있는데

, 우리가 구해야 하는 시리얼의 마지막 영역 값과 hashcodexor 해서 다시 num3 저장하고 있다.

 

후에 yreee라는 배열에 num num2 번갈아가며 담아준다.

 

이제 아래의 성공 flag 출력되게 하기 위해서는 그전에 if문을 통과해야 하는데 그때 vxzzz라는 함수의 리턴 값으로 나온 flag 사용해서 결과가 나오는 같았다.

 

Vxzzz 인자로는 yreee 배열, ewrrr배열, 2415796773(0x8ffe2225), num3 들어간다.

vxzzz 함수로 들어가서 확인해보았다.

그림 6

맨 윗줄부터 보았다.

일단 인자를 4개를 가지고 왔고, 미리 말하자면 pgdsfa가 위에서 본 0xffe2225라는 값이고, fsfsdf가 num3을 의미한다.

해당 부분에 bp를 걸고 실행하다 보면 그림 7의 위치에서 pgdsfa에 0xffe2225라는 값이 들어가는 것을 볼 수 있다.

 

그림 7

여기서 한번 정리를 하면

vxzzz라는 함수가 실행되었을 때 인자로

pgdsfa = 0xffe2225

fsfsdf(num3^hashcode) ( num3 = fsfsdf)

가 주어졌다.

 

이어서 vxzzz 함수의 윗부분에서

Psdsfg = psdsfa ^ fsfsdf

연산을 하고 있고

Num = (pgdsfa % 0x39) – 1을 하고 있다.

그 후 num4에 num을 저장한다.

 

일단 아랫부분까지 확인해보면 num 값이 0이면 false를 출력하고 num이 0이 아니어야 true를 출력한다고 한다.

그럼 while문을 잠깐 확인해보니 num4를 16, 8, 4로 나누고 있는데, 풀이를 보니까 그래서 num값이 16 혹은 32가 되어야 한다고 한다. (이거 왜이러는겨,,? gethashcode함수 때문에 그런 건가,,,? 잘 모르겠다,,)

(참고로 gethashcode 함수는 32bit와 64bit 환경에서 값이 다르게 나오는데 해당 문제에서는 32bit로 풀어야 한다고 한다.)

 

한번 정리를 하면

Psdsfg = (0x8ffe2225)^(fsfsdf^hashcode)가 되고

Num 값이 32라고 했을 때 pgdsga%0x39는 33이 되어야 한다고 한다.

 

그리고 나서 풀이에서는 messageboxshow로 hashcode 값을 확인하셨는데,,, 어떻게 하는지 모르겠다,,, 일단 0x9e1e73d5라고 한다…

 

그래서 값을 구하면 0x8ffe2225 ^ 0x9e1e73d5 ^ 33(0x21)을 해서 답이 11e051D1이 나온다,,,

그림 8

이게 맞나 확인해보려면 그것도 32BIT로 확인해야 하는데,,, PC 용량 때문에 32bit 가상 머신을 설치할 수가 없다,,, 일단 찾아보니까 요게 답은 맞다…

'Reversing > CodeEngn' 카테고리의 다른 글

[CodeEngn] Advance RCE L09풀이  (0) 2021.11.13
[CodeEngn] Advance RCE L08풀이  (2) 2021.11.13
[CodeEngn] Advance RCE L06풀이  (0) 2021.11.13
[CodeEngn] Advance RCE L05풀이  (0) 2021.11.13
[CodeEngn] Advance RCE L04풀이  (0) 2021.10.05