[기초] NX bit/ DEP 와 ASLR은 무엇인가?

2019. 2. 21. 12:43System Hacking/System Hacking Knowledge & Techniques

안녕하세요!

오늘은 메모리 보호기법중 

NX bit/ DEP와 ASLR을 알아 볼게요!


근데 그전에 이러한 보호기법이 왜 나왔는지부터

보고 가도록 할게요!


버퍼오버플로우 공부할 때

가장 기본적인 exploit 방법은


1) 버퍼의 크기를 가늠한다(얼마나 할당했는지)

2) 버퍼에서 RET ADDR까지의 거리를 계산한다

3) 버퍼~EBP(RET ADDR 바로 직전)까지 데이터를 채운다

※여기서 데이터= 쉘코드+ 다른 문자들(aaaa..........)

4) 그리고 RET ADDR에는 쉘코드가 위치한 주소를 적는다!


예를 들어 아래와 같이 스택이 있다고 가정해보면!


32 bit기준

[버퍼 252byte]

[Dummy 4byte]

[EBP 4byte]

[RET ADDR 4byte]


그럼 위 순서대로 진행을 하면

버퍼의 시작에서 RET ADDR까지 260byte이니

260만큼 데이터를 채워야 하는데


쉘코드가 25byte인 놈을 쓴다고 하면

235byte를 아무 문자로 채우면 됩니다


쉘코드(25)+아무 문자(235) =260byte

그리고 ret주소에는 쉘코드가 적혀있는 주소를 주면 됩니다!

shell code가 0xbffffed0에서 시작한다고 가정해볼게요!


그럼 260byte를 위에 처럼 넣고 그 뒤에 4byte는 \xd0\xfe\xff\xbf를

이렇게 little-endian으로  RET ADDR에 넣으면 

일반적인 버퍼오버플로우 exploit code가 완성됩니다!


근데 이렇게 해서 풀리는 문제는

많지 않습니다!


왜냐하면 이러한 문제점들을 깨닫고

많은 보호 기법들이 이미 적용되어 있거든요!


먼저 NX bit/DEP 부터 설명하자면,

데이터 영역에서 코드 실행권한을 빼앗는겁니다!


(NX=Never eXecute)

(DEP= Data Execution Prevention)


※ 아 참! 스택영역만 

해당되는 건 아니에요!

힙(heap) 영역도 포함되요!


저희가 위에서 0xbffffed0에 쉘코드가 담겨있길래

그쪽으로 RET ADDR 주소를 주었죠? 

거기로 Return하면 shell code를 만나서 실행시키니까요!


이렇듯 메모리에서 코드 실행이 되지 못하게

막는 것을 NX bit라고 하는 거에요!

그렇게 되면, 쉘코드를 실행하지 않고

프로그램에 대한 예외 처리를 한 후에 

종료가 됩니다!


결과적으로 쉘코드를 아무리 넣어도

실행이 안되니 무쓸모겠죠? 


다음으로 ASLR 보호기법을 설명해 드리겠습니다

 (ASLR=Address Space Layout Randomization)


제가 이것 때문에 FTZ 11번에서 고생하고 있는데요!

쉽게 설명 드리자면 메모리에 대한 공격을

어렵게 하려고 스택, 힙, 라이브러리 주소등을

프로그램 실행때 마다 바꿔주는 거에요!


위에서 제가 RET ADDR에 0xbffffed0를 넣었었죠?

왜냐하면 Shell code가 저 메모리 주소에 저장되었으니까요!

근데 ASLR이 걸리면 제가 다시 이 프로그램을

exploit 하려고 실행시키면......


Shell Code는 더 이상 0xbffffed0에 위치하지 않게 됩니다!

gdb로 까서 디버깅 해보면 0xbfffda86 뭐 이렇게

랜덤하게 바뀌어 있습니다!

다시 실행해서 까보면 다른 주소로 

또 바뀌어 있겠죠?


이렇게 두 가지 메모리 보호기법들을 알아보았는데요!

이러한 보호기법들도 옛날에 나온 것들이라

이 보호 기법들을 우회하는 방법들도 존재해요!


그건 다음에 설명하도록 하겠습니다!

감사합니다!