은 그래서 간단한 버퍼 오버 플로우를 보여줍니다 코드의 간단한 조각이 :C에서 버퍼 오버플로를 잡을 수있는 도구는 무엇입니까?
#include <stdio.h>
int main(void)
{
char c[4] = { 'A', 'B', 'C', 'D' };
char d[4] = { 'W', 'X', 'Y', 'Z' };
printf("c[0] is '%c'\n", c[0]);
d[4] = 'Z'; /* Overflow that overwrites c[0] */
printf("c[0] is '%c'\n", c[0]);
return 0;
}
출력 :
$ ./a.out
c[0] is 'A'
c[0] is 'Z'
내가 다음 GCC 옵션을 사용하여이 코드를 컴파일 시도하고 비행과 함께 전달 색상 :
gcc -Wall -Wextra -Wformat=2 -Wswitch-default -Wcast-align -Wpointer-arith \
-Wbad-function-cast -Wstrict-prototypes -Winline -Wundef -Wnested-externs \
-Wcast-qual -Wshadow -Wwrite-strings -Wconversion -Wunreachable-code \
-Wstrict-aliasing=2 -ffloat-store -fno-common -fstrict-aliasing \
-Wstack-protector -fstack-protector-all -std=c99 -pedantic -O0 -ggdb3
또한 libefence 및 Valgrind의을 시도했다. 리바운드는 힙에 대한 읽기/쓰기를 벗어나지 않기 때문에 통과 할 것으로 예상했지만 valgrind가 통과되면 놀랐습니다.
이 코드는 c [4]와 d [0]이 겹쳐지기 때문에 Segfault를 생성하지 않으며 도구를 놓치게하는 원인이라고 생각합니다.
그래서 무엇이 있습니까? CAN 이걸 잡으시겠습니까? 리눅스에서 작동하는 것은 무료 일 것입니다.
최신 버전을 시도 할 수 있습니다. –
당신 말이 맞아요, 불행하지만 'cppcheck'는 그렇습니다! – SiegeX
실망스러운 gcc는 이것을 잡아 내지 못한다. 필자는 잠시 후에 역 참조가되지 않는 배열 끝 포인터에 대해 가짜로 경고하는 컴파일러 버그를 해결해야한다는 것을 고려해 보았다. http://stackoverflow.com/questions/1168525/c-gcc4-4-warning-array-subscript-is-above-array-bounds를 참조하십시오. 내 생각에 gcc *는 이것을 진단 할 필요가 없지만 옵션을 사용하지 않거나 반대 컴파일러 버그를 찾은 것 같아요. –