메모리 파손
Memory corruption![]() |
프로그램 실행 |
---|
일반적인 개념 |
코드의 종류 |
컴파일 전략 |
주목할 만한 런타임 |
주목할 만한 컴파일러 및 툴 체인 |
메모리 파손은 컴퓨터 프로그램에서 원래 프로그래머의 의도를 초과하는 프로그램 동작이나 프로그램/언어 구성으로 인해 메모리 위치의 내용이 변경되었을 때 발생합니다.이것은 메모리 안전성 위반이라고 불립니다.메모리 파손의 가장 가능성이 높은 원인은 프로그래밍 에러(소프트웨어의 버그)입니다.파손된 메모리 내용을 나중에 그 프로그램에서 사용하면 프로그램 크래시 또는 이상하고 기괴한 프로그램 동작이 발생합니다.Windows 시스템에서 발생하는 애플리케이션 크래시의 거의 10%는 힙 [1]파손에 의한 것입니다.
C 및 C++와 같은 최신 프로그래밍 언어에는 명시적 메모리 관리 및 포인터 산술이라는 강력한 기능이 있습니다.이러한 기능은 효율적인 애플리케이션과 시스템 소프트웨어를 개발하기 위해 설계되었습니다.다만, 이러한 기능을 잘못 사용하면, 메모리 파손의 에러가 발생할 수 있습니다.
메모리 파손은 다음 두 가지 이유로 가장 다루기 어려운 프로그래밍 오류 중 하나입니다.
- 기억력의 손상 원인과 그 징후는 멀리 떨어져 있기 때문에 원인과 결과를 연관짓기 어려울 수 있다.
- 비정상적인 상황에서 증상이 나타나기 때문에 오류를 일관되게 재현하기 어렵습니다.
메모리 파손 에러는, 크게 다음의 4개의 카테고리로 분류할 수 있습니다.
- 초기화되지 않은 메모리 사용: 초기화되지 않은 메모리의 내용은 가비지 값으로 처리됩니다.이러한 값을 사용하면 예기치 않은 프로그램 동작이 발생할 수 있습니다.
- 비소유 메모리 사용:일반적으로 포인터를 사용하여 메모리에 액세스하고 메모리를 수정합니다.이러한 포인터가 늘 포인터, 덩글링 포인터(이미 해방된 메모리를 가리키거나 현재 스택 또는 힙 경계 외부에 있는 메모리 위치를 가리키고 있는 경우)인 경우, 이 포인터는 프로그램에 의해 소유되지 않는 메모리를 가리킵니다.이러한 포인터를 사용하는 것은 심각한 프로그래밍 결함입니다.이러한 메모리에 액세스 하면, 통상, operating system의 예외가 발생합니다.이 예외는, 적절한 메모리 보호 소프트웨어를 사용하고 있지 않는 한, 프로그램의 크래시를 일으키는 경우가 대부분입니다.
- 할당된 메모리를 초과하는 메모리 사용(버퍼 오버플로):잘못된 종료 조건으로 어레이가 루프에서 사용되는 경우 어레이 경계를 초과하는 메모리가 잘못 조작될 수 있습니다.버퍼 오버플로는 컴퓨터 바이러스에 의해 악용되는 가장 일반적인 프로그래밍 결함 중 하나로 널리 사용되는 프로그램에서 심각한 컴퓨터 보안 문제(예: Return-to-libc 공격, 스택스매싱 보호)를 일으킵니다.버퍼가 시작되기 전에 프로그램이 메모리에 잘못 액세스할 수도 있습니다.
- 잘못된 힙 메모리 관리:메모리 누전 및 비히프 또는 할당되지 않은 메모리 해방은 잘못된 힙 메모리 관리로 인해 발생하는 가장 빈번한 오류입니다.
Purfy, Valgrind, Insure++, Parasoft C/C++ 테스트, AddressSanitizer 등의 많은 메모리 디버거를 메모리 파손 오류를 검출할 수 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Radich, Q.; Sherer, T.; Sharkey, K.; Batchelor, D.; Kennedy, J. T.; Mabee, D.; Coulter, D.; Michael, S. (28 April 2021). "Application Verifier (Windows 7 and Windows Server 2008 R2 Application Quality Cookbook) - Win32 apps". Microsoft Developer Network. Retrieved 2022-02-09.
외부 링크
- 메모리 손상 튜토리얼 악용 방법 및 보호 메커니즘 소개