본문 바로가기

System (Pwnable)

NX 및 ASLR 우회방안 - PLT GOT 설명

반응형

NX

NX(No-eXecute)

- 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리

- 코드에 쓰기권한 있는 경우 : 임의 코드 입력, Return to Shellcode 등이 가능함

- CPU가 NX를 지원해야 함.

- NX를 인텔은 XD(eXecute Disable) , AMD는 NX, 윈도우는 DEP(Data Execution Prevention) ,

  ARM에서는 XN(eXecute Never) 라고 칭하고 있습니다. 명칭만 다를 뿐 모두 비슷한 보호 기법입니다.

 

 

ASLR(Address Space Layout Randomization)

- 바이너리가 실행될 때마다 스택, 힙, 공유 lib 등을 임의의 주소에 할당하는 보호기법

- 이제 buf의 주소를 구하는 것이 선행되어야 함

 

Library

- libc에서 puts을 탐색, puts의 정의가 있는 libc에서 puts의 코드를 찾아서 실행

- 동적링크(Dynamic Link): 바이너리 실행 시, 동적lib가 프로세스의 메모리에 매핑

                         매핑된 라이브러리에서 호출할 함수의 주소를 찾고, 그 함수를 실행

- 정적링크(Static Link): 바이너리에 정적lib에 있는 필요한 모든 함수가 포함됨 (용량낭비가 심함)

 

 

PLT(Procedure Linkage Table)와 GOT(Global Offset Table)

- 라이브러리에서 동적 링크된 심볼의 주소를 찾을 때 사용하는 테이블

- PLT -> GOT -> -> _dl_runtime_resolve_fxsave (여기서 puts의 주소가 구해지고 GOT 엔트리에 주소를 쓴다)

- runtime resolve를 하기 위한 코드는 plt에 있다.

 

 

- PLT에서 GOT를 참조하여 실행 흐름을 옮길 때, GOT의 값을 검증하지 않음.

- 따라서 GOT 엔트리에 저장된 값을 임의로 변조할 수 있다면, puts가 호출될 때, 원하는 공격코드 실행이 가능함

(GOT Overwrite 공격)

 

레퍼런스

https://dreamhack.io/lecture/courses/85

https://dreamhack.io/lecture/courses/66

728x90