멋진! 버퍼를 오버플로하고 반환 주소를 수정할 수 있었습니다. 비밀기능 호출있어. 그러나 이것은 프로그램이 시크릿이 존재할 것으로 예상했기 때문에 스택을 파울로 했습니다. 플로우 공격을 통해 버퍼를 수행 할 수있는 코드 주입 및 실행과 같은 몇 가지 다른 고급 기술이 있지만 버퍼의 기본 사항, 오버 플로우 및 유해한 이유에 대해 먼저 아는 것이 중요합니다. [버퍼 오버플로 공격 C 프로그램 예제로 설명,”히만슈 아로라, 2013년 6월 4일, 괴짜 물건에서 적응] 우리는 다른 입력을 공급하여 응용 프로그램을 스트레스 테스트 할 수 있습니다. 입력이 너무 길면 아래를 참조하면 프로그램 동작이 좋지 않습니다. 아래 예제에서 스택은 ASCI 문자 31과 32로 덮어쓰고 각각 1과 2로 표시됩니다. 오류 메시지의 유형은 운영 체제 및 설치된 프로그램에 따라 달라집니다. 공격자가 프로그램의 흐름에 대한 버퍼에 대해 알게 되면 더 악화됩니다. 혼란? 이 예제를 고려하십시오: 버퍼 오버플로 오류는 프로세스의 메모리 조각을 덮어쓰는 것이 특징으로 하며, 이는 의도적으로 또는 의도치 않게 수정되어서는 안 됩니다. IP(명령 포인터), BP(기본 포인터) 및 기타 레지스터의 값을 덮어쓰면 예외, 분할 오류 및 기타 오류가 발생합니다.
일반적으로 이러한 오류는 예기치 않은 방식으로 응용 프로그램의 실행을 종료합니다. 버퍼 오버플로 오류는 char 형식의 버퍼에서 작동할 때 발생합니다. 버퍼 오버플로를 방지하기 위해 C/C++ 응용 프로그램의 개발자는 가져옵니다, 스캔 및 strcpy와 같이 경계가 확인되지 않은 표준 라이브러리 함수를 피해야 합니다. 다른 방법으로 버퍼 오버플로 오류를 사용하는 방법은 무엇입니까? 버퍼 오버플로는 C 및 C++의 낮은 수준의 코드에서 취약점입니다. 공격자는 프로그램이 충돌하거나, 데이터가 손상되거나, 일부 개인 정보를 도용하거나, 자신의 코드를 실행할 수 있습니다. 지금까지 는 버퍼 오버플로가 프로그램에 수행할 수 있는 일에 대해 설명했습니다. 버퍼 오버플로로 인해 프로그램이 충돌하거나 예기치 않은 결과를 제공할 수 있는 방법을 배웠습니다. 끔찍한 아닌가요? 그러나, 그것은 최악의 부분이 아닙니다. 많은 프로그래밍 언어는 오버플로 공격을 버퍼링하는 경향이 있습니다. 그러나 이러한 공격의 범위는 취약한 프로그램을 작성하는 데 사용되는 언어에 따라 다릅니다. 예를 들어 Perl 및 JavaScript로 작성된 코드는 일반적으로 버퍼 오버플로에 취약하지 않습니다.
그러나 C, C++, Fortran 또는 어셈블리로 작성된 프로그램의 버퍼 오버플로는 공격자가 대상 시스템을 완전히 손상시킬 수 있습니다. 실행 가능한 공간 보호는 스택 또는 힙에서 코드 실행을 방지하는 오버플로 보호 버퍼링 방법입니다. 공격자는 버퍼 오버플로를 사용하여 프로그램의 메모리에 임의의 코드를 삽입할 수 있지만 실행 가능한 공간 보호를 사용하면 해당 코드를 실행하려고 하면 예외가 발생합니다. 위의 예제에서는 크기 10 바이트의 배열을 선언 했습니다. 인덱스 0에서 인덱스 9까지는 이러한 10바이트의 버퍼를 참조하는 데 사용할 수 있습니다. 그러나 다음 줄에서는 인덱스 10을 사용하여 값을 `a`로 저장했습니다. 데이터가 버퍼의 오른쪽 경계를 넘어 기록되므로 버퍼 오버런이 발생하는 지점입니다. 스택 스매싱이 방해되도록 컴파일러를 다시 작성하는 것은 그리 어렵지 않습니다. 스택 가드는 함수가 호출되기 전에 로컬 변수와 스택의 반환 주소 사이에 Canary 단어를 작성하고 함수가 반환되기 직전에 확인합니다. 이 간단한 기술은 실행 시간 및 메모리 요구 사항에 약간의 오버헤드를 소모하여 스택 오버플로 공격을 방지합니다. 반환 주소를 덮어쓰려면 공격자가 canary 단어를 덮어써야 합니다.
카나리아 단어는 다양하기 때문에 이 덮어쓰기는 높은 확률로 검색할 수 있습니다.