Ransomware

Broken output until the code page is fixed, then recovering the key the sample uses to encrypt and restore files.

2026.08.18 Reversing original post

cmd 에서 워게임을 실행시켜본다. 문자 인코딩 깨짐 문제 때문에 처음엔 읽을 수 없다. 이건 출력 문자열은 존재하지만 코드페이지가 틀려서 생기는 문제다. cmd 를 런하기 전 chcp 949 를 사용해 환경을 구성해준다.

Figure 1

해커는 패스워드를 갖고 있는 파일을 암호화하고, 키 값을 알아내면 파일을 정상화시킨다 한다. 일단 문자열 찾기를 통해 “Key:” 가 어디 있는지 찾는다.

어셈블리 코드를 분석해 보면, 프로그램은 크게 [키 입력 → 파일 읽기 → 복호화(XOR) → 파일 쓰기] 의 과정을 거친다. 우리가 찾아야 할 ‘Key’ 는 파일을 올바르게 복호화할 수 있는 문자열이다.

중요한 복호화 로직 (0044A8B6 ~ 0044A8F2)

이 부분이 키를 찾는 핵심 알고리즘이다. 파일의 각 바이트를 가져와서 다음과 같은 연산을 수행함.

0044A8B9 | movsx ecx, byte ptr ds:[edx+5415B8]  ; 파일에서 읽은 데이터
0044A8C5 | div   dword ptr ss:[ebp-C]           ; 파일 포인터를 키 길이로 나눔 (나머지 연산 준비)
0044A8C8 | movsx edx, byte ptr ds:[edx+44D370]  ; 입력한 Key에서 (인덱스 % 키길이) 위치의 문자
0044A8CF | xor   ecx, edx                       ; 1차 XOR: 데이터 ^ Key[i % len]
0044A8E9 | xor   edx, FF                        ; 2차 XOR: (1차 결과) ^ 0xFF

즉, 복호화 공식은 다음과 같다.

DecryptedByte = (OriginalByte ^ Key[i % len]) ^ 0xFF

이 문제의 “파일”은 랜섬웨어에 의해 암호화된 상태다. 파일이 정상적인 실행 파일(PE)이나 문서라면, 우리는 파일의 헤더(Magic Number)를 알고 있다. 그래서 암호화된 file 을 헥스 에디터로 열어 파일 형식을 확인한다. 그 이후 같은 곳에 run.exe 의 헥스값과 파일의 헥스값을 사용해 역산을 한다.

Key[i] = (EncryptedByte ^ 0xFF) ^ OriginalByte

Figure 2

그 후 헥스 에디터로 찾은 파일과 실행파일의 헥사값으로 연산을 하면 “letsplaythechess” 를 얻을 수 있다. 즉 키는 “letsplaychess” 다. 연산은 밑에서 연산식과 함께 한 문장이 나올 때까지 했다.

Figure 3

암호화된 ‘file’ 파일을 “letsplaychess” key 값으로 복호화한 결과 PE 실행 파일로 복호화되었으며, 해당 실행파일을 실행한 결과 문제의 Flag 값을 얻을 수 있었다.

Flag : Colle System