2016-11-28 6 views
3

리눅스에서 바이너리의 실행을 자신이 컴파일 한 바이너리로 제한하려고합니다. 내 시스템에 gcc 버전 4.8.4가 있다고 가정하면 시스템에 설치된 gcc로 컴파일 된 ELF 바이너리를 실행할 수 있습니다. 동일한 버전 4.8.4로 컴파일 된 ELF는 내 시스템에서 실행해서는 안됩니다.특정 컴파일러에 의해 생성 된 바이너리의 실행

.comment 섹션에는 ELF를 컴파일하는 데 사용되는 컴파일러의 버전과 이름이 포함되어 있습니다. 이 정보를 사용할 수 있다면 어떻게 할 수 있습니까? 모든 아이디어와 제안을 많이 듣습니다.

답변

0

리눅스에서 자신이 컴파일 한 바이너리의 실행을 제한하고 싶습니다.

당신이 이것을 성공했다고 가정하십시오. 을 수행 할 경우gcc, ls이 모두 즉시 작동을 멈추는 것을 인식합니다 (직접 설정 한 경우가 아니면 으로 제한을 설정).

하지만 컴파일러, 어셈블러 및 링커를 포함하여 전체 시스템을 빌드했다고 가정합니다. 이 경우 링커가 링크 된 바이너리에 서명하고 커널이 유효한 서명이 있는지 확인하고 서명이 유효하지 않은 경우 바이너리 실행을 거부하도록 링커와 커널을 수정해야합니다. 코드 서명 here에 대한 자세한 내용을 볼 수 있습니다.

.comment 섹션에는 ELF를 컴파일하는 데 사용되는 컴파일러의 버전과 이름이 포함되어 있습니다.

일반적으로 발생합니다. 그러나 이미 링크 된 실행 파일에 임의의 내용이있는 .comment 섹션을 추가하는 것은 쉬운 일이 아니므로 .comment의 내용을 제한 할 수는 없습니다 (제한을 생략하지 않는 한).

링커를 변경하지 않고도 내 인생을 쉽게 할 수 있습니까?

예.

나는 당신이 당신의 문제에 대해 당신의 솔루션의 실체에 대해 생각하기 전에 역학에 대해 생각하고 있다고 생각합니다. 당신은 코드 서명을하고 싶지 않는 가정

, 당신은 모든 바이너리에 대한 서명을 생성해야하고 있습니다 : 커널이 서명이 유효한지 확인하는

  1. 어떤 수단을 가지고 있고,
  2. 이진에 서명을 첨부하십시오. 이것은 실행하고자하는 모든 바이너리에 대해 foo과 같은 디렉토리에 foo.signature을 가지고있는 것처럼 쉽습니다. 또는 objcpy을 사용하여 바이너리 자체의 서명 부분을 만들 수 있습니다 (바이너리를 이동하는 경우 더 편리합니다).
+0

예 독서 후에도 마찬가지라고 생각합니다. 링커를 변경하지 않고도 내 인생을 쉽게 할 수 있습니까? 어떤 문자열로 일부 섹션을 추가하고 실행하기 전에 문자열을 매치시키기 위해 커널을 조정할 수 있다고합니다. (어디서 얼마나?) – shami

+0

@shami 답변을 업데이트했습니다. –