기초 악성 코드 분석 1
1. 악성 코드
1.1 악성 코드란
- 악성코드(Malware)는 "악의적인 소프트웨어"의 줄임말로, 사용자나 시스템에 피해를 주기 위해 만들어진 프로그램 또는 코드
1.2 악성 코드 종류별 특징
종류 | 설명 | 특징 | 예시 |
바이러스 | 다른 파일에 붙어서 감염 | 실행 파일에 숨겨짐, 사용자 실행 필요 | 매크로 바이러스, File Infector |
웜 (Worm) | 네트워크를 통해 스스로 복제 | 사용자 개입 없이 전파, 네트워크 과부하 유발 | 이메일 웜, Conficker |
트로이 목마 | 정상 프로그램으로 위장 | 백도어 설치, 시스템 제어 탈취 | 게임 핵, 가짜 백신 프로그램 |
랜섬웨어 | 파일을 암호화해 금전 요구 | 데이터 인질화, 암호화폐로 몸값 요구 | WannaCry, LockBit |
스파이웨어 | 사용자 정보 몰래 수집 | 키로깅, 웹 히스토리 수집, 계정 정보 탈취 | 키로거, 트래커 |
애드웨어 | 광고를 과도하게 표시 | 팝업 광고, 브라우저 리디렉션, 성능 저하 | 무료 앱에 포함된 광고 코드 |
루트킷 | 시스템에 깊숙이 숨음 | 관리자 권한 획득, 보안 탐지 회피 | 운영체제 커널에 숨겨짐 |
봇넷 | 감염된 다수의 PC 원격 제어 | DDoS 공격, 스팸 발송, 불법 채굴 등에 사용 | Mirai, Zeus |
1.3 악성 코드 별 대응 방식
종류 | 유포 방식 | 탐지 방법 | 대응 전략 |
바이러스 | 감염된 파일 첨부, USB 등 저장매체 | 백신 프로그램 정기 검사, 파일 무결성 검사 | 백신 최신 유지, 출처 불분명한 파일 실행 금지 |
웜 (Worm) | 이메일, 네트워크 공유, 취약한 포트 | 네트워크 트래픽 모니터링, IDS/IPS(침입 탐지/방지 시스템) | OS/소프트웨어 최신 패치 적용, 방화벽 설정 |
트로이 목마 | 정식 프로그램 위장, 피싱 사이트, 다운로드 유도 | 동작 이상 징후 감지, 행동 기반 탐지(HIPS), 샌드박스 분석 | 신뢰된 출처에서만 설치, 의심 파일 격리 실행 |
랜섬웨어 | 이메일 첨부파일, 취약한 RDP, 크랙툴, 악성 웹사이트 | 파일 암호화 시도 탐지, 행위 기반 탐지, 의심스러운 파일 모니터링 | 정기 백업, RDP 차단, 메일 첨부파일 주의 |
스파이웨어 | 무료 소프트웨어, 악성 광고, 피싱 링크 | 키로깅 탐지, 네트워크 이상 트래픽 탐지, 스파이웨어 전용 스캐너 | 스파이웨어 차단 툴 사용, 브라우저 보안 설정 강화 |
애드웨어 | 프리웨어 번들 설치, 악성 웹사이트 광고 | 팝업 감지, 광고 생성 프로세스 분석 | 광고 차단 프로그램 사용, 프리웨어 설치 시 커스텀 옵션 선택 |
루트킷 | 시스템 커널 악용, 드라이버 위장, 트로이 목마에 포함 | 루트킷 탐지 전용 도구, 커널 무결성 검사 | 안전모드 검사, 클린 설치, 관리자 권한 보호 |
봇넷 | 웜·트로이 목마 등으로 감염 후 C&C 서버와 연결 | 비정상 포트 사용 감시, DNS 요청 분석, 통신 패턴 탐지 | 포트 차단, C&C 서버 차단, 감염 시스템 격리 및 복구 |
2. 컴퓨터 구조
2.1 레지스터 (Registers)
종류 | 설명 | 예시 |
범용 레지스터 | 데이터 처리용. 산술/논리 연산에 사용됨 | EAX, EBX, ECX, EDX (x86), RAX (x64) |
포인터 레지스터 | 메모리 주소 처리 | ESI/EDI (source/destination), ESP (stack pointer), EBP (base pointer) |
명령 포인터 (IP/RIP) | 현재 실행 중인 명령어 주소 | EIP (x86), RIP (x64) |
플래그 레지스터 | 연산 결과 상태 저장 (carry, zero 등) | EFLAGS |
레지스터 변경 여부 추적은 코드 흐름 분석, 악성코드 행위 추정에 중요함.
2.2 메모리 구조 (Memory Layout)
영역 | 설명 |
Text (Code) | 실행할 명령어 저장. 읽기 전용. |
Data | 초기화된 전역/정적 변수 |
BSS | 초기화되지 않은 전역/정적 변수 |
Heap | 동적 메모리 할당 영역 (malloc, new 등) |
Stack | 함수 호출 시 지역 변수, 리턴 주소 저장 |
악성코드는 종종 Stack을 오염시키거나, Heap에 셸코드를 적재해서 공격함.
2.3 스택 구조 (Call Stack)
- 후입선출(LIFO) 구조
- 함수 호출 시:
- 리턴 주소
- 이전 EBP
- 함수 인자
- 지역 변수 순서로 쌓임
- 함수가 끝나면 ret 명령어로 스택에서 리턴 주소 복원
악성코드는 스택을 조작해서 리턴 주소를 바꾸는 ROP/JOP 기법을 사용할 수 있음.
2.4 명령어 실행 흐름
- 명령어 페치 → 디코드 → 실행
- EIP/RIP은 현재 실행 중인 명령어 주소를 가리킴
- 흐름 변경 명령: jmp, call, ret, je, jne, loop
코드 흐름을 분석하면 악성코드의 "조건부 실행"이나 "우회 로직"을 파악할 수 있음
2.5 인터럽트 & 시스템 콜
- 인터럽트 (int): 하드웨어/소프트웨어 요청으로 CPU가 처리 루틴 전환
- 시스템 콜: OS 기능 요청 (int 0x80, syscall 등)
악성코드는 시스템 호출을 통해 파일 열기, 네트워크 연결, 프로세스 생성 등 행위를 함
2.6 명령어 세트 (ISA)
- x86, x64 구조가 주로 사용됨
- 각 명령어는 opcode + 피연산자 구조
mov eax, 0x1 ; EAX에 값 1 저장
add eax, ebx ; EAX = EAX + EBX
push eax ; 스택에 EAX 저장
call 0x401000 ; 0x401000 위치 함수 호출
명령어 해석 능력은 IDA, Ghidra, x64dbg에서 필수
2.7 엔디안 (Endian)
방식 | 설명 |
Little Endian | LSB (하위 바이트)를 먼저 저장 (x86/x64 대부분) |
Big Endian | MSB (상위 바이트)를 먼저 저장 |
예시: 0x12345678
- Little Endian: 78 56 34 12
- Big Endian: 12 34 56 78
파일 분석 시 바이트 순서에 따라 결과가 달라질 수 있으니 주의!
2.8 메모리 주소 체계
주소 방식 | 설명 |
가상 주소 | 프로그램이 보는 주소. OS에 의해 매핑됨 |
물리 주소 | 실제 하드웨어 메모리 위치 |
상대 주소 (RVA) | 베이스 주소 + 오프셋 (파일 분석 시 자주 사용) |
악성 PE 파일 분석 시 RVA → 실제 위치 매핑이 필요