셸코드

정의
셸코드(shellcode)는 컴퓨터 시스템의 취약점을 이용하여 메모리 상에 삽입·실행되는 작은 규모의 기계어 코드 조각을 말한다. 주로 악성 코드·해킹 툴에서 공격 페이로드(payload)의 형태로 사용되며, 삽입된 뒤에는 시스템 명령 해석기(“쉘”)를 실행하거나 특정 작업을 수행하도록 설계된다.

개요
셸코드는 메모리 주소가 고정되지 않은 위치 독립형(position‑independent) 코드를 목표로 하며, 버퍼 오버플로우, 포맷 스트링 취약점 등 다양한 메모리 손상 기법을 통해 목표 프로세스에 주입된다. 삽입된 셸코드는 일반적으로 다음과 같은 흐름을 따른다.

  1. 취약점이 트리거되어 셸코드가 메모리로 복사된다.
  2. 제어 흐름이 셸코드가 저장된 주소로 전환된다.
  3. 셸코드가 실행돼 시스템 쉘을 호출하거나 네트워크 연결을 설정하는 등 공격자가 의도한 동작을 수행한다.

셀코드가 실행되는 환경에 따라 32비트 x86, 64비트 x86‑64, ARM 등 다양한 아키텍처용으로 작성될 수 있다. 또한, 문자열 검사, 메모리 보호 기법 등을 회피하기 위해 인코딩(예: XOR, Base64) 및 디코딩 루틴이 포함되는 경우가 있다.

어원/유래
‘셸코드’라는 용어는 영문 “shell code”에서 차용된 것으로, ‘shell’은 운영 체제에서 사용자 명령을 해석하고 실행하는 인터프리터(예: Bash, cmd)를 의미한다. 초기 보안 연구자들이 취약점 이용 후 시스템 쉘을 얻는 코드를 작성하면서 ‘쉘을 실행하는 코드’라는 의미로 ‘shell code’라는 표현을 사용했으며, 1990년대 초반부터 보안 커뮤니티와 악성코드 분석 분야에서 널리 쓰이기 시작했다. 정확한 최초 사용 시점과 용어가 고정된 시점은 여러 자료가 상이하므로, 구체적인 연도는 확인되지 않는다.

특징

특징 내용
크기 메모리 제한을 고려해 가능한 한 작게 설계된다. 일반적으로 수십 바이트에서 수백 바이트 수준이다.
위치 독립성 실행 시 메모리 주소에 의존하지 않도록 설계되어, 어느 주소에 로드되어도 정상 동작한다.
아키텍처 의존성 CPU 명령 집합(예: x86, ARM)마다 별도로 작성되어야 한다.
인코딩/디코딩 탐지를 회피하기 위해 XOR, ROT, Base64 등으로 인코딩된 뒤 실행 시 디코딩 루틴을 포함하기도 한다.
목적 시스템 쉘 획득, 원격 코드 실행, 권한 상승, 백도어 설치 등 다양한 악성 행위 수행을 목표로 한다.
전달 방법 버퍼 오버플로우, 힙 스프레이, 포맷 스트링 공격, 악성 파일 삽입 등 여러 취약점 이용 기법과 결합된다.

관련 항목

  • 버퍼 오버플로우: 메모리 버퍼의 경계를 초과해 데이터를 덮어쓰기함으로써 셈코드 실행을 유도하는 취약점.
  • 익스플로잇(Exploit): 취약점을 악용해 시스템에 비정상적인 동작을 일으키는 코드·방법론.
  • 페이로드(Payload): 익스플로잇이 성공했을 때 실행되는 주된 목적 코드, 셸코드는 흔히 사용되는 형태이다.
  • 코드 인젝션(Code Injection): 외부 코드를 대상 프로세스 메모리에 삽입해 실행시키는 공격 기법.
  • 디코더(Decoder): 인코딩된 셸코드를 실행 시 복호화·디코딩하는 부분.
  • 악성코드(Malware): 셸코드를 포함하거나 변형해 전파·실행되는 바이러스·트로이목 등.
  • ROP (Return‑Oriented Programming): 제어 흐름을 기존 코드 조각으로 재구성해 셸코드 없이도 임의 코드를 실행하는 기술, 셸코드와 대비되는 기법.

※ 위 내용은 공개된 보안 관련 문헌·전문가 자료를 기반으로 작성되었으며, 특정 최신 변형이나 비공개 연구에 대한 상세 내용은 포함되지 않을 수 있다.

둘러보기

더 찾아볼 만한 주제