DEP(Data Execution Prevention)
실행 권한이 없는 메모리 영역에 있는 코드가 실해오디지 못하도록 방지하는 기법
—> DEP가 적용되기 시작하면서 스택 혹은 힙 영역에 쉘코드를 입력한 뒤 해당 쉘코드를 실행하도록 못하게 되었다.
DEP에는 H/W 기반 DEP와 S/W 기반 DEP가 존재한다.
하드웨어 DEP : 메모리에 명시적으로 실행 코드가 포함되어 있는 경우를 제외하고 프로세스의 모든 메모리 위치에서 실행할 수 없도록 표시한다.
-> 대부분의 최신 프로세서는 하드웨어 적용 DEP를 지원한다.
소프트웨어 DEP : CPU가 하드웨어 DEP를 지원하지 않을 경우 사용한다.
그러면, 공격자가 Heap, Stack 영역에 shellcode를 저장하고, shellcode를 실행하기 위해서는 해당 영역에 실행 권한이 있어야 한다.
Bypass DEP
DEP를 우회하기 위해서는 윈도우 운영체제에서 제공하는 유용한 API를 호출하면 된다.
ASLR 보호기법이 적용이 안된, 로드되는 dll 이나 exe에서 사용하면 된다.
여기서는 VirtualAlloc() + memcpy()를 이용하여, 실행 가능한 메모리 할당 후 쉘코드를 복사했다.
VirtualAlloc()
https://learn.microsoft.com/ko-kr/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc
VirtualAlloc 함수(memoryapi.h) - Win32 apps
호출 프로세스의 가상 주소 공간에서 페이지 영역의 상태를 예약, 커밋 또는 변경합니다. (VirtualAlloc)
learn.microsoft.com
가상 주소 공간에서 페이지 영역의 상태를 예약, 커밋 또는 변경한다.
lpAddress : 할당 할 영역의 시작 주소 (이게 null 일 경우에는 알아서 할당해줌)
dwSize : 할당할 영역의 크기(바이트)
flAllocationType : 메모리 할당 유형 (0x1000 으로 설정을 하면 EXECUTE_READWRITE)
flProtect : 할당 할 페이지 영역에 대한 메모리 보호 기법 (0x40 으로 설정을 하면 EXECUTE_READWRITE)
이 함수가 정상적으로 실행이 되면, eax 와 edx에서 주소를 반환을 해준다.
정상적으로 VirtualAlloc ROP 체인을 구성하면 해당 반환값을 확인을 해보면
protect가 PAGE_EXECUTE_READWRITE 인 것을 알 수 있다.
이정도만 알아도 익스하는데 어려움은 없다..!!