NOP Sled
NOP는 No-OPeration의 약자로 즉 실행을 해도 실행할 명령어가 없기에 실행포인터가 다음 흐름으로 넘어간다고 생각하면 된다. 여기에 Sled(썰매)를 붙임으로써 고의적으로 실행흐름을 아래로 흘러 보내는 느낌으로 설명할 수 있다. 보통 Heap Spray 형태의 공격 코드들에는 반복구문과 NOP Sled를 많이 쓴다. 이유는 다음과 같다.
- 임의의 메모리를 참조하게 되면 해당 위치에 무조건 악의적인 행위를 실행 하는 코드가 있을 수만은 없다.
- 그래서 NOP Sled를 이용하여 참조한 위치에 악의적인 행위 코드가 없으면 자연스럽게 실행흐름을 타고 내려가
- 코드를 포함하고 있는 위치로 가게 되는 것이다. (참조라는 개념이 맞는지는 잘 모르겠다.)
[그림 1. NOP sled가 포함된 exploit중 하나]
위의 그림과 같이 "0x1C0C1C1C"는 NOP Sled이다. 만약 실행 시작지점이 Offset 1C111B90이라면 0x1C0C1C1C의 흐름을 따라 내려가 "두번째 셀코드"라는 부분에 도착 악의적인 행위를 하는 코드를 실행하게 되는 것이다. (0x0C1C1C1C가 아니냐는 궁금증이 있으면 빅-엔디안, 리틀-엔디안을 보면 이해할 수 있다.)
그렇다면 NOP Sled는 어떻게 형성이 되는 것일까?
[그림 2. 실제 취약점을 이용하여 악성코드를 유포하는 사이트의 코드]
위에서 보면 "nop = unescape("%u0B0B%u0B0B"); 라는 코드를 볼 수 있다. 이 코드가 메모리에 적재되면 NOP Sled의 역할을 하게 되는 것이다.
밑에서 두번째 소스코드를 보면 while구문을 볼 수 있을 것이다. NOP Sled코드와 악의적인 행위를 하는 코드와 합(nop+=nop;nop.substring(0,0x10000/2 - SC.length)부분)하여 반복 작업함으로써 그림1의 구조가 스택의 형태로 차곡차곡 메모리 영역에 들어가게 되는 것이다. (보통은 Heap영역에 많이 들어가고, 이를 Heap spray라고 부른다.)
이렇게 해서 해당 메모리의 어느 부분을 참조하더라도 NOP Sled에 의해 악의적인 행위를 하는 코드로 흘러갈 수 밖에 없는 구조가 형성이 된다. 그렇다면 "이 사이트는 악성코드를 유포하는가?"에 대한 질문을 답하기 위해서 패턴탐지 방식으로 NOP Sled의 형태들을 이용하는 것이 어떨까?
물론 NOP Sled는 악성코드 유포하는 다양한 방식중에서 아주 작은 방식일 뿐이기에 이 방법만 쓰겠다는 것은 아니다. 단지 탐지 방법중에 하나로 사용하는 것이 어떨까? 라는 의문만을 가지고 있다.
또한 실제 웹 개발자들은 NOP을 이용하여 개발하는 형태를 가지고 있는지 궁금하다. 웹 개발을 해본적이 없기 때문에 단순히 프로그래머의 입장에서 생각하면
NOP기능을 고의적으로 사용하여 프로그래밍 한다는 것은 매우 비효율적인 것 같다는 생각이 든다.
마지막으로 이 NOP Sled에 사용되는 NOP 코드 패턴들이 얼마나 다양할 것인가에 대한 답을 내리지 못한 상태이다. 무한정 만들 수 있는 코드라고 하면 패턴설정하기엔 너무 많은 구멍이 있을 것으로 생각을 한다.
'Information Security > Vulnerability' 카테고리의 다른 글
고스트 취약점 (CVE-2015-0235) 개요 및 대응방안 (0) | 2015.01.30 |
---|---|
About Java Exploit (0) | 2012.11.20 |
CVE-2012-4969 분석영상 (0) | 2012.11.16 |