그럼 영상 속 남자는:
https://www.youtube.com/watch?v=1S0aBV-Waeo
스택을 유출하고, 반환 주소를 조작하여 스택을 가리키고, NOP 명령을 사용하여 실행 가능한 코드를 스택에 복사합니다.
하지만 모든 최신 Linux 시스템(데비안 시스템 포함)은 페이지 테이블의 NX(실행 불가능) 유형 비트를 사용하고 이와 같은 중지 명령을 사용하여 스택에서 작업함으로써 이를 방어할 수 있다고 생각합니다. 아니면 내가 뭔가를 놓치고 있는 걸까?
답변1
실행 불가능한 페이지(NX 비트)는 하드웨어 기능입니다. 이를 통해 운영 체제는 실행할 수 있는 페이지를 표시할 수 있습니다. 프로그램이 실행할 수 없는 메모리 페이지에서 코드를 실행하려고 하면 프로세서에 오류가 발생합니다.
또한 스택이 실행 가능한지 여부는 컴파일러 옵션(및 결과 바이너리)에 따라 달라집니다. 최신 Linux 배포판은 실행 불가능한 스택, 스택 카나리아, 주소 공간 레이아웃 무작위화 등 사용자 공간 바이너리에 대한 다양한 강화 기술을 지원합니다. 예를 들어Ubuntu 사용자 공간 강화.
이것은가능한스택 카나리아를 사용하지 않고 실행 가능한 스택으로 바이너리를 컴파일하여 비디오 예제에서와 같이 스택 오버플로를 가능하게 합니다(컴파일된 프로그램/사용된 옵션을 볼 수 없지만 기본적으로 gcc는 실행 파일을 활성화해서는 안 됩니다) 이러한 간단한 프로그램을 위한 스택).
또한 시스템이 실행 가능 + 쓰기 가능 메모리(힙 또는 스택)가 필요한 바이너리를 실행하지 못하도록 SELinux(및 기타 Linux 보안 모듈)를 구성할 수 있습니다.
답변2
NX 비트는 x86_64 아키텍처에만 도입되었으며 32비트 Intel/AMD 프로세서에는 존재하지 않습니다. 물론, 지금은 거의 모든 사람들이 64비트 PC를 사용하고 있지만, 아직도 옛날 386 세계의 맥락에서 설명을 고집하는 블로거나 블로거들에게는 아무도 알리지 않는 것 같습니다.