TigerDemon
5주차 APT 악성코드 사례 - Kimsuky APT 악성코드 본문
제 3 장 악성코드 상세 분석
제 6 절 Kimsuky APT 악성코드
2013년 9월경 카스퍼스키랩에서 "The 'Kimsuky' Operation: A North Korean APT?"라는 제목으로 처음 소개되었으며, 국내 주요 기관을 대상으로 APT 공격을 수행한다.
가. 정보 탈취
Windows API 함수를 사용하여 감염 PC의 시스템 정보를 탈취하고, 기본 키로거 악성코드에서 수집한 파일과 로그를 이메일 계저으로 정보를 전송하는 행위를 한다.

먼저 악성코드는 특정 루틴을 통해 문자열을 복호화하고, 감염 PC에 설치된 특정 백신 프로그램의 레지스트리에 접근해 "RunMode", "fwmode"를 수정하고, 윈도우 방화벽 레지스트리에 접근해 "EnableFirewall" 값을 수정하여 무력화한다.

위 코드 단계별 동작
1. 문자열 길이 계산 및 메모리 준비
-> 입력 문자열의 길이(v1)를 구하고, 그 길이만큼 버퍼(v3)를 동적 할당
-> memset으로 0으로 초기화
v1 = strlen(a1) + 1;
v3 = malloc(v1 - 1);
memset(v3, 0, 4 * ((v1 - 1) >> 2));
2. 입력 문자열 한 글자씩 읽기
-> 입력 문자열을 하나씩 읽다가 '\0'(널 문자) 만나면 종료.
-> v7은 카운터처럼 작동하지만, 음수 상태로 시작해서 루프 제어용
v6 = a1;
v7 = -1;
do {
if (!v7) break;
v8 = *v6++ = 0;
--v7;
} while (v8);
3. 주요 복호화 계산 부분
-> ~v7로 비트를 반전시켜 문자 개수를 기반으로 처리.
-> 입력 문자열에서 일정 블록(4 * v9)을 v3로 복사.
-> 즉, 입력을 4바이트 단위로 재배열하는 단계.
v9 = ~v7;
v10 = v9;
v11 = &v6[-v9];
v9 >>= 2;
memcpy(v3, v11, 4 * v9);
4. XOR 루프 (실제 복호화)
-> 각 바이트마다 0x99로 XOR 수행.
-> 즉, 진짜 복호화 연산은 ^ 0x99!
if (v2 > 0)
{
do
*(v3 + v14++) ^= 0x99u;
while (v14 < v2);
}

주요 함수 설명
| WordDecrypt_sub_1000264B | 문자열 복호화 함수 (^ 0x99 연산 등 수행) |
| RegCreateKeyExA | 레지스트리 경로 생성 (또는 열기) |
| RegOpenKeyExA | 이미 존재하는 키 열기 |
| RegSetValueExA | 해당 키에 값 쓰기 |
| RegCloseKey | 키 닫기 |
위 코드 블록별 동작
1. 첫번째 블록
v1 = WordDecrypt_sub_1000264B(&unk_1000E0F8); // "SOFTWARE\\AhnLab\\V3IS2007\\InternetSec"
if (!RegCreateKeyExA(-2147483646, v1, 0, 0, 0, 983103, 0, &v8, &v10))
{
v2 = WordDecrypt_sub_1000264B(&unk_1000E0F8); // "FWRunMode"
if (!RegOpenKeyExA(-2147483646, v1, 0, 131078, &v8))
{
v3 = WordDecrypt_sub_1000264B(&unk_1000E0EC);
if (RegSetValueExA(v8, v2, 0, 4, &v9, 4))
v9 = 0;
}
RegCloseKey(v8);
}
1. "SOFTWARE\\AhnLab\\V3IS2007\\InternetSec" 경로 오픈
2. 그 안의 "FWRunMode" 값을 복호화 후
3. RegSetValueExA()로 레지스트리 값 설정
-> 즉, 안랩 V3 인터넷 시큐리티 설정값을 변조하는 코드
2. 두번째 블록
v4 = WordDecrypt_sub_1000264B(&unk_1000E0D0); // "SOFTWARE\\AhnLab\\V3IS80\\Wis"
if (!RegCreateKeyExA(-2147483646, v4, 0, 0, 0, 983103, 0, &v8, &v10))
{
v5 = WordDecrypt_sub_1000264B(&unk_1000E0E0);
if (!RegOpenKeyExA(-2147483646, v4, 0, 131078, &v8))
{
v6 = WordDecrypt_sub_1000264B(&unk_1000E0C8); // "fwmode"
if (RegSetValueExA(v8, v6, 0, 4, &v9, 4))
v9 = 0;
}
}
1. "SOFTWARE\\AhnLab\\V3IS80\\Wis" 레지스트리 키 오픈
2. "fwmode" 값 설정
-> 다른 버전의 V3 (AhnLab V3 IS 8.0) 설정값을 변경하려는 코드

코드 설명
1. 레지스트리 경로 및 값 이름 준비(난독화 해제)
strcpy와 sub_10002640 함수를 사용하여 난독화된 문자열을 복호화하고 버퍼에 복사
방화벽 활성화 : strcp(v5, sub_10002640(&unk_1000E154));
복호화된 문자열 : EnableFirewall
2. 방화벽 설정 값 준비
if ( a1 == 1 )로 외부 입력 변수 a1이 1인지 확인
3. 레지스트리 조작 (값 설정)
HKEY_LOCAL_MACHINE (HKLM) 키에 접근하여 실제 방화벽 설정을 변경
- RegOpenKeyExA(-2147483646, v7, 0, 983103, &v3[1])
- -2147483646은 **HKEY_LOCAL_MACHINE (HKLM)**을 나타내는 상수
- RegOpenKeyExA는 키를 열고, 성공하면 핸들(&v3[1])을 반환
- RegSetValueExA(&v3[1], v5, 0, 4, &v4, 4)
- EnableFirewall 값에 데이터를 설정
- &v3[1] (키 핸들)에
- v5 (복호화된 EnableFirewall 값 이름)을
- 4 (REG_DWORD 타입)으로 설정
- &v4가 포인팅하는 값(대부분 0 또는 1)이 실제 레지스트리에 기록
- RegCloseKey(&v3[1]) : 키 핸들을 닫음
Windows API함수 GetComputerNameA()와 GetUserNameA()로 컴퓨터 이름과 사용자 이름을 수집하고, 기존에 설치된 악성코드에서 수집한 정 보를 하나의 파일에 저장한다.


위 코드 핵심 함수 설명
WordDecrypt_sub_10002640() 또는 sub_10002640()
- 코드에 직접 노출되는 것을 피하기 위해 암호화되거나 난독화된 문자열을 **복호화(Decrypt)**하여 실제 사용할 수 있는 레지스트리 키 이름, 값 이름, 파일 경로 등을 반환
strcpy(), memcpy(), memset()
- strcpy(): 복호화된 문자열을 변수(버퍼)에 복사합니다.
- memcpy(): 메모리 블록을 복사합니다 (데이터 준비 및 로그 마커 복사에 사용).
- memset(): 메모리 블록을 특정 값(주로 0)으로 초기화합니다 (버퍼 정리 및 데이터 정렬에 사용).
하나의 파일에 수집된 정보를 저장하고, “Microsoft Enhanced Cryptographic Provider v1.0"를 이용해 암호화한다.

공격자는 메일서버를 이용해 특정 계정에 로그인하고, 수신자 메일을 지정하여 암호화된 파일을 전송한다.

나. 키로거
Windows API 함수를 사용하여 키보드나 마우스로 입력되는 값을 수집하는 행위를 한다.
GetAsyncKeyState(), GetForegroundWindow(), GetWindowTextA() 함수 를 사용하여 입력된 키보드의 가상키 값과 시스템의 최상위 윈도우 프로 그램, 제목 표시줄의 문자열을 수집한다.




다. 원격제어
TeamViewer 프로그램을 변조한 것으로 공격자 는 감염 PC에 원격제어 행위를 수행한다.


2. 분석 결과
가. 이메일 주소
Kimsuky APT 악성코드에서 사용하는 이메일 주소는 아래 표와 같다. 악성코드에 감염된 PC는 해당 이메일 주소를 통해 수집된 정보 전송하거나 추가 파일을 다운로드 한다.

나. 악성코드 통계
Kimsuky APT 악성코드 샘플 38개 중 14개의 샘플이 정보탈취(37%), 8 개의 샘플이 드롭퍼(21%)이며, 각각 4개씩 키로거(10%), 원격제어(11%), 파일실행(11%), 각각 2개의 샘플이 다운로더(5%), 리소스 파일(5%)이며, 전체 악성코드 유형의 통계는 (그림 3-77)이다.

'2025-SWLUG > 악성코드 스터디' 카테고리의 다른 글
| 6주차 APT 악성코드 사례 - 라이브리(LIveRe) 유포 악성코드 (0) | 2025.11.05 |
|---|---|
| 5주차 APT 악성코드 사례 - IceFog (0) | 2025.10.26 |
| 4주차 문서형 악성코드사례 - 한글 문서 취약점 악성코드 (0) | 2025.09.30 |
| 3주차 DDoS 악성코드사례② - 6.25 사이버테러 (0) | 2025.09.23 |
| 3주차 DDoS 악성코드사례② - 3.20 사이버 테러 (0) | 2025.09.23 |