저는 최근에 (적어도 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
file
5.36은 매우 명확합니다
file
5.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