Reversing/WriteUp

[Reversing.kr] Ransomware

BadSchool 2017. 2. 21. 02:18

문제사이트 : Reversing.kr

문제이름 : Ransomware

링크 : http://reversing.kr/challenge.php


풀이


↑프로그램을 실행 한 화면이다. 어떤 더덩넘이 파일을 암호화시키고 5천억 달러를 벌려고 한다. 정말 나쁜놈 인듯 싶다. Key를 입력하면 파일이 복구되지만 잘못되면 더 꼬인다고 한다.
일단 우리의 올리디버거로 확인을 해보자.

참고로 이 파일은 UPX로 패킹되어 있다. 어떤 문제던 풀기 전에 패킹여부 확인은 필수이다.



↑분석을 해보니 파란색으로 하이라이트 한 부분에서 내가 입력한 키값을 순서대로 한글자씩 불러오고, 암호화 된 파일의 바이너리값도 가져와서 XOR연산을 한 뒤 0xFF로 또한번 XOR연산 해준다.

즉 순서대로 보면 

파일 ^ 입력값 ^ 0xFF



↑여기서 중요한 힌트가 하나 있는데, 바로 암호화 된 파일이 EXE파일 이라는 것이다. 그뜻인 즉 파일헤더 부분이 보통 EXE파일과 같다는 것. 이를 통해 코드를 짜 볼 수 있다.



↑file 의 한줄과 일반exe파일의 한줄을 가져와서 코드를 짰다. 코드자체에서도 불러올 수 있겠지만 미숙한 관계로..


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
void main()
{
    int arr[] = { 0xDE ,0xC0 ,0x1B ,0x8C ,0x8C ,0x93 ,0x9E ,0x86 ,0x98 ,0x97 ,0x9A ,0x8C ,0x73 ,0x6C ,0x9A ,0x8B };
    int arr2[] = { 0x4D0x5A , 0x90 , 0x00 , 0x03 , 0x00 , 0x00 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0xFF , 0xFF , 0x00 , 0x00 };
    int result[16= { NULL };
    int xor = 0;
    for (int i = 0; i < 16; i++)
        arr[i] = arr[i] ^ 0xFF;
 
    for (int i = 0; i < 16; i++)
    {
        for (int j = 1; ; j++)
        {
            xor = arr[i] ^ j;
            if (arr2[i] == xor)
            {
                printf("%c", j);
                break;
            }
        }
    }
    printf("\n");
}
cs

↑코드 실행 결과. letsplaychess까지 출력되고 다시 반복되는 듯 하다.



↑아까 구해낸 키값을 입력하여 복호화 시켰다.

참고로 복호화 된 exe파일도 UPX로 패킹되어 있다. 가볍게 언패킹 시키고 툴로보니 답이 바로 나왔다.



↑답 : Colle System.