밍경송의 E.B

[사이버보안] 악성코드와 SW보안(2)- 악성코드 분석 본문

CSE/사이버보안개론

[사이버보안] 악성코드와 SW보안(2)- 악성코드 분석

m_gyxxmi 2024. 6. 11. 23:20

이 글은 2024-1 ㅇ화여대  (인실 도 교수님의)  사이버보안개론 수업자료를 참고하였음을 밝힙니다.

 

 

 

🖥️악성코드 분석 방법

 

 

1 코드 정적 분석(Static)

: 악성 코드를 실행하지 않고 분석

 

  • 정적 분석의 시작 
    • 실행 파일의 분석이 불가능하기 때문에, 실행 파일에서 소스를 역추출하여 분석을 시작함. 
    • 기계어나 어셈블리어와 같은 저급 언어로 소스 분석이 어려움
    • Disassemble의 대상이 되는 PE 포맷 파일(실행파일)로부터 소스를 추출 (대표적 ex : IDA Pro)

*PE 포맷 파일 : 주로 확장자가 .exe 또는 .dll 등인 실행파일

 

  • 정적 분석 도구 (무료 ex : OllyDbg, Immunity Debugger, WinDBG 등)를 사용하여 어셈블리어 소스에 실제로 악성 행위를 하는 코드가 포함되어 있는지 분석 
    • 의심되는 함수 호출, 의심되는 문자열 확인 등

 

그렇다면, 악성코드는 정적 분석 방법을 어떻게 회피하는가?

  • 패킹(Packing) 또는 난독화(Obfusscation)
    • 암호화나 압축을 통해 코드를 읽기 어렵게 만듦.

=>언패킹(Unpacking) 하여 분석하거나, 난독화된 메세지 자체를 분석해서 대응 가능.

 

+ 정적 분석을 위해서는 OS. 프로그래밍, 프로그래밍 언어, 분석 도구, 프로세스 모니터링 도구 등에 대한 지식이 필요함.

 

 


 

 

 

2 코드 동적 분석(Dynamic)

: 악성 코드를 직접 실행하여 해당 코드가 어떤 행위를 하는지를 관찰하여 판단하는 방법

 

  • 악성 코드가 실제로 실행될 수 있기 때문에 '통제된 환경'을 만드는 것이 필요함.
    • 문제 발생 시 실행 환경의 초기화가 가능한 환경 -> 가상머신을 많이 이용함. 
  • 프로세스 확인 : 작업관리자, GMER .. 등
    • 작업 관리자 : 현재 실행되는 프로세스를 확인할 수 있음.
      • 독특한 이름의 프로세스가 실행되고 있는 경우 검색해보기
      • 자원을 많이 소모하는 경우 의심해보기
      • 별도의 자식 프로세스를 만들어 이를 통해 악성 행위를 하는 경우도 있음.
  • Roolkit 탐지 tool : GMER 등
    • 루트킷(Roolkit)이란, 공격자가 심어놓은 프로그램을 숨기기 위한 목적으로 사용되는 프로그램
    • → SSDT 후킹 등의 기술을 이용하여 작업 관리자에서 악성 코드 프로세스가 보이지 않게 숨길 수 O
  • Process Explorer
    • 부모와 자식 프로세스의 관계가 잘 드러나는 도구로, 프로세스별로 어떤 파일을 열었는지, 어떤 모듈. 라이브러리를 사용하는지 등의 정보 제공
  • 등록된 시작 프로그램 확인(ex Autoruns 등)
    • OS를 재시작한 이후에도 다시 실행되는 악성 코드 존재. -> OS에 등록된 다른 프로그램이 있는지 확인
  • File, Registry 변경 내용 확인(ex Winalysis
    • 악성 코드는 기존 파일을 악의적으로 지우거나 변경. 혹은 새로 생성하기 때문에 변경내용 확인해보기
  • '' + Network의 활동 확인
    • Process Monitor : Process나 registry 관련 연산 수행 과정 + 네트워크 활동 보여줌
    • TCPView : 어떤 port를 열었는지, 외부 network 접속 등에 대한 모니터링 제공

Autoruns ex

 

 

 


 

 

 

🖥️악성코드 제거

 

기본

: 악성 코드 프로세스 종료 후 악성코드가 생성한 registry 값과 파일 등 삭제 

but 자기 보호로직이 강력한 경우. OS가 동작하지 않을 수 있기 때문에 제거 전에 백업이 필요함

 

 

안전 모드 부팅 후 삭제

: 악성 코드가 Roolkit 수준에서 프로세스 종료 방지나 파일변경 방지 기능이 있는 경우, 삭제가 불가함.

→ 안전 모드 부팅 후 악성 코드를 삭제하고 재부팅 

WHY? : 안전 모드로 부팅하면 대부분의 루트킷이 동작하지 않음.

 

다시.. roolkit이란? 공격자의 프로그램을 숨기기 위한 프로그램

 

 

 


 

🖥️SW 개발 보안(시큐어 코딩)

- 안전한 SW 개발을 위해 소스코드에서 보안 취약점을 제거 

why?

소스코드의 보안 취약점을 이용한 사이버 공격은 일반적인 보안 장비로 대응이 어렵기 때문

= 보안 장비들이 '정상'으로 인식함.

 

 

관련 공격 2가지에 대해 알아보겠숩다.

 

1 메모리 버퍼 오버플로 공격

: 프로그램이 실행되는 도중에 메모리 오류가 발생하여 의도치 않은 동작이 일어나는 보안 취약점

 

*개발자가 예상한 범위를 벗어난 입력값이 전달되는 경우 = 지정된 버퍼 크기보다 넘치게 저장하는 경우

 

**모리스 웜이 이 방식을 이용했다. 천재군..

 

-> 공격자가 이 결함을 발견한 경우, 전달하는 데이터의 길이와 내용을 조정해서 프로그램이 의도하지 않은 방식으로 실행되게 할 수 있음.

예를 들면, 중요한 역할(프로그램 흐름 제어 등)을 하는 시스템 메모리 영역으로 인증 없이 침범하도록 만드는 등의 작업을 수행 가능.

 

 

ex 버퍼 오버플로우가 발생한 C 소스코드 예

* buffer 크기를 10으로 고정했는데, 만약 사용자가 10자리 이상의 값을 넣는다면 오버플로우 발생

 

 

 

⭐대응방안

- 최신 OS 자체의 방어

- 어도비, 오피스 등의 보안 패치

- SECURE CODING :개발 단계에서부터 안전하게 코딩하기

how?

 

  1. 입력 값에 대한 길이(크기) 검증
  2. 오버플로에 안전한 라이브러리 사용 (strcpy → strcpy_s)
  3. 정적 소스 분석 도구로 미리 수정

 


 

 

2 포맷 스트링 공격

: 포맷 스트링(Format string)을 이용하여 프로그램의 특정 메모리 내용을 읽거나 쓰는 보안 공격 기법

*Format string : C 언어의 printf() 등의 함수에서 사용되는 문자열의 입출력 형태를 정의하는 문자열

-> printf 계열은 다 이 공격의 위험성을 내포함

 

 

EX) 포맷 스트링을 통해 메모리 주소 확인하기

 

*%s와 같이 포맷지정자가 필요함.

 

 

EX) 포맷 스트링을 통해 메모리 변조하기

*정수 변수의 주소를 어떤 변수에 저장하고, %n을 사용하여 그 값을 변조할 수 있음을 보여줌.

%n은 정수 변수의 주소를 전달받아 지금까지 출력된 문자(바이트) 수를 저장하는 역할을 함. 

printf("%d%n\n", value,&target); // %n이 target과 매치됨. -> 100(3자리) 니까 3 출력
printf("%16d%n\n", value,&target); //0000000...100이 value고 이게 16자리니까 16출력

 

 

 

⭐대응방안

- %n, %hn 가능한 사용 X

- 정적 분석을 통해 미리 위험요소 제거

- 최근 컴파일러는 포맷 스트링에 대한 자체적인 검사 내장

 

 

 

추가로 운영체제 수업때도 다뤘던 Race condition에 대해서도 간략하게 언급함.

 

+ 경쟁 조건 (Race condition)

: 여러 개의 프로세스 혹은 스레드가 공유하는 자원에 대해 동시에 접근하려는 상태

⭐대응방안

- 동기화 구문 사용 : 한 번에 하나의 프로세스만접근하도록. (but 성능 감소가 발생하기 때문에 최소화하여 사용)