버퍼의 크기가 정의되고(char buf[8]) char 형식의 13자로 채워졌기 때문에 버퍼가 오버플로되었습니다. 또한 보안 개발 관행에는 버퍼 오버플로를 감지하고 수정하기 위한 정기적인 테스트가 포함되어야 합니다. 버퍼 오버플로를 방지하거나 방지하는 가장 신뢰할 수 있는 방법은 언어 수준에서 자동 보호를 사용하는 것입니다. 또 다른 수정 프로그램은 런타임에 바인딩 검사로, 버퍼에 기록된 데이터가 허용 가능한 경계 내에 있는지 자동으로 확인하여 버퍼 오버런을 방지합니다. 힙 데이터 영역에서 발생하는 버퍼 오버플로를 힙 오버플로라고 하며 스택 기반 오버플로와는 다른 방식으로 악용할 수 있습니다. 힙의 메모리는 런타임에 응용 프로그램에서 동적으로 할당되며 일반적으로 프로그램 데이터를 포함합니다. 악용은 응용 프로그램이 연결된 목록 포인터와 같은 내부 구조를 덮어쓰도록 하는 특정 방식으로 이 데이터를 손상시켜 수행됩니다. 표준 힙 오버플로 기법은 동적 메모리 할당 링크(예: malloc 메타 데이터)를 덮어쓰고 결과 포인터 교환을 사용하여 프로그램 함수 포인터를 덮어씁니다. 나는 항상 펑키 프로그램 동작 외에 버퍼 오버플로에 대해 무엇이 그렇게 위험한지 궁금해했습니다. 나는 암호를 해독하는 반환의 `비 제로 네스`를 고려하지 않았다. 기사 주셔서 감사합니다.

버퍼 오버플로 오류는 프로세스의 메모리 조각을 덮어쓰는 것이 특징으로 하며, 의도적으로 또는 의도치 않게 수정해서는 안 됩니다. IP(명령 포인터), BP(기본 포인터) 및 기타 레지스터의 값을 덮어쓰면 예외, 분할 오류 및 기타 오류가 발생합니다. 일반적으로 이러한 오류는 예기치 않은 방식으로 응용 프로그램의 실행을 종료합니다. 버퍼 오버플로 오류는 char 형식의 버퍼에서 작동할 때 발생합니다. 위의 예에서 프로그램은 사용자가 잘못된 암호를 입력한 경우에도 사용자 루트 권한을 부여합니다. 이 경우 공격자는 버퍼가 보유할 수 있는 길이보다 큰 입력을 제공하여 버퍼 오버플로를 생성하여 정수 “pass”의 메모리를 덮어썼습니다. 따라서 잘못된 암호에도 불구하고 “pass”의 값은 0이 되고 공격자는 루트 권한을 받습니다. 그러나 gets() 함수가 배열 경계를 검사하지 않기 때문에 이 프로그램에서 버퍼 오버플로가 발생할 수 있습니다.

그런 다음 함수가 종료될 때 반환할 위치를 알아야 하므로 다음 명령의 주소가 반환 주소로 스택에 푸시됩니다. 이 코드 예제에서 다음 명령은 func(argv[1]));(줄 14의 메모리 주소)에 대한 명령입니다.

Scroll Up