Linux 바이너리가 위치 독립적 코드로 컴파일되었는지 테스트하는 방법은 무엇입니까?

Linux 바이너리가 위치 독립적 코드로 컴파일되었는지 테스트하는 방법은 무엇입니까?

저는 최근에 (적어도 Fedora 및 Red Hat Enterprise Linux에서는) PIE(위치 독립적 실행 파일)로 컴파일된 실행 파일이 더 강력한 ASLR(주소 공간 무작위화) 보호를 받는다는 사실을 알게 되었습니다.

그래서: 특정 실행 파일이 위치 독립적 실행 파일로 컴파일되었는지 여부를 Linux에서 테스트하는 방법은 무엇입니까?

답변1

perl패키지 에 포함된 스크립트를 사용할 수 있습니다 hardening-check.페도라에서 사용 가능그리고더반(처럼 hardening-includes). 이것을 읽어보세요데비안 위키 페이지확인할 컴파일 플래그에 대한 세부정보입니다. 이는 Debian에만 해당되지만 이론은 Red Hat에도 적용됩니다.

예:

$ hardening-check $(which sshd)
/usr/sbin/sshd:
 Position Independent Executable: yes
 Stack protected: yes
 Fortify Source functions: yes (some protected functions found)
 Read-only relocations: yes
 Immediate binding: yes

답변2

file바이너리에서 사용하십시오.

$ file ./pie-off
./pie-off: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=0dc3858e9f0334060bfebcbe3e854909191d8bdc, not stripped
$ file ./pie-on
./pie-on: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=962235df5bd188e1ec48c151ff61b6435d395f89, not stripped

LSB 정보 뒤에 인쇄되는 다양한 유형에 유의하세요.

답변3

file5.36은 매우 명확합니다

file5.36 실제로 실행 파일이 PIE인지 명확하게 인쇄합니다. 예를 들어 PIE 실행 파일은 다음과 같이 나타납니다.

main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped

비 PIE는 다음과 같습니다.

main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

이 기능은 5.33에서 도입되었지만 간단한 chmod +x확인만 수행합니다. 이전에는 PIE용으로만 인쇄했습니다 shared object.

5.34에서는 보다 전문화된 ELF 메타데이터 검사를 시작해야 했지만 DF_1_PIE구현의 버그로 인해 실제로 문제가 발생하고 GCC PIE 실행 파일이 shared objects.

file오류를 포함한 소스 코드와 검사하는 ELF 형식의 정확한 바이트를 아래 세부 정보와 함께 설명했습니다 .https://stackoverflow.com/questions/34519521/why-does-gcc-create-a-shared-object-instead-of-an-executable-binary-according-to/55704865#55704865

문서 5.36의 동작을 간단히 요약하면 다음과 같습니다.

  • 만약에Elf32_Ehdr.e_type == ET_EXEC
    • 인쇄executable
  • 그렇지 않으면Elf32_Ehdr.e_type == ET_DYN
    • DT_FLAGS_1동적 부분 항목이 존재하는 경우
      • DF_1_PIE다음 으로 설정된 경우 DT_FLAGS_1:
        • 인쇄pie executable
      • 기타
        • 인쇄shared object
    • 기타
      • 파일이 사용자, 그룹 또는 다른 사람에 의해 실행 가능한지 여부
        • 인쇄pie executable
      • 기타
        • 인쇄shared object

GDB는 실행 파일을 두 번 실행하고 ASLR을 봅니다.

당신이 할 수 있는 매우 간단한 일 중 하나는 GDB를 통해 실행 파일을 두 번 실행하고 ASLR로 인해 실행 중에 주소가 변경되는지 확인하는 것입니다.

아래에서 이 작업을 수행하는 방법을 자세히 설명했습니다.https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld/51308031#51308031

이것이 반드시 가장 실용적인 솔루션은 아니며 실행 파일을 신뢰하지 않는 경우에는 불가능하지만 흥미롭고 우리가 정말로 관심을 두는 최종 검사(Linux 커널/동적 로더가 실행 파일을 변경했는지 여부)를 수행합니다. 위치든 아니든.

답변4

Bash 스크립트가 있습니다Github의 checksec.sh실행 가능한 완화 속성(RELRO, Stack Canary, NX 비트, PIE, RPATH, RUNPATH, Fortify Source 포함)을 확인하세요.

checksec-f(파일 입력) 인수 로 실행:

$ checksec -f /usr/bin/bash

RELRO           STACK CANARY      NX            PIE             RPATH     RUNPATH      FORTIFY Fortified Fortifiable
Full RELRO      Canary found      NX enabled    PIE enabled     No RPATH   No RUNPATH    YES      13        33

관련 정보