728x90

 

Heap spary 공격이란 악의적인 코드나 데이터를 메모리의 힙 영역에 대량으로 뿌려넣는 방식으로 취약점을 악용해 악성코드를 실행하도록 유도하는 공격 기법이다.

보통 브라우저나 애플리케이션의 메모리 취약점, 특히 Use-After-Free, Buffer Overflow 또는 메모리 주소 제어와 관련된 취약점을 악용할 때 사용된다.

 

  • Heap : 프로그램이 실행 중에 동적으로 할당하는 메모리 공간. 일반적으로 malloc, new 같은 함수로 요청
  • Spray  : 메모리 공간에 같은 데이터를 반복적으로 퍼붓는 행위
  • 목적 : 특정 위치에 악성 코드를 배치하여, 취약점 트리 시 해당코드가 실행되도록 함

 

공격단계별 설명

1. 공격 벡터 실행

  • 공격자는 일반적으로 웹 브라우저, PDF 뷰어, Flash, 또는 취약한 애플리케이션을 통해 공격 코드를 전달함. 자바스크립트같은 고수준 언어를 사용하여 힙에 데이터를 뿌림

2. 악성 페이로드 준비

  • 공격자는 Shellcode 또는 ROP(Ret2LibC 등) 체인을 포함한 악성코드를 작성하고 이를 메모리 여러 위치에 배치함. 이때, NOP 슬레드(NOP Sled)를 포함해 예측 가능성을 높임

3. Heap Spray

  • 동일한 데이터(예: Shell Code + NOP + Padding)를 대량으로 할당하여 힙의 여러 영역에 분산시킴. 이를 통해 프로그램 흐름이 어느 주소로 튀더라도 악성코드가 실행될 확률을 높임

4. 취약점 트리거

  • Use-After-Free, Buffer Overflow 등의 취약점을 유발하여 프로그램의 흐름이 공격자가 뿌린 힙 영역(악성코드가 위치한 주소)로 이동하도록 함

5. 악성코드 실행

  • 흐름이 옮겨진 후 NOP 슬레드를 통해 Shell Code에 도달하고, 이 Shell code 가 실행되면 시스템이 손상되거나 악성행위가 실행됨(ex. Reverse Shell , Backdoor)

 

Javascript를 사용한 Heap Spray 예시

var shellcode = unescape("%u9090%u9090...%uc931"); // NOP + Shellcode
var block = shellcode;

while (block.length < 0x10000) block += block; // 큰 블록 생성

var memory = [];
for (var i = 0; i < 500; i++) {
    memory[i] = block.substring(0, block.length); // 메모리에 대량 배치
}

 

 

Heap spray 방어 방법

방법 설명
ASLR(Address Space Layout Randomization) 메모리 주소를 매실행마다 무작위로 할당해 예측을 어렵게 함
DEP(Data Execution Prevention) 데이터 영역(힙, 스택 등) 의 코드실행을 차단
최신 브라우저/소프트웨어 사용 힙 스프레이 방지 기법이 포함된 최신 보안 기능
정적/동적 분석 도구 Heap Spray와 같은 공격을탐지하는 보안 솔루션 사용

 

728x90

+ Recent posts