넘 침 과 use after free 의 차이

3972 단어 넘쳐흐르다
문장 번역:http://www.thegreycorner.com/2010/03/difference-between-heap-overflow-and.html
수준 이 제한 되 어 있 기 때문에 여러분 은 원문 을 보 러 갈 수 있 습 니 다. 이 글 은 뒤에 작은 절 차 를 추가 하여 여러분 이 이해 할 수 있 도록 합 니 다.
며칠 전에 나 는 내 블 로그 독자 로부터 질문 을 받 았 는데, 그 는 넘 치 는 것 과 use after free 구멍 사이 의 차 이 를 묻 고 싶 었 다.나 는 이것 이 좋 은 화제 가 될 것 이 라 고 생각해 서 이 글 을 썼 다.
        
지금 나 는 이 문제 에 대답 하기 전에 메모리 관리 체제 와 관련 된 이론 을 먼저 말 하고 싶다.
        
메모리 관리 에는 스 택 과 더미 두 가지 중요 한 데이터 구조 가 있다.스 택 은 후진 선 출 구조 로 함수 의 국부 변수 와 일부 함수 호출 데 이 터 를 저장 하 는 데 사용 된다.스 택 작업 을 할 때 한 무더기 의 디스크 를 생각 하기 때문에 스 택 의 맨 위 에 데 이 터 를 추가 하거나 데 이 터 를 제거 할 수 밖 에 없습니다.만약 당신 이 상단 의 두 번 째 접 시 를 제거 하고 싶다 면, 당신 은 먼저 그것 위의 것 을 먼저 옮 겨 야 합 니 다.스 택 은 매우 간단 한 구조 로 X86 프로세서 에 레지스터 와 명령, 그리고 어 셈 블 리 언어 로 관리 하고 접근 합 니 다.
        
더 미 는 프로 세 스 가 전역 변 수 를 저장 하거나 스 택 의 공간 이 부족 하여 변수의 크기 를 만족 시 키 기 위해 저장 하 는 메모리 공간 입 니 다.x86 프로세서 와 어 셈 블 리 언어 에 쌓 여 있 는 전용 레지스터 와 명령 이 아 닌 고급 함수 로 관 리 됩 니 다. 이 함수 들 은 한 번 에 C 언어 로 쓰 여 있 으 며 windows, GNU / linux 등 시스템 에 포함 되 어 있 습 니 다.
        
넘 치 는 측면 에서 볼 때 스 택 과 쌓 기 관리의 차이 로 인해 OllyDbg 등 어 셈 블 리 디 버 거 가 스 택 과 쌓 기 변 화 를 비교 할 때 쌓 기 변 화 를 따라 잡기 어렵 고 쌓 기 기반 의 넘 침 변 화 는 스 택 기반 의 넘 침 에 비해 사용 하기 어렵 습 니 다.그러나 이런 것들 은 관리 체제 에 대한 복잡 도 를 증가 시 켰 고 서로 다른 유형의 이용 가능 한 구멍 도 제공 할 것 이다.따라서 더미 와 스 택 에 있 는 버퍼 가 넘 치 는 것 외 에 도 use after free 라 는 구멍 이 존재 합 니 다.
        
use after free 와 같은 유형의 구멍 이 발생 할 때 쌓 기 관리 체제 가 추가 로 도입 한 복잡 한 관리 체제 로 인해 발생 합 니 다.우 리 는 먼저 더미 가 어떻게 일 하 는 지 이해 하고 use after free 와 넘 치 는 구멍 을 이해 하 며 차이 점 을 알 아야 한다.우 리 는 윈도 운영 체제 의 더미 관리 방법 을 예 로 들 것 이다.
        
 windows 에 서 는 기본 프로 세 스 더미 와 다른 동적 신청 가능 한 크기 를 포함 하여 프로 세 스 마다 하나 이상 의 더미 가 있 습 니 다.동적 신청 더 미 는 HeapCreate () 함수 로 신청 할 수 있 습 니 다.더미 마다 임의의 크기 의 블록 이 있 을 수 있 으 며, malloc (), HeaoAlloc (), LocalAlloc (), GlobalAlloc () 또는 RtkAllocateHeap () 에 의 해 분배 공간 을 신청 할 수 있 습 니 다.
        
신청 공간 이 있 는 이상 똑 같이 방출 하 는 것 도 없어 서 는 안 된다. 메모리 공간 을 중복 이용 할 수 있 도록 필요 하지 않 을 때.HeapFree () 와 HeapReAlloc () 등 함 수 는 더미 에서 쌓 인 공간 을 방출 하고 재 신청 하 는 데 사 용 됩 니 다.
        
물론 더미 속 에서 공간 배분 을 신청 할 수 있 는 함수 나 방법 이 필요 하 다.이것들 은 모두 베이스 주소 의 넓 은 데이터 구조 에서 찾 을 수 있 고 모든 블록 의 입구 주 소 를 기록 하여 어떤 블록 이 분배 되 었 는 지 표시 할 수 있다.분 배 된 블록 과 할당 되 지 않 은 블록 마다 하나의 블록 이 있 습 니 다. 위 에서 언급 한 각종 관리 함수 들 은 공간 을 신청 하고 방출 할 때 이런 구 조 를 사용 하여 조작 해 야 합 니 다.마찬가지 로 쌓 인 넘 침 을 바탕 으로 하 는 것 도 같은 쌓 인 관리 함 수 를 이용 하여 CPU 를 제어 하여 쌓 인 구 조 를 파괴 하 는 것 이다.
        
 특히 쌓 아 올 리 는 것 은 쌓 아 올 리 는 블록 의 넘 침 과 다음 쌓 아 올 리 는 블록 의 첫 번 째 를 통 해 작업 을 하 는 것 입 니 다. 다음 쌓 아 올 리 는 블록 에는 다른 쌓 아 올 리 는 입구 주소 나 풀 어 놓 은 블록 이 포함 되 어 있 을 수 있 습 니 다. (각각 앞에서 말 한 블록 의 첫 번 째 를 포함 합 니 다)그 다음 에 쌓 기 관리자 가 쌓 기 블록 을 조작 할 때 (예 를 들 어 새로운 쌓 기 블록 을 신청 하 는 것) 작업 공간 은 다시 쓴 쌓 기 블록 을 가리 키 고 이 잘못된 블록 은 머리 관리 함수 에 의 해 접근 할 수 있 지만 이것 은 이상 이 발생 하여 적당 한 조건 에서 이용 할 수 있 습 니 다.앞에서 말 한 바 와 같이 이러한 구멍 을 이용 하여 작업 더미 관 리 를 포함 하 는 함 수 를 포함 하기 때문에 특히 주의해 야 할 것 은 이러한 함수 가 바 뀌 었 다 면 (예 를 들 어 windows xp sp2 에서 도입 한 안전 제거 기능) 넘 치 는 편집 exp 를 더욱 이용 하기 어렵 거나 불가능 하 게 만 들 었 다 는 것 이다.
 Useafter free 의 이용 조작 은 넘 침 과 약간 다르다.우선 블록 을 가리 키 는 주소 가 필요 합 니 다.풀 려 난 블록 이 이용 되면 프로 세 스 를 제어 할 수 있 는 기회 가 생 길 수 있 습 니 다.
        
프로그램:
Example1:
#include 
#include 
#define BUFSIZER1 512
#define BUFSIZER2 ((BUFSIZER1/2) - 8)
int main(int argc, char **argv) {
char *buf1R1;
char *buf2R1;
char *buf2R2;
char *buf3R2;
buf1R1 = (char *) malloc(BUFSIZER1);               //    
buf2R1 = (char *) malloc(BUFSIZER1);               //    
free(buf2R1);                                                 //  
buf2R2 = (char *) malloc(BUFSIZER2);
buf3R2 = (char *) malloc(BUFSIZER2);
strncpy(buf2R1, argv[1], BUFSIZER1-1);             //      ,    buf2R1
free(buf1R1);
free(buf2R2);
free(buf3R2);
}

Example2:
char* ptr = (char*)malloc (SIZE);
if (err) {
abrt = 1;
free(ptr);
}
...
if (abrt) {
logError("operation aborted before commit", ptr);
}
        ,      。            logError   。

좋은 웹페이지 즐겨찾기