overflow란_overflow 원인 분석
해커는 반환 주소가 공격 코드를 가리키도록 변수를 오버플로하여 컴퓨터에 대한 관리자 제어권을 얻을 수 있습니다. 그럼 여러분은 Overflow에 대해 얼마나 알고 계시나요? 다음은 Overflow가 무엇인지에 대해 정리한 내용입니다.
Overflow란 무엇인가요?
Overflow는 해커들이 가지고 있는 취약점입니다. 그는 특별히 프로그램을 개발하여 해당 매개변수를 추가하고 이를 실행한 후 관리자 자격으로 귀하의 컴퓨터를 제어할 수 있습니다. 귀하의 컴퓨터는 그 사람의 것입니다(브로일러라고도 하며 인형 기계라고도 함).
오버플로는 프로그래머의 설계 결함으로 인해 발생하는 오류입니다. 오버플로 분류
버퍼 오버플로
버퍼는 프로그램이 실행될 때 컴퓨터에 사용자가 할당한 연속적인 메모리입니다. 버퍼 오버플로는 프로그램의 버퍼 길이를 초과하는 내용을 작성하여 버퍼 오버플로를 발생시켜 프로그램의 스택을 파괴하고 프로그램이 다른 실행 명령으로 전환하도록 하는 일반적이고 매우 해로운 시스템 공격 방법을 말합니다. 공격의 목적. 더 심각한 것은 버퍼 오버플로 공격이 원격 네트워크 공격의 대부분을 차지한다는 점입니다. 이러한 유형의 공격은 익명의 인터넷 사용자에게 호스트에 대한 부분적 또는 전체 제어 권한을 얻을 수 있는 기회를 제공할 수 있습니다. 누구든지 호스트를 제어할 수 있으므로 매우 심각한 보안 위협이 됩니다.
버퍼 오버플로 공격의 목적은 특정 권한으로 실행되는 프로그램의 기능을 중단시켜 공격자가 프로그램을 제어할 수 있도록 하는 것입니다. 프로그램에 충분한 권한이 있으면 전체 호스트가 제어됩니다. . 일반적으로 공격자는 루트 프로그램을 공격한 후 exec(sh)와 유사한 실행 코드를 실행하여 루트 쉘을 획득합니다. 이 목표를 달성하기 위해 공격자는 다음 두 가지 목표를 달성해야 합니다. 프로그램의 주소 공간에 적절한 코드를 배열하고, 레지스터와 메모리를 적절하게 초기화하여 프로그램이 미리 배열된 주소 공간으로 점프하여 실행되도록 허용합니다. 이 두 가지 목표에 따르면 버퍼 오버플로 공격은 다음 세 가지 범주로 나눌 수 있습니다.
버퍼 오버플로 분류
제어 프로그램을 공격 코드로 전환
이 방법은 프로그램의 실행 흐름을 공격 코드로 점프하도록 변경하는 것을 말합니다. . 가장 기본적인 방법은 경계 검사나 다른 약점 없이 버퍼를 오버플로하여 프로그램의 정상적인 실행 순서를 방해하는 것입니다. 버퍼 오버플로를 통해 공격자는 거의 무차별 대입 방법을 사용하여 인접한 프로그램 공간을 덮어쓰고 시스템 검사를 직접 건너뛸 수 있습니다.
1.2.1 활성화 레코드
함수 호출이 발생할 때마다 호출자는 함수가 끝날 때 반환되는 정보를 포함하는 활성화 레코드를 스택에 남깁니다. 공격자는 반환 주소가 공격 코드를 가리키도록 이러한 자동 변수를 오버플로합니다. 프로그램의 반환 주소를 변경하여 함수 호출이 끝나면 프로그램은 원래 주소가 아닌 공격자가 설정한 주소로 점프합니다. 이러한 유형의 버퍼 오버플로를 "스택 스매싱 공격"이라고 하며 일반적으로 사용되는 버퍼 오버플로 공격 방법입니다.
1.2.2 함수 포인터
C 언어에서 ?void (* foo)()?는 반환 값이 void 함수 포인터인 foo 변수를 선언합니다. 함수 포인터는 모든 주소 공간을 찾는 데 사용될 수 있으므로 공격자는 모든 공간의 함수 포인터 근처에서 오버플로 가능한 버퍼를 찾은 다음 이 버퍼를 오버플로하여 함수 포인터를 변경하기만 하면 됩니다.
어느 순간, 프로그램이 함수 포인터를 통해 함수를 호출하면 공격자의 의도에 따라 프로그램 흐름이 구현됩니다! 그 공격 사례 중 하나가 Linux 시스템에서의 슈퍼 프로브 프로그램입니다.
1.2.3 Longjmp 버퍼
C 언어에는 setjmp/longjmp라는 간단한 검사/복구 시스템이 포함되어 있습니다. 이는 체크포인트에 ?setjmp(buffer)?를 설정하고 ?longjmp(buffer)?를 사용하여 체크포인트를 복원하는 것을 의미합니다. 그러나 공격자가 버퍼 공간에 들어갈 수 있으면 longjmp(buffer)는 실제로 공격자의 코드로 점프합니다. 함수 포인터와 마찬가지로 longjmp 버퍼는 어디든 가리킬 수 있으므로 공격자가 해야 할 일은 오버플로할 버퍼를 찾는 것뿐입니다. 대표적인 예가 Perl 5.003입니다. 공격자는 먼저 버퍼 오버플로를 복구하는 데 사용되는 longjmp 버퍼에 들어간 다음 복구 모드로 들어가도록 유도하여 Perl 인터프리터가 공격 코드로 점프하게 만듭니다.
가장 간단합니다! 가장 일반적인 유형의 버퍼 오버플로 공격은 코드 식민지화와 활성화 레코드를 문자열로 결합하는 것입니다. 공격자는 오버플로될 수 있는 자동 변수를 찾아 큰 문자열을 프로그램에 전달하여 버퍼 오버플로를 유발하여 활성화 레코드를 변경하는 동시에 코드를 삽입합니다. 이는 레비가 지적한 공격에 대한 템플릿이다. C 언어는 전통적으로 사용자 및 매개변수에 대해 작은 버퍼만 열기 때문에 이러한 종류의 취약점 공격 사례가 많이 있습니다.
코드 식민지화와 버퍼 오버플로가 한 번의 작업으로 완료될 필요는 없습니다. 공격자는 버퍼를 오버플로할 수 없는 버퍼 내부에 코드를 배치할 수 있습니다. 그런 다음 공격자는 다른 버퍼를 오버플로하여 프로그램 포인터를 전송합니다. 이 방법은 일반적으로 오버플로에 대한 버퍼가 충분히 크지 않은 상황을 해결하는 데 사용됩니다.
공격자가 외부에서 코드를 식민지화하는 대신 이미 상주하는 코드를 사용하려고 시도하는 경우 일반적으로 코드를 매개 변수화해야 합니다. 예를 들어, libc의 일부 코드 세그먼트는 ?exec(something)?를 실행합니다(something은 매개변수임). 그런 다음 공격자는 버퍼 오버플로를 사용하여 프로그램 매개변수를 변경하고 또 다른 버퍼 오버플로를 사용하여 프로그램 포인터가 libc의 특정 코드 섹션을 가리키도록 했습니다.
메모리 오버플로
메모리 오버플로는 약 40년 동안 소프트웨어 개발의 역사에서 '오래되고 어려운' 문제였습니다. '코드 레드' 바이러스 사건에서 볼 수 있듯이 말입니다. 해커들이 기업 네트워크를 공격하는 주범이 됐다.
필드에 입력된 데이터가 요구 사항을 초과하면 데이터 오버플로 문제가 발생하고, 초과된 데이터는 컴퓨터에서 실행하기 위한 명령으로 사용될 수 있습니다. 관련 보안단체에 따르면 운영체제의 보안 취약점 50개 이상은 메모리 오버플로로 인해 발생하며 대부분 마이크로소프트 기술과 관련이 있는 것으로 나타났다.
Microsoft의 소프트웨어는 데스크톱 컴퓨터용으로 개발되었으므로 메모리 오버플로는 심각한 문제를 일으키지 않습니다. 그러나 기존 데스크톱 컴퓨터는 일반적으로 인터넷에 연결되어 있고 메모리 오버플로는 해커가 침입하기 편리한 조건을 제공합니다.
데이터 오버플로
컴퓨터에서는 표현하려는 데이터가 컴퓨터에서 사용하는 데이터의 표현 범위를 초과하는 경우 데이터 오버플로가 발생합니다. 오버플로 원인 분석
현실
새로운 것이든 오래된 것이든 거의 모든 컴퓨터 언어에서 버퍼 오버플로 시도는 일반적으로 언어 자체에 의해 자동으로 차단됩니다. (예: 예외를 발생시키거나 필요에 따라 버퍼에 더 많은 공간을 추가하는 등) 그러나 그렇지 않은 두 가지 언어가 있습니다: C 언어와 C 언어입니다. C와 C 언어는 종종 메모리의 나머지 부분에 추가 데이터를 기록하도록 허용하는데, 이는 끔찍한 결과를 초래할 수 있습니다.
더 나쁜 것은 C와 C에서 버퍼 오버플로를 일관되게 처리하기 위한 올바른 코드를 작성하는 것이 실수로 버퍼 오버플로를 일으키기 쉽다는 것입니다. C와 C가 매우 널리 사용된다는 점을 제외하면 이는 아마도 관련성이 없는 사실일 것입니다. 예를 들어 Red Hat Linux 7.1의 86줄의 코드는 C 또는 C로 작성되었습니다. 따라서 구현 언어가 이 문제로부터 코드를 보호할 수 없기 때문에 많은 양의 코드가 이 문제에 취약합니다.
객관적인 이유
C와 C 언어 자체에서는 이 문제를 해결하기가 쉽지 않습니다. 이 질문은 C 언어의 기본적인 디자인 결정(특히 C에서 포인터와 배열이 처리되는 방식)을 기반으로 합니다. C는 C 언어의 가장 호환성이 높은 상위 집합이므로 동일한 문제가 있습니다. 이 문제를 방지하는 C/C++ 호환 버전이 있지만 매우 심각한 성능 문제를 안고 있습니다. 그리고 이 문제를 방지하기 위해 C를 변경하면 더 이상 C가 아닙니다. 많은 언어(Java, C# 등)는 구문론적으로 C와 유사하지만 실제로는 다른 언어이며, 기존 C나 C 프로그램을 해당 언어를 사용하도록 변경하는 것은 어려운 작업입니다.
공통요소