그림 13-15는 buff1 버퍼를 오버플로하고 두 개의 -4 값을 작성하여 buff2 청크의 헤더에 prev_size 및 크기를 모두 덮어쓸 때 힙 레이아웃을 보여줍니다. 힙 오버플로는 중요한 데이터(힙의 파일 이름 및 기타 변수 덮어쓰기)와 논리 프로그램 흐름(힙 제어 구조 및 함수 포인터 수정을 통해)이 모두 손상될 수 있습니다. 개념적 설명 및 다이어그램과 함께 논리적 프로그램 흐름을 손상시키는 위협에 대해 설명합니다. 힙에 버퍼를 오버플로할 수 있는 경우 힙에서 다음 청크의 청크 헤더를 덮어쓸 수 있으므로 이러한 조건을 true로 만들 수 있으며, 이로 인해 메모리의 어느 곳에서나 임의의 바이트를 4개 쓸 수 있습니다. fd 및 BK 포인터). 실시예 13-7은 간단한 취약한 프로그램을 나타낸다. 오버플로 문자열에 NULL() 바이트가 없어야 하거나 컴퓨터 메모리에서 데이터 복사가 중지되면 스택 크기가 제한됩니다. 프로그램이 스택 크기보다 더 많은 메모리 공간을 사용하는 경우 스택 오버플로가 발생하여 프로그램 충돌이 발생할 수 있습니다. 스택 오버플로가 발생할 수 있는 두 가지 경우가 있습니다: 이 예제에서는 길이가 있는 문자열 구조와 실제 문자열 데이터에 대한 포인터가 있습니다. 이 구조의 인스턴스를 올바르게 할당, 채우기 및 해제합니다. 그런 다음 다른 할당을 만들고 채운 다음 해제된 문자열을 부적절하게 참조합니다. glibc의 할당자가 작동하는 방식으로 인해 s2는 실제로 원래의 할당과 동일한 메모리를 얻게되어 s->데이터 포인터를 제어 할 수있는 기능을 제공합니다. 프로그램 데이터를 유출하는 데 사용할 수 있습니다.

스택 버퍼 오버플로와 마찬가지로 힙 오버플로는 할당된 버퍼에 들어갈 수 있는 것보다 많은 데이터를 읽는 취약점입니다. 이로 인해 메타데이터 손상이 발생하거나 다른 힙 개체가 손상되어 새로운 공격 표면이 제공될 수 있습니다. 버퍼는 고정된 크기의 힙 메모리를 할당하지만 argv[1]의 문자열이 이 크기를 초과하지 않고 오버플로를 일으킬 것이라는 보장은 없습니다. 예를 들어 Microsoft JPEG GDI+ 버퍼 오버플로 취약점으로 영향을 받는 컴퓨터에서 코드를 원격으로 실행할 수 있습니다. [1] 모든 버퍼가 스택에 할당되는 것은 아닙니다. 응용 프로그램이 실행될 때까지 특정 버퍼를 만드는 데 얼마나 큰지 모르는 경우가 많습니다. 힙은 응용 프로그램에서 다양한 크기의 버퍼를 동적으로 할당하는 데 사용됩니다. 이러한 버퍼는 사용자 제공 데이터를 검사하지 않으면 오버플로에 취약하므로 공격자가 힙의 다른 값을 덮어쓰면서 손상될 수 있습니다. iOS 탈옥은 종종 힙 오버플로를 사용하여 임의의 코드 실행을 얻으며, 일반적으로 커널 익스플로잇은 커널을 탈옥이 제공하는 커널로 대체할 수 있습니다. 여기에 오버플로가 있습니다. 긴 인수로 프로그램을 호출하면 충돌이 유발됩니다: 오버플로되는 버퍼는 스택의 로컬 버퍼가 아니라 malloc()에서 가져온 버퍼이며 free()로 해제됩니다. 우리가 작은 데모를 할 수 있습니다.

이것은 glibc-2.3.3 인 것 같습니다.