모든 괜찮은 C 프로그래머가 알아야 할 몇 가지 개념 / 기술 / 언어 기능은 무엇입니까 (일반적인 소프트웨어 엔지니어링 및 유사 사항은 제외하고 C 관련 항목에만 집중). 내 C 지식의 가능한 격차를 메울 수 있도록 알고 싶습니다.
2 + 2 = 4
모든 괜찮은 C 프로그래머가 알아야 할 몇 가지 개념 / 기술 / 언어 기능은 무엇입니까 (일반적인 소프트웨어 엔지니어링 및 유사 사항은 제외하고 C 관련 항목에만 집중). 내 C 지식의 가능한 격차를 메울 수 있도록 알고 싶습니다.
2 + 2 = 4
답변:
C에만 해당됩니까? 대부분의 절차 언어에 공통적 인 표준 구성 외에도 다음과 같이 말해야합니다.
피타 그라스의 답변에 대한 언급에서 "버퍼 오버플로"를 언급했는데 아마도 내가 의미하는 바를 분명히해야 할 것입니다. C에서는 알고 충분하지 않습니다 것을 메모리로 직접 작업하는 것은 위험하다 - 당신은 또한 위험있는 정확한 방법을 이해해야합니다. 나는이 모든 경우에 대해 "발로 자신을 찍는"은유를 좋아하지 않습니다. 많은 시간 동안, 그것은 당신 이 방아쇠 를 당기는 것이 아니라 종종 당신이나 당신의 사용자에 반하는 관심을 가진 배우입니다. .
당신이 함수를 호출 할 때, 함수의 반환 주소가 스택에 배치됩니다 - 예를 들어, 내림차순 스택과 아키텍처 (x86 및 ARM 일반적으로 포함 된 가장 인기있는 아키텍처는이 법안에 맞게) 이후 에 정의 로컬 변수를 기능의 본문. 따라서 버퍼를 로컬 변수로 선언하고 버퍼 오버플로를 확인하지 않고 해당 변수를 외부 세계에 노출하면 다음과 같이됩니다.
void myFn(void) {
char buf[256];
gets(buf);
}
외부 사용자는 스택에서 반환 주소를 덮어 쓰는 문자열을 보낼 수 있습니다. 기본적으로 현재 함수로 이어지는 호출 그래프에 대한 프로그램의 런타임 아이디어를 변경할 수 있습니다. 따라서 사용자는 아키텍처에 대한 일부 실행 코드의 이진 표현, 스택에서 오버플로하기에 충분한 패딩 myFn
및 반환 주소를 덮어 쓸 수있는 추가 데이터를 제공하는 문자열을 myFn
제공합니다. 이러한 상황이 발생하면 myFn
일반적으로 호출자에게 제어권을 반환 했을 때 악의적 인 사용자가 제공 한 코드로 분기됩니다. 신뢰할 수없는 사용자에게 노출 될 가능성이있는 C (또는 C ++) 코드 를 작성하는 경우이 공격 경로를 이해해야합니다.. 스택에 대한 버퍼 오버플로가 힙에 대한 버퍼 오버플로보다 종종 (항상 그런 것은 아님) 종종 더 쉽게 이용 가능한 이유를 이해해야하며 힙의 메모리가 어떻게 배치되는지 이해해야합니다. • 그래도 아이디어 malloc()
'에드 영역은 프로그램이 다른에서 충돌 왜 이해하는 데 도움이 주변의 제어 구조가 malloc()
, 나에를 free()
).
C는 머신 작동 방식에 대한 상세 정보를 제공하며 오늘날 널리 사용되는 다른 사용자 편집 언어보다 머신을 직접 제어합니다. 강력한 힘을 발휘하면 큰 책임이 따릅니다. 실제로 C와 안전하고 효과적으로 작업하려면 이러한 하위 수준의 세부 사항을 이해해야합니다.