컴퓨터 보안에서 NOP 슬라이드, NOP 슬레드, NOP 램프, 혹은 NOP 미끄럼틀은 NOP 명령어들을 나열시킨 바이너리 조각으로써, 프로그램이 NOP 슬라이드 안의 어느 메모리 주소부터 실행을 시작하든 CPU 명령어 실행 흐름(컨트롤)이 슬라이드 끝까지 미끄러져 내려오게 만든 것이다. 보통 NOP 슬라이드의 끝은 궁극적으로 실행시키고자 하는 명령어들의 시작점과 연결되어 있다.

이 기법은 소프트웨어 익스플로잇에서 흔히 사용되는데, 특히 분기 (혹은 호출) 명령어의 목적지가 되는 주소를 정확하게 알 수 없는 상황에서 특정 명령어들이 궁극적으로 실행될 수 있도록 만드는데 사용된다. 다른 유명한 애플리케이션으로는 EMC-aware 프로그래밍 같은 방어적 프로그래밍 전략이 있다.

비록 NOP 슬라이드가 기능적으로는 동작할 수 있다 하더라도, 이것이 단순 NOP 명령어가 나열된 방식으로 구성된다면 굉장히 의심스럽기 때문에 자동으로 탐지되기 쉽다. 따라서 실질적인 NOP 슬라이드들은 종종 비표준적인 NOP 명령어들 (가령 출처 레지스터와 목적지 레지스터가 같은 mov 명령 - 같은 데이터를 같은 곳으로 옮기는 것이므로 아무런 효력이 없다 - 혹은 레지스터에 0을 더하기)을 이용해 구성되거나, 더 식별하기 힘들게 만들기 위해 프로그램의 상태에 특별히 의미가 없는 영향을 주도록 설계되기도 한다.

NOP 슬라이드는 설치되는 곳에서 적용받는 제약 조건에 따라 그 복잡도가 다르다. 만약 특정 레지스터가 NOP 슬라이드가 설치될 위치에서 사용되지 않고 있는 것이 확실시 된다면[1], 이 레지스터를 아무렇게나 이용하는 어떤 종류의 인스트럭션이라도 NOP 슬라이드에서 사용하는 것이 가능하다. 더 나아가서, 만약 NOP 슬라이드의 바이트 정렬과 인스트럭션 포인터의 바이트 정렬이 모두 예측 가능한 상황이라면, 여러 바이트로 이루어진 인스트럭션을 이용해 NOP 슬라이드를 구성할 수도 있다.[2] 만약 NOP 슬라이드를 설치할 수 있도록 만들어주는 공격 통로가 (출력 가능한 ASCII 문자만을 받아들이는 식으로) 필터링을 수행하고 있다면, NOP 슬라이드에서 사용할 수 있는 인스트럭션의 범위가 제한될 수밖에 없다. 한편, 아키텍처 확장으로 추가된 명령어 (예: Intel의 SSE 확장)는 대다수가 실행 후에도 프로그램 상태에 영향을 주지 않기 때문에 NOP 슬라이드를 구성하는 데 사용될 수 있지만, (공격) 대상이 되는 컴퓨터가 해당 아키텍처 확장을 지원하지 않은 경우에는 사용할 수 없다.

같이 보기

편집

각주

편집
  1. 일정 구간 레지스터가 사용되지 않을 경우에는, 사용되지 않기 시작한 시점의 값을 저장해 두었다가 다음 사용되는 시점에 다시 저장해둔 값을 넣어주면 된다.
  2. 가령 NOP 슬라이드에 진입할 때의 인스트럭션 포인터가 항상 4의 배수가 되도록 할 수 있다면, 1 바이트 NOP 인스트럭션 뿐만 아니라 4 바이트 길이의 인스트럭션을 사용해서도 (시작 위치와 상관없이) 항상 적법한 인스트럭션이 수행되는 NOP 슬라이드를 구성할 수 있다.

외부 링크

편집