본문 바로가기

Work Log/As Cybersecurity Consultant

[악성코드] 쉘코드


악성코드를 단말에 감염시키기 위해서 다양한 취약점을 사용하는데요, 버퍼 오버플로우와 같은 취약점을 통하여 실행되는 쉘코드에 대해서 정리를 해봅니다.


개요


* 쉘코드는 

- 버퍼 오버플로우 공격에 사용되는 기계어 코드로, 공격자는 작성한 쉘코드를 공격 대상 호스트의 메모리에 삽입하고 EIP(다음에 실행 할 명령이 들어있는 메모리의 번지를 가지는 레지스터, Instruction Pointer)를 조작하여 시스템의 제어 흐름을 가로챌 수 있다.


* 배경

- 버퍼 오버플로우는 1988년 최초의 웜인 모리스 웜(morris worm)에 의해 사용되었음

- 2011 CWE/SANS Top 25 Most Dangerous Software Errors에서 3위를 기록

- CVE Details에 따르면 현재도 빈번하게 발생되고 있음 (DoS, Code Execution에 이어 3번째)


* 버퍼 오버플로우 취약점을 사용한 공격

- 해당 공격에 영향을 받는 취약점(코드의 실행흐름이 변경될 수 있는 소프트웨어의 결함)이 목표 시스템에 존재할 때 익스플로잇(취약점을사용해 공격하는 특정 공격 패턴) 코드를 로컬 또는 원격에서 전송시키는 방식으로 이루어짐

- 버퍼 오버플로우를 발생시킨 후 의도한 명령을 실행시키기 위해서 쉘코드를 사용



관련 연구


* 정적 분석

- 쉘코드가 보이는 특정 패턴을 탐지, 0x90(NOP Sled), "/bin/sh" 문자열, 시스템 콜 패턴 

- Snort 같은 IDS에서 널리 사용

- Obfuscation(난독화)를 통하여 우회

- 통계기반 탐지: 데이터 마이닝을 통하여 해당 프로세스가 받는 정상적인 입력의 바이트 분포를 학습 후 바이트 분포에서 벗어나면 탐지, 오탐문제, 오버헤드가 큼


* 동적 분석

- 에뮬레이션: 가상의 CPU나 레지스터로 구성된 가상 환경을 구성, 타겟 프로세스로 가는 입력 값을 가로채어 미리 실행한 후 판단, 런타임 정보를 알 수 없어서 정확한 분기를 예측하지 못하는 한계, 최근엔 타겟 프로세스의 가상 메모리를 덤프하여 사용하여 해결

- 프로그램이 사용하는 가상메모리의 주소범위가 제한되어 있는데, 해당 범위를 넘어서는 주소를 참조하는 경우를 분석하여 탐지


* 쉘코드 제작을 어렵게

- ASR(Address Space Randomization): 가상 주소 공간을 프로세스가 생성될 때 마다 랜덤하게 할당하여 복귀 주소를 알기 어렵게 만드는 방법.

- 입력값 제한: 0x00부터 0xFF까지 모든 값이 사용하는 문자열은 아니므로 이 외의 값을 차단하는 일종의 Whitelist 방식


* 쉘코드가 타겟 프로세스에서 메모리에 쓰이거나 실행되는 것을 어렵게

- Stack Guard: 컴파일 단계에서 RET 앞에 랜덤 값을 삽입하여 무결성 검사

- Stack Shield:

-  DEP(Data Execution Prevention): 특정 영역에 실행권한 자체를 없애는 것

- ISR(Instruction Set Randomization): Instruction Set을 랜덤하게