1. checksec 이란?
리눅스에서는 다양한 바이너리 보호기법이 존재하며, 적용된 보호기법에 따라 익스플로잇 설계가 달라진다.
checksec을 통해 바이너리에 적용된 보호기법을 확인할 수 있다.
checksec은 pwntools 설치시 자동으로 설치되며 github를 통해서도 사용할 수 있다.
checksec을 통해 바이너리 보호기법 확인
usage: checksec [-h] [--file [elf [elf ...]]] [elf [elf ...]]
2. 보호기법
checksec에서 제시하고 있는 보호기법에 대해서 알아보자.
Arch (Architecture)
Arch는 해당 바이너리가 컴파일 된 환경을 나타낸다. 위 이미지에서 나타난 amd64-64-little은 해당 바이너리가 64비트 x86 아키텍처에서 실행되도록 컴파일되었고, little-endian 방식으로 데이터를 저장한다는 것을 나타낸다.
RELRO (RELocation Read-Only)
RELRO는 ELF 바이너리 또는 프로세스의 데이터 영역에 읽기 전용(Read-Only) 권한을 설정하여 메모리가 변경되는것을 막는 보호 기법이다. 아래 세 가지 설정이 존재한다.
- NO RELRO : ELF 기본헤더, 코드영역을 제외한 거의 모든 부분에 RW 권한을 부여한다.
- Partial RELRO : NO RELRO와 비슷하지만 .ctors(.init_array), .dtors(.fini_array), .jcr, .dynamic
영역이 Read-Only며, .got.plt, .data, .bss 영역에는 Write 할 수 있다.
- Full RELRO : .data, .bss 영역을 제외한 모든 영역이 Read-Only로 설정된다.
Stack
Stack Canary 기법은 스택 버퍼 오버플로우 공격을 방어하기 위한 보호 기법 중 하나이다. 이 기법에서는 함수의 프롤로그에 카나리라는 작은 무작위 값(Canary)을 스택에 푸시하고, 함수의 에필로그에서 이 값을 확인하여 변경되었는지를 검사한다.
NX (No-eXecute)
NX는 메모리 페이지의 실행 여부를 제어하는 보호 기법이다. 스택이나 힙과 같은 영역에서 코드의 실행을 방지하여 메모리 기반 공격, 특히 쉘코드의 실행을 방지하는 데 사용된다.
PIE (Position Independent Executable)
PIE는 바이너리가 메모리 상의 임의의 위치에 로드될 수 있게 하는 기법이다. 이로 인해 각 실행 시마다 바이너리의 메모리 주소가 변경되며, 공격자가 메모리 주소를 예측하는 것을 어렵게 만든다.
참고 사이트
https://hackyboiz.github.io/2021/10/27/y00n_nms/linux-mitigation/
https://howd4ys.github.io/2019-01-02/RELRO-is-fun1
https://learn.dreamhack.io/99