반환 지향형 프로그래밍
반환 지향 프로그래밍은 스택 스매싱의 진화된 버전이다. 일반적으로 공격들의 이러한 종류들은 상대방이 프로그램의 버그(주로 버퍼 오버런)를 이용함으로써 콜 스택을 조작할 때 발생한다. 버퍼 오버런 시에 사용자가 제공하는 데이터를 적절한 경계 검사 없이 메모리에 저장하는 함수는 적정한 양보다 더 많은 데이터를 받아들일 수 있다. 데이터가 스택에 겹쳐써지면 초과된 데이터는 함수의 변수에 할당된 공간을 넘치게 되고 반환 주소도 겹쳐쓰게 된다. 이 주소는 이후에 함수에 의해서 제어 흐름을 다시 호출자로 넘겨줄 때 사용된다. 만약 겹쳐써졌다면 제어 흐름은 새로운 반환 주소로 넘겨지게 된다.
스택 버퍼 오버플로
코드를 데이터에서 분리하는 것 대신 다른 기법으로 실행 가능한 프로그램의 메모리 공간을 랜덤화하는 것이 있다. 공격자가 위치할 실행 코드를 어디에 위치시킬 지를 결정할 필요가 있기 때문에 실행 가능한 페이로드는 실행 가능한 스택과 함께 제공되거나 ret2libc 또는 ROP같은 코드 재사용을 사용해서 구성되는데, 메모리 레이아웃을 랜덤화하는 것은 공격자가 코드가 어디에 존재하는지를 알게 하는 것을 방어한다. 그러나 구현은 일반적으로 모든 것을 랜덤화하지는 않으며, 심지어 ASLR이 실행 불가 스택에 적용 되더라도 주로 실행 파일 자체는 고정 주소에 로드되며 공격자는 메모리의 이 고정 영역을 사용할 수 있다. 그러므로 모든 프로그램들은 반드시 메모리의 영역까지 랜덤화되는 PIE(position-independent executables)와 함께 컴파일되어야 한다. 랜덤화의 엔트로피는 구현 마다 다르며 충분히 작은 엔트로피는 본질적으로 메모리 공간을 무차별 대입 공격하는 것에 대해 문제가 될 수 있다.