Fstack-protector-strong option

2024. 2. 19. 15:17STUDY/SS

반응형

Fstack-protector-strong option은 gcc compile option 중 하나이다.

stack 보호 기능을 강화하기 위해 사용됨. 이 옵션은 프로그램의 stack frame에 보안 관련 체크를 추가하여, stack buffer overflow 공격으로부터 프로그램을 보호하는데 도움을 준다.

‘-fstack-protector-strong’ 옵션은 다음과 같은 방식으로 작동한다.
1. 함수의 stack frame에 “canary”라고 불리는 random 값을 삽입한다. 이 값은 함수가 호출될때 생성, 함수가 반환될때 검사된다.
2. 함수가 반환되기 전에 이 값이 변경되었는지 확인한다. 만약 canary 값이 변경되었다면, 이는 버퍼오버플로우가 발생했음을 의미한다. 프로그램은 오류 메시지를 출력하고 즉시 종료됨.

근데 이걸 추가했더니, daemon crash가 발생.

Backtrace 해봤더니,
calloc 에서 발생했다.
첫번째 문제는, calloc의 첫번째 매개변수에 0을 넣어주면 안된다.
예를들어
Int *array = (int*)calloc(0, sizeof(int))를 해주면, 최소한의 메모리 할당 또는.. 메모리 할당을 안하게 되는거임.
근데 array[0] = 10이런식으로 접근하면 당연히 에러 뜨게됨.

두번째로는,
calloc은 동적메모리 할당을 수행하고, 할당된 mem을 모두 0으로 초기화 하는 기능 제공.
따라서 이미 0으로 초기화되어있는데, 중복으로 memset으로 또 초기화 해줄 필요가 없는거임.
근데 중복 사용된게 문제.
뒤에 memset을 지워주면됨.

세번쨰로 추가 언급할 부분은,
malloc 으로 할당한 메모리 블록을 memset을 사용하여 초기화 하는것은
일반적인 방법이라는것. malloc은 메모리 할당만하고 초기화는 하지않아서, 할당된 메모리에는 쓰레기 값이 있을수 있음. 따라서, 특정한 값으로 초기화 하고 싶을때 memset을 이용한다.

728x90
반응형