가드 바이트
Guard byte가드[citation needed] 바이트는 소프트웨어 개발자가 프로그램을 개발하는 동안 버퍼 오버플로우를 찾을 수 있도록 도와주는 컴퓨터 프로그램 메모리의 일부입니다.
원칙
디버깅을 위해 프로그램이 컴파일되면 모든 메모리 할당이 가드바이트에 의해 프리픽스 및 포스트픽스 됩니다.그 후 특수한 메모리 할당 루틴은 할당된 메모리 밖에서 불필요한 읽기 및 쓰기 시도를 결정하기 위해 추가 작업을 수행할 수 있습니다.이러한 여분의 바이트는 프로그램이 부적절한 메모리 영역에 쓰기(또는 읽기)하고 있는 것을 검출하는 데 도움이 되어 버퍼 오버플로우가 발생할 가능성이 있습니다.프로그램의 알고리즘에 의해 이러한 바이트에 액세스 했을 경우, 프로그래머는 문제를 특정하기 위한 정보를 통지받는다.
가드 바이트에 대한 부적절한 접근 확인은 다음 두 가지 방법으로 수행할 수 있습니다.
- 이러한 바이트에 대한 쓰기 및/또는 읽기 조건으로 메모리 중단점을 설정하거나
- 특정 값으로 가드바이트를 사전 초기화하여 할당 해제 시 값을 체크합니다.
첫 번째 방법은 이러한 중단점을 처리하는 디버거를 통해서만 가능하지만 문제를 찾을 수 있는 가능성을 크게 높입니다.두 번째 방법은 디버거나 특별한 환경이 필요하지 않고 다른 컴퓨터에서도 실행할 수 있지만, 프로그래머는 할당 해제 시에만 오버플로에 대해 경고합니다.이 경우 할당 해제 시에만 오버플로에 대해 경고합니다.
가드 바이트는 추가 코드를 실행하고 메모리를 할당해야 하므로 디버깅을 위해 프로그램이 컴파일될 때만 사용됩니다.릴리스로 컴파일된 경우 가드바이트는 전혀 사용되지 않으며 이 바이트와 함께 동작하는 루틴도 사용되지 않습니다.
예
프로그래머가 디버깅 중에 100바이트의 메모리 버퍼를 할당하려고 합니다.시스템 메모리 할당 루틴은 대신 108바이트를 할당하고 4개의 선행 가드 바이트와 4개의 후행 가드 바이트를 추가합니다.그리고 4개의 선행 가드 바이트에 의해 시프트된 포인터를 오른쪽으로 되돌려 프로그래머로부터 숨깁니다.그러면 프로그래머는 가드바이트의 존재를 인식하지 않고 수신된 포인터로 작업해야 합니다.
프로그래머의 알고리즘이 할당된 공간 바로 밖에서 쓸 경우, 가드 바이트를 덮어씁니다.나중에 할당 해제 시 할당 해제 루틴은 가드바이트가 변경되었는지 여부를 확인하고 필요에 따라 오류를 보고합니다.
문제
메모리 할당 루틴은 프로그래머 알고리즘에 의해 사용되지 않도록 되어 있는 값으로 가드 바이트를 채웁니다.그러나 이것은 예측할 수 없다.알고리즘이 이러한 값을 사용하여 가드바이트를 덮어쓰는 경우(할당 해제 전 마지막 쓰기만 해당), 실제로 바이트가 변경되지 않았기 때문에 오버플로를 검출할 수 없습니다.대신 메모리 중단점 옵션을 사용하여 디버거의 해당 바이트에 대한 액세스 조건을 설정할 수 있습니다.