checksec를 통해 secure compile 정보를 알 수 있다.
https://github.com/slimm609/checksec.sh
GitHub - slimm609/checksec.sh: Checksec.sh
Checksec.sh. Contribute to slimm609/checksec.sh development by creating an account on GitHub.
github.com
우선 3가지 방향으로 compile을 해봤다.
test$ gcc pie_test.c -o default_pie
test$ gcc -static pie_test.c -o without_pie
test$ gcc -pie -fPIE pie_test.c -o with_pie
x86_64에서는 default로 PIE를 지원하고 있다.
Arm에서는 어떤지 알아보자
test$ aarch64-none-linux-gnu-gcc pie_test.c -o default_arm_pie
test$ aarch64-none-linux-gnu-gcc pie_test.c -static -o static_arm_pie
test$ aarch64-none-linux-gnu-gcc pie_test.c -fPIE -pie -o with_pie_arm_pie
Default로 PIE가 지원하지 않음을 알 수 있다. PIE를 위해서는 -fPIE -pie가 필요하다.
-fPIE는 compile option이고 -pie는 linker option이라고 한다.
stack canary에 대해 확인해보자
canary를 지원하기 위해서는 -fstack-protector-all를 추가해야 한다.
FORTIFY 추가: -D_FORTIFY_SOURCE=2
이건 -O를 함께 요구하기도 한다.
RELRO로 한번 넣어보자.:Relocation Read-Only : -Wl,-z,relro,-z,now
test$ aarch64-none-linux-gnu-gcc pie_test.c -fPIE -pie -fstack-protector-all -O -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now -o with_fortify
Symbols : -s
test$ aarch64-none-linux-gnu-gcc pie_test.c -fPIE -pie -fstack-protector-all -O -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now -s -o with_fortify
* NX: "No eXecute" 영역이 적용되어 있는지 여부를 나타냅니다. 이 기능은 데이터 섹션에서 실행할 수 있는 코드 실행을 막아서, 공격자가 바이너리에 대한 취약점을 악용하는 것을 방지합니다.
* RPATH: ELF 바이너리에서 실행 시 참조할 라이브러리 경로를 지정하는데 사용됩니다. RPATH는 보안 위험이 발생할 수 있는 기능 중 하나로, 바이너리가 취약점을 가지고 있는 경우, 공격자가 RPATH를 이용하여 공격할 수 있습니다.
* RUNPATH: RPATH와 비슷한 역할을 하지만, 라이브러리 경로를 찾는 방법이 다릅니다. RUNPATH는 LD_LIBRARY_PATH와 같이 컴파일러나 링커에서 지정된 환경 변수에서 라이브러리 경로를 찾습니다.
* FORTIFY: FORTIFY는 C 라이브러리 함수를 보안 강화된 버전으로 대체하는 방식으로, 버퍼 오버플로우나 포맷 문자열 취약점 등의 보안 문제를 방지합니다.
* Symbols: ELF 바이너리에서 전역 심볼이 제대로 제한되었는지 여부를 나타냅니다. 이 기능은 공격자가 ELF 바이너리 내부의 함수나 변수의 위치를 찾아서 악용하는 것을 방지합니다. 따라서, 이 기능이 활성화되어 있으면 ELF 바이너리가 더욱 안전하게 실행될 수 있습니다.
* RELRO: RELRO는 "RELocation Read-Only"의 약자로, 바이너리의 메모리 매핑을 보호하는 기능입니다. 바이너리가 실행될 때, 공유 라이브러리나 동적 연결된 라이브러리들을 메모리에 로드합니다. 그런데 이러한 라이브러리들이 바이너리의 일부로 취급될 경우, 메모리 매핑이 변경될 수 있습니다. 이 때, 공격자가 바이너리의 실행 흐름을 변경하여 악용할 수 있습니다. 이를 방지하기 위해 RELRO 기능을 사용하여 바이너리의 메모리 매핑을 읽기 전용으로 설정합니다. RELRO 기능은 Partial RELRO와 Full RELRO가 있으며, Full RELRO는 보안성이 높아 추천되는 옵션입니다.
'Programming > linux왕초보' 카테고리의 다른 글
Glances failed (0) | 2025.02.11 |
---|---|
Valgrind: Find memory leak, uninitialized value (0) | 2023.06.11 |
REPO_URL 수정하여 local에서 repo 사용 (0) | 2022.08.23 |
[Linux] print file path (0) | 2021.12.22 |
[python] read file, write file (0) | 2021.12.15 |
ssh사용 시 diffie-hellman-group1-sha1 관련 (0) | 2018.01.30 |
pthread min, max priority on linux (0) | 2017.06.12 |
use vim like as source insight (0) | 2016.04.06 |
[ubuntu] change default shell (0) | 2016.03.22 |
GDB를 사용한 CORE 파일의 분석 (0) | 2016.02.05 |