Reversing/WriteUp2017. 2. 21. 23:21

문제사이트 : 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[] = { 0x020x8D0x680x1E0x0B0x3F0xDE0xFF0xFF0xFF0x010x150x170x9B0x020x150x900x1F0x8F0xFF0xFF0xFF0x600x1E,  0x490x2D0x030x010x150x160x9B0x020x180x900x1F0x8F0xFF0xFF0xFF0x600x1E0x450x2D0x030x010x150x160x9B0x020x160x900x1F0x8F0xFF0xFF0xFF,  0x600x1E0x560x2D0x030x010x150x160x9B0x020x170x900x1F0x8F0xFF0xFF0xFF0x600x1E0x4C0x2D0x030x010x150x160x9B0x020x1E0x0A0x900x1F0x8F0xFF0xFF0xFF0x600x1E0x2B0x2D0x030x010x150x160x9B0x020x1D0x900x1F,  0x8F0xFF0xFF0xFF0x600x1F0xF00xFF0xFF0xFF0x2D0x030x010x150x160x9B0x020x190x900x1F0x8F0xFF0xFF0xFF0x600x1E0x1C0x2D0x030x010x150x16,  0x9B0x020x1A0x900x1F0x8F0xFF0xFF0xFF0x600x1E0x300x2D0x030x010x150x160x9B0x020x1E0x080x900x1F0x8F0xFF0xFF0xFF0x600x1F0xE10xFF0xFF,  0xFF0x2D0x030x010x150x160x9B0x020x1C0x900x1F0x8F0xFF0xFF0xFF0x60,  0x1F0xED0xFF0xFF0xFF0x2D0x030x010x150x160x9B0x020x1E0x090x900x1F0x8F0xFF0xFF0xFF0x600x1F0xA20xFF0xFF0xFF0x2D0x030x010x150x160x9B,  0x020x1B0x900x1F0x8F0xFF0xFF0xFF0x600x1E0x740x2D0x030x010x150x16,  0x9B0x29 ,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
Posted by BadSchool