[시스템 구성과 프로그램 동작]
(프로그램과 코드 보안)
- 하드웨어, 어셈블리어, 소스코드 중 보안 취약점이 가장 쉽게 발생하는 곳은 소스 코드
- 소스 코드에서 문제가 생기는 요인은’데이터의 형태와 길이에 대한 불명확한 정의
(시스템 메모리의 구조)
- 프로그램을 동작시키면 프로그램이 동작하기 위한 가상의 공간이 메모리에 생성
- 메모리 공간은 목적에 따라 상위 메모리와 하위 메모리로 나뉨
- 상위 메모리에는 스택, 하위 메모리에는 힙 생성
(스택영역)
- 프로그램 로직이 동작하기 위한 인자와 프로세스 상태를 저장하는 데 사용
- 레지스터의 임시 저장, 서브루틴 사용 시 복귀 주소저장, 서브루틴에 인자 전달 등에 사용
- 스택은 메모리의 상위 주소에서 하위 주소 방향으로 사용, 후입선출 원칙에 따라 나중에 저장된 값을 먼저 사용
(힙 영역)
- 프로그램이 동작할 때 필요한 데이터 정보를 임시로 저장하는 데 사용
- 프로그램이 실행될 때까지 알 수 없는 가변적인 양의 데이터를 저장하기 위해 프로그램 프로세스가 사용할 수 있도록 미리 예약된 메인 메모리 영역
- 힙 영역은 프로그램에 의해 할당되었다가 회수되는 작용을 되풀이함
- 힙의 기억장소는 포인터 변수를 통해 동적으로 할당받고 돌려주며, 연결 목록이나 나무, 그래프 등의 동적인 데이터 구조를 만드는 데 반드시 필요한
- 프로그램 실행 중에 해당 힙 영역이 없어지면 메모리 부족으로 이상 종료
(레지스터)
- CPU 의 임시 메모리로 CPU 연산과 어셈블리어의 동작에 필요
(스택과 레지스터의 실제 사용)
① push %ebp : 처음 main함수가 시작되면 main함수의 EBP 레지스터 값을 스택에 저장
② move %esp, %ebp : EBP레지스터는 항상 현재 스택 영역에서 가장 하위 주소를 저장
⑥ call function : funtion함수를 호출
⑦ pushl %ebp : function 함수의 기준 값으로, 현재 EBP 값을 스택에 저장
⑧ movl %esp,%ebp: 앞서 언급한 대로 function(1,2)의 시작에서도 프롤로그(pushl %ebp 명령과 movl %esp,%ebp)가 실행
⑩ movl 12(%ebp), %eax: EBP에 12바이트를 더한 주소 값의 내용(정수 2)을 EAX 값에 복사
⑪ ad이 %eax,8(%ebp) : EBP에 8바이트를 더한 주소 값의 내용(정수 1)에 EAX(10단계에서 2로 저장) 값을 더하면 8(%ebp) 값은 3이 됨
⑫movl 8(%ebp), %edx : EDX(extended data)레지스터는 입출력 연산에 사용하는 것으로, 큰 수의 곱셈과 나눗셈 연산 시 EXA와 함께 사용
‘movl 8(%ebp), %edx’ 명령은 EBP에 8바이트를 더한 주소 값의 내용 (정수3)을 EDX에 저장
(셀)
-운영체제를 둘러싸고 있으면서 입력받는 명령어를 실행하는 명령어
(셀의 역할)
- 자제에 내장된 명령어 제공
- 입력, 출력 오류에 대한 리다이렉 기능 제공
- 와일드카드 기능 제공
- 파이프라인 기능 제공
- 조건부, 무조건부 명령열 작성 기능 제공
- 서브셀 생성 기능 제공
- 후면 처리 기능
- 셀 스크립트(프로그램) 작성 기능
+버퍼 오버플로나 포맷 스트링 공격의 목적은 ‘관리자 권한의 셀’
+버퍼 오버플로나 포맷스트링 공격에서는 /bin/sh를 다음과 같이 기계어 코드로 바꿔 메모리에 올림(셀을 기계어로 바꾸는 이유는 메모리에 원하는 주소 공간을 올리기 위해서)
(SetUID)
- 유닉스 파일에 RWSR-XR-X로 권한이 설정되어 있는 경우를 말함
- SetUID 파일은 누가 실행하든 상관없이 해당 파일이 실행될 때 파일 소유자 권한을 갖는 것이 특징
(버퍼 오버플로 공격의 개념)
- 기본적인 버퍼 오버플로 공격은 데이터의 길이에 대한 불명확한 정의를 악용한 덮어쓰기로 발생
- 경계선 관리가 적절하게 수행되어 덮어쓸 수 없는 부분에 해커가 임의의 코드를 덮어쓰는 것을 의미
- 버퍼 오버플로에 취약한 함수와 그렇지 않은 함수가 있음 프로그래머가 취약한 특정 함수를 사용하지 않는다면 공격이 훨씬 어려워짐
(버퍼 오버플로 공격의 대응책)
- 버퍼 오버플로에 취약한 함수 사용X
- 최신운영체제 사용
(포맷 스트링 공격)
-
데이터의 형태에 대한 불명확한 정의 때문에 발생하는 문제점
-
formatstring.c 와 같이 포맷 스트링을 작성하는 것은 정상적인 경우로, 포맷 스트링에 의한 취약점이 발생하지 않음
-
여기서 사용된 %s 와 같은 문자열을 포맷 스트링이라고 함 이 값을 바꾸는 것을 포맷 스트링 공격이라 한다(명확하게 정의되었던 데이터 형태를 바꾸는 것)
-
포맷스트링을 이용하면 메모리의 내용을 변조할 수 있음
(메모리 해킹)
- 프로그램의 동작에 관여하지 않고, 프로그램이 실행되는 데 필요한 정보를 저장해둔 메모리를 조작하는 공격
- 게임머니나 아이템 조작과 같이 게임 해킹에 광범위하게 사용
- 백도어나 같은 프로그램을 설치하여 메모리에 있는 패스워드를 빼내거나 데이터를 조작하여 돈을 받는 계좌와 금액을 변경함
- 사용자가 인지하지 못하는 경우가 많고 휘발성이 강한 메모리의 특성상 흔적을 추적하기 어려움
- 메모리 해킹을 막으려면 메모리 주소에 저장되는 값을 암호화해야함
(리버스 엔지니어링)
- 바이너리에서 소스코드를 복원하는 과정
+코드보안의 역공학
(리버스 엔지니어링 사용분야)
- 취약점 분석 :
버퍼 오버플로우가 일어날 가능성이 있는지, 코드 변조를 통해 허가되지 않은 액션이 가능한지, 암호화 알고리즘에 취약점이 없는지 등을 분석. 공격자는 분석 결과를 가지고 취약점을 악용한 공격, 방어자는 취약점을 식별하고 대응 방안 강구
- 악성코드 분석 :
악성코드의 원리 및 비정상 행위 분석 및 악성코드 대응 보안 모듈 개발
- 버그수정 :
소프트웨어에 버그가 발생했을 때 원인 파악 밒 수정
- 소프트웨어 사용 제한 기능 제거 :
상용 프로그램 구매자 인증 메커니즘(일련번호 등 )우회
- 신기술 연구 :
새로운 기술을 이용한 소프트웨어가 출시되었을 때나 경쟁 회사 바이너리 파일 분석
- 디지털 포렌식 :
사이버 수사, 데이터 복구