2013-10-06 1 views
3

버그가있는 프로그램 (buggy.c)을 만들었습니다. 이것은 버퍼 t에 대한 버퍼 오버 플로우 시나리오입니다. 5 개 이상의 색인을 작성하고 있음을 알 수 있습니다. 그것은 잘 작동합니다. 결코 저에게 오류를 던지지 않습니다. 궁금 해서요, 왜 그렇게 생각하니? 나는 Valgrind조차 시도했다, 이것 또한이 문제점을 찾아 낼 수 없었다. 여기서 문제가 뭔지 말해 줄 수 있어요?Electric fence/Valgrind가 왜이 버퍼 오버 플로우 문제를 잡을 수 없습니까?

void buffer_overflow(void) 
    { 
     int t[5]; 
     int i = 0; 

     for(i = 0; i<=7; i++) 
     { 
     t[i] = i; 

     } 


     /** this will cause buffer overflow **/ 
     printf("Memory_overflow_completed\r\n"); 

    } 


    int main(int argc, char **argv) 
    { 

     buffer_overflow(); 

     return 0; 
    } 

    $gcc -g buggy.c -o buggy.out -lefence 

$./buggy.out 

그러나 충돌은 없습니다. 여기서 전기 펜스의 효과는 없습니다. 내가 무엇이 누락 되었습니까? 비슷한 질문을 여기에 게시했습니다. gcc with electric fence library does not take effect,하지만 아직 답변이없는 것 같습니다. 이 예제는 FC19에서 실행 중입니다. 누구에게도 답변이 있습니까? valgrind도 문제를 감지하지 못합니까? 이러한 문제를 감지 할 수있는 다른 도구가 있습니까? 추가적인 의견을 바탕으로

, 나는 전기 울타리에 의해 감지 얻을 수있는 버퍼 오버 플로우 기능을 수정. 그러나 Electric Fence는 문제를 감지 할 수 없습니다. 다음은 수정 된 함수입니다.

void buffer_overflow(void) 
{ 

    #if 0 
    int t[5]; 
    int i = 0; 

    for(i = 0; i<=7; i++) 
    { 
    t[i] = i; 

    } 
    #endif 

    char *t = malloc(sizeof(char)*7); 
    strcpy(t,"SHREYAS_JOSHI"); 


    /** this will cause buffer overflow **/ 
    printf("Memory_overflow_completed\r\n"); 
    free(t); 

} 

[[email protected] blogs-tune2wizard]$ gcc -g buggy.c -o buggy.out -lefence 

[[email protected] blogs-tune2wizard]$ ./buggy.out 

    Electric Fence 2.2.2 Copyright (C) 1987-1999 Bruce Perens <[email protected]> 
Memory_overflow_completed 

전기 울타리에서는 오류가 감지되지 않지만 Valgrind atleast에서는이를 나타냅니다.

답변

11

Valgrind는 2 진수 만 사용 가능하므로 제한됩니다. 컴파일러에 의해 코드에 인스트루멘테이션이 삽입되지 않는다면 address sanitizer을 시도해보십시오. 할당 된 영역 (심지어 스택에 있음) 주위에 메모리를 독살시킨 다음 모든 읽기/쓰기를 검사하므로 이러한 문제를 잡을 가능성이 더 큽니다.

그냥 같은 코드 컴파일 현재 GCC (4.8+)와 연타 (3.2 이상) 에 통합되어 :

==26247== ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7fff9fa0be54 at pc 0x4008df bp 0x7fff9fa0be00 sp 0x7fff9fa0bdf8 
WRITE of size 4 at 0x7fff9fa0be54 thread T0 

과 : 실행시

gcc -g buggy.c -o buggy.out -fsanitize=address 

, 그것은 뭔가를 인쇄 스택 추적. 그것도 연타 3.1에서 지원되지만 스위치는 -faddress-sanitizer 대신 -fsanitize=address라고 :

챈들러 Carruth는 this talk at GN13

주에 대해 이야기했다.

+0

이 오류가 발생합니다 - joshis1 @ (none) temp] $ gcc -g ef.c -o ef.out -fsanitize = address cc1 : 오류 : 인식 할 수없는 명령 줄 옵션 '-fsanitize = address' 사용할 수있는 gcc 버전? –

+0

내 gcc 버전은 [joshis1 @ (없음) 임시 직원] $ gcc --version gcc (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2) Copyright (C) 2011 자유 소프트웨어 재단 자유 소프트웨어입니다. 복사 조건에 대한 소스를 참조하십시오. 아무런 보증이 없습니다; 상품성 또는 특정 목적에의 적합성을 보장하지 않습니다. –

+0

죄송합니다. 명시 적으로 '현재'버전을 언급하는 것을 잊었습니다. gcc [4.8 버전부터] (http://gcc.gnu.org/gcc-4.8/changes.html)와 적어도 3.1 버전의 clang에서 지원되는 것으로 보입니다. – v154c1

0

는 Valgrind의와 EF는 동적으로 할당 메모리 오류를 감지합니다. 배열이 동적으로 할당되지 않았습니다.

+0

이러한 문제점을 감지하는 도구는 무엇이 될까요? –

+0

전기 울타리는 여전히 실패했습니다. 나는 여기에 대한 답을 찾고 있는데, 아무도 그와 관련된 질문조차도 대답하지 않았다는 것을 알 수 있었다. http://stackoverflow.com/questions/16159953/gcc-with-electric-fence-library-does-not-take-effect. 다음에해야 할 일을 모릅니다. –

0

valgrind에서 인용하면 "예를 들어 정적으로 할당되거나 스택에 할당 된 배열에 범위를 벗어난 읽기 또는 쓰기를 감지 할 수 없습니다."

+0

동적으로 할당 된 메모리에도 전기 펜스가 실패한 이유는 무엇입니까? –

2

valgrind --tool=exp-sgcheck ./buggy.out을 실행하고 로컬 변수 내에서 버퍼 오버런 한 것을 감지 할 수 있어야한다 t[5]

+0

다음 오류가 발생합니다 : [joshis1 @ (none) temp] $ valgrind --tool = exp-sgcheck ./ef.out valgrind : 플랫폼 'x86-linux'에 대해 'exp-sgcheck'도구를 시작하지 못했습니다. 그러한 파일 또는 디렉토리 $ sudo yum으로 valgrind를 설치하면 fg 시스템에 valgrind가 설치되었습니다. –

+0

exp-sgcheck은 Valgrind 3.7.0 이상에서만 사용 가능합니다. Valgrind 버전 또는'/ usr/lib/valgrind/exp *'에있는 파일을 확인하십시오. – jclin

0

, 당신이 사용할 수있는 (즉, 스택에) 범위를 벗어날에 액세스 정적으로 할당 된 메모리를 감지하려면 정적 코드 분석 도구.우리가 직장에서 사용하기 시작했습니다

하나는 Klocwork (memcheck의 제한 아래) Valgrind wiki page에 언급 한 바와 같이

, 그것은 바운드에 액세스 정적으로 할당 된 메모리가 감지 할 수있다. 위키 인용문 :

The experimental valgrind tool exp-sgcheck has been written to address this limitation in Memcheck. It will detect array overrun errors provided the first access to an array is within the array bounds.