Name이 CodeEngn일 때 Serial은 28BF522F-A5BE61D1-XXXXXXXX이다.
XXXXXXXX를 구하시오.
파일을 실행시켜보았더니 name과 serial을 입력하는 칸이 있고
Codeengn에 주어진 시리얼 + 12345678을 입력하고 check를 눌렀는데 아무 일도 일어나지 않았다.
Exeinfo로 확인해보았다.
보니. NET파일이라고 한다.
Dnspy를 이용하여 분석해보았다.
파일을 열어서 확인해보니 windowsformsapplcation2 부분에 form1이라는 영역이 있어서 확인해보았더니 button1_click이라는 부분이 있길래 일단 해당 부분으로 이동해보았다.
위의 코드를 대충 분석해보았다.
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를 하고 있는데
즉, 우리가 구해야 하는 시리얼의 마지막 영역 값과 hashcode를xor 해서 다시 num3에 저장하고 있다.
그 후에 yreee라는 배열에 num과 num2를 번갈아가며 담아준다.
이제 아래의 성공 flag가 출력되게 하기 위해서는 그전에 if문을 통과해야 하는데 그때 vxzzz라는 함수의 리턴 값으로 나온 flag를 사용해서 결과가 나오는 것 같았다.
Vxzzz의 인자로는 yreee 배열, ewrrr배열, 2415796773(0x8ffe2225), num3가 들어간다.
vxzzz 함수로 들어가서 확인해보았다.
맨 윗줄부터 보았다.
일단 인자를 4개를 가지고 왔고, 미리 말하자면 pgdsfa가 위에서 본 0xffe2225라는 값이고, fsfsdf가 num3을 의미한다.
해당 부분에 bp를 걸고 실행하다 보면 그림 7의 위치에서 pgdsfa에 0xffe2225라는 값이 들어가는 것을 볼 수 있다.
여기서 한번 정리를 하면
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이 나온다,,,
이게 맞나 확인해보려면 그것도 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 |