문제사이트 : Reversing.kr
문제이름 : CSHARP
링크 : http://reversing.kr/challenge.php
풀이
↑프로그램을 실행해 보니 딱봐도 내가 싫어하는 C#문제가 보인다. 내용은 간단하게 비밀번호를 알아내면 되는 문제이다. 이상하게도 구글에는 풀이가 거의다 잠겨있어서 나도 전체를 다 풀이하진 않을것이다. 그래도 도움이 많이 될 듯싶다.
↑분석을 위해 NET Reflector로 열어보았다. 몇몇 수상한 코드들이 보였지만 나는 C#을 잘모르기때문에 핵심만 찾아보았다. 그중 수상한 "MetMett"라는 함수가 보였는데 이상하게도 열리지않았다.
↑그러던 중 .ctor에서 수상한 코드를 발견했다. MetMett를 암, 복호화 시키는 듯한 코드였다.
검색을 해보니 ctor은 메인함수가 실행되기 전에 가장 먼저 실행되는 부분이라고 한다.
즉 프로그램을 실행하면 암호화되어있는 MetMett부분을 이 코드로 복호화시켜준다는 말이다.
↑IDA로 분석해 본 결과 이 부분들이 암호화된 MetMett 였다.
간단하게 C언어로 복호화코드를 만들었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <stdio.h> void main(){ int arr[] = { 0x02, 0x8D, 0x68, 0x1E, 0x0B, 0x3F, 0xDE, 0xFF, 0xFF, 0xFF, 0x01, 0x15, 0x17, 0x9B, 0x02, 0x15, 0x90, 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0x60, 0x1E, 0x49, 0x2D, 0x03, 0x01, 0x15, 0x16, 0x9B, 0x02, 0x18, 0x90, 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0x60, 0x1E, 0x45, 0x2D, 0x03, 0x01, 0x15, 0x16, 0x9B, 0x02, 0x16, 0x90, 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0x60, 0x1E, 0x56, 0x2D, 0x03, 0x01, 0x15, 0x16, 0x9B, 0x02, 0x17, 0x90, 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0x60, 0x1E, 0x4C, 0x2D, 0x03, 0x01, 0x15, 0x16, 0x9B, 0x02, 0x1E, 0x0A, 0x90, 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0x60, 0x1E, 0x2B, 0x2D, 0x03, 0x01, 0x15, 0x16, 0x9B, 0x02, 0x1D, 0x90, 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0x60, 0x1F, 0xF0, 0xFF, 0xFF, 0xFF, 0x2D, 0x03, 0x01, 0x15, 0x16, 0x9B, 0x02, 0x19, 0x90, 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0x60, 0x1E, 0x1C, 0x2D, 0x03, 0x01, 0x15, 0x16, 0x9B, 0x02, 0x1A, 0x90, 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0x60, 0x1E, 0x30, 0x2D, 0x03, 0x01, 0x15, 0x16, 0x9B, 0x02, 0x1E, 0x08, 0x90, 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0x60, 0x1F, 0xE1, 0xFF, 0xFF, 0xFF, 0x2D, 0x03, 0x01, 0x15, 0x16, 0x9B, 0x02, 0x1C, 0x90, 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0x60, 0x1F, 0xED, 0xFF, 0xFF, 0xFF, 0x2D, 0x03, 0x01, 0x15, 0x16, 0x9B, 0x02, 0x1E, 0x09, 0x90, 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0x60, 0x1F, 0xA2, 0xFF, 0xFF, 0xFF, 0x2D, 0x03, 0x01, 0x15, 0x16, 0x9B, 0x02, 0x1B, 0x90, 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0x60, 0x1E, 0x74, 0x2D, 0x03, 0x01, 0x15, 0x16, 0x9B, 0x29 ,0x00 }; int num = 0; int sum = 0; for (int i = 0; arr[i] != 0x00; i++) { arr[i] += 1; arr[i] &= 0xFF; sum += arr[i]; sum &= 0xFF; num++; } arr[18] = (sum - 38) & 0xFF; arr[35] = (sum - 3) & 0xFF; arr[52] = (sum ^ 39) & 0xFF; arr[69] = (sum - 21) & 0xFF; arr[87] = (71 - sum) & 0xFF; arr[124] = (sum ^ 114) & 0xFF; arr[141] = (sum ^ 80) & 0xFF; arr[159] = (235 - sum) & 0xFF; arr[179] = (106 + sum) & 0xFF; arr[200] = (36 - sum) & 0xFF; arr[220] = (sum - 3) & 0xFF; for (int i = 0; i < num; i++) printf("%02X ", arr[i]); } | cs |
↑그 후 헥스에디터로 복호화 된 값을 패치하고 분석툴로 다시열어보자 MetMett 부분이 보였다.
자세한 사항들은 더 적지 않겠지만, 이곳이 비밀번호를 체크하는 부분이다.
이 코드를 분석하여 비밀번호를 알아내었다.
'Reversing > WriteUp' 카테고리의 다른 글
[Plaid CTF] zipper (0) | 2017.04.30 |
---|---|
[2017codgate] RamG (0) | 2017.03.03 |
[Reversing.kr] Ransomware (0) | 2017.02.21 |
[Reversing.kr] Replace (0) | 2017.02.21 |
[2017codegate] BabyMISC (0) | 2017.02.17 |