Search

Linux

소프트웨어 보안을 위한 리눅스

1. 리눅스 시스템과 보안

서버, 모바일 등 대부분의 인프라가 리눅스 기반으로 작동.
오픈소스이자 보안 연구/교육에서 접근성이 높고, 시스템콜·메모리·파일 관리 등 저수준 이해가 필수.
시스템콜파일 디스크립터는 개발·보안 모두에서 핵심 개념.

2. 시스템콜(System Call)과 커널

시스템콜:
커널이 제공하는 H/W, 파일, 네트워크, 메모리 등 시스템 자원 접근 함수
높은 권한(커널 레벨)으로 동작
예시: getpid, execve, mmap, open, read, write, socket
커널(Kernel):
운영체제의 핵심, Ring0(최고 권한), ARM은 Supervisor Mode
수행 흐름:
1.
유저 레벨에서 함수 호출
2.
레지스터(eax 등)에 시스템콜 넘버 세팅
3.
int 0x80 등 소프트웨어 인터럽트
4.
커널 진입 → sys_call_table[] 인덱싱 → 실제 커널 함수 실행
5.
커널 스택 → 유저 스택 복귀

3. 시스템콜, PLT, GOT

PLT (Procedure Linkage Table):
동적 링킹된 라이브러리 함수의 호출 위치를 중계하는 code section의 점프 테이블
GOT (Global Offset Table):
동적 링킹 시 실제 함수 주소를 기록하는 data section 테이블
실행:
PLT→GOT→실제 함수(라이브러리, 커널 등)로 점프

4. 시스템콜 vs API

API: 고수준 라이브러리 함수, 내부적으로 시스템콜을 감싼 구조(printf 등).
시스템콜: 커널 제공 저수준 함수, 직접적으로 커널 자원에 접근.

5. 파일 디스크립터(File Descriptor)

정의:
OS가 프로세스마다 할당하는 리소스 식별자 번호.
모든 입출력(파일, 네트워크, 키보드, 터미널, 파이프 등)을 FD로 구분.
표준 FD:
0: stdin, 1: stdout, 2: stderr
리디렉션, dup2 등으로 FD 매핑 변경 가능.
입출력 채널:
Argument Vector(프로그램 인자), STDIO(터미널), 파이프, 파일, 네트워크, 환경변수, 공유메모리, 시그널, 디바이스 드라이버 등

6. 데이터 포맷과 hexdump

텍스트/바이너리:
ASCII, 유니코드(UTF-8), 바이너리(0/1)
텍스트 파일은 바이너리 파일의 부분집합
hexdump:
모든 데이터(실행파일, 텍스트 등)를 16진수로 출력/분석 가능

7. 공유 라이브러리와 링킹 구조

정적 라이브러리(.a):
프로그램의 코드와 합쳐져 하나의 segment로 로딩, ASLR 등 효과 미미
임베디드 등에서 주로 사용
동적 라이브러리(.so):
실행 시 별도 segment로 로딩, 각 실행마다 주소 랜덤화(ASLR 효과)
Windows: dll, Mac: dylib
링킹타임 vs 런타임:
링킹타임: 빌드시 라이브러리 결정
런타임: 실행 중 동적 로드(dlopen 등), 경로 공격/우회 가능

8. ASLR (Address Space Layout Randomization)

개념:
실행 파일, 스택, 힙, BSS, 공유 라이브러리 등 각 segment의 시작 주소를 매 실행마다 무작위로 할당
효과:
공격자가 버퍼 오버플로우, ROP 등의 주소 예측/공격을 어렵게 만듦
동작:
Segment 단위로 작동, 라이브러리/스택/힙 등 모두 randomize

9. 메모리 보호와 공격 기법

버퍼오버플로우(Buffer Overflow):
스택 프레임 내 return address 등 제어값 덮어써 임의 코드 실행 가능
NX/DEP(Data Execution Prevention):
데이터 영역(스택/힙) 실행 금지
R/W/X 권한 분리(일부 예외: JIT)
ROP(Return Oriented Programming):
삽입 코드 없이 메모리 내 기존 명령어(gadget) 체인으로 임의 명령 실행

10. ASLR 우회 및 정보 유출

정보 유출(Infoleak):
메모리의 실제 주소 등 내부 정보가 노출될 때 ASLR 방어가 무력화될 수 있음
예시:
printf format string 버그(printf("%s"); 등 인자 미지정) → 메모리 임의 영역 노출

11. 공격/방어 흐름의 진화

BoF → DEP/NX → ROP → ASLR → Infoleak → Fine-grained ASLR → JIT ROP 등으로 계속 발전

12. 실전 코드 예시

c CopyEdit void main(){ char name[8]; printf("whats your name?\n"); scanf("%s", name); // 입력 제한 없음 → BOF 취약 }
C
복사
폰노이만 구조:
데이터와 코드가 동일하게 취급
입력 데이터가 실행 코드로 변환될 수 있음