버퍼 오버플로 예제

프로그램은 char 형식 버퍼에서 작동 하며이 버퍼에 할당 된 크기 오버플로에 대 한 검사를 수행 하지 않는 함수를 호출 합니다. 따라서 의도적으로 또는 실수로 버퍼에 더 많은 데이터를 저장할 수 있으며, 이로 인해 오류가 발생할 수 있습니다. 다음 질문이 발생합니다: 버퍼는 8자만 저장하므로 함수 printf()가 12개의 문자를 표시한 이유는 무엇입니까? 대답은 프로세스 메모리 조직에서 온다. 버퍼를 오버플로한 네 개의 문자도 올바른 함수 반환에 필요한 레지스터 중 하나에 저장된 값을 덮어씁니다. 메모리 연속성으로 인해 이 메모리 영역에 저장된 데이터가 인쇄됩니다. 버퍼 오버플로 취약점을 악용하는 기술은 아키텍처, 운영 체제 및 메모리 영역별로 다릅니다. 예를 들어, 힙에 대한 악용(동적으로 할당된 메모리에 사용됨)은 호출 스택의 악용과 현저하게 다릅니다. [버퍼 오버플로 공격 C 프로그램 예제로 설명,”히만슈 아로라, 2013년 6월 4일, 괴짜 물건에서 적응] 실제로 프로그램은 의도적으로 특정 레지스터로 이동하는 지침을 포함하지 않을 수 있습니다. 기존의 해결책은 프로그램 메모리 내의 고정 된 위치에서 적절한 opcode의 의도하지 않은 인스턴스를 찾는 것입니다.

왼쪽 그림 E에서 i386 jmp esp 명령의 의도하지 않은 인스턴스의 예를 볼 수 있습니다. 이 명령의 opcode는 FF E4입니다. [11] 이 2바이트 시퀀스는 주소 0x7C941EED에서 명령 호출 DbgPrint의 시작부터 1바이트 오프셋에서 찾을 수 있습니다. 공격자가 이 주소로 프로그램 반환 주소를 덮어쓰면 프로그램은 먼저 0x7C941EED로 이동하고 opcode FF E4를 jmp esp 명령으로 해석한 다음 스택의 맨 위로 이동하여 공격자의 코드를 실행합니다. [12] 사이버 범죄자는 버퍼 오버플로 문제를 악용하여 메모리의 일부를 덮어써 응용 프로그램의 실행 경로를 변경합니다. 악의적인 추가 데이터에는 특정 작업을 트리거하도록 설계된 코드가 포함될 수 있으며, 이로 인해 시스템에 무단으로 액세스할 수 있는 공격된 응용 프로그램에 새 명령을 보낼 수 있습니다. 버퍼 오버플로 취약점을 악용하는 해커 기술은 아키텍처 및 운영 체제마다 다릅니다. 문제는 첫 번째 예제와 동일합니다. 복사된 버퍼의 크기를 이전에 선언한 버퍼에 대한 제어는 없습니다. 이 예제에서는 EIP 레지스터를 주소 0x080483f9로 덮어씁니다. 런타임에 프로그램의 매개 변수인 argc 및 argv 매개 변수의 내용은 커널 영역에 유지됩니다.