정보보안개론 0x04

Kail-KM
|2015. 1. 21. 01:42

Code Security


시스템과 프로그램에 대한 이해


1. 시스템 메모리의 구조

  • 스택 영역과 힙 영역

어떤 프로그램을 동작시키면 메모리에 프로그램이 동작하기 위한 가상의 메모리 공간이 생성된다. 이떄 상위 메모리는 스택(Stack) 이라는 메모리 공간이 형성되고, 하위메모리에는 힙(Heap)이 생성된다.

스택 영역은 프로그램 로직이 동작하기 위한 인자(Argument)와 프로세스 상태를 저장하는데 사용되고, 힙 영역은 프로그램이 동작할떄 필요한 데이터 정보를 임시로 저장하는데 사용된다.

스택 영역은 레지스터의 임시 저장 장소, 서브루틴 사용시  복귀주소 저장, 서브루틴에 인자전달 등에 사용된다. 스택은 메모리의 상위주소에서 하위주소로 방향으로 사용하며 후입선출(LIFO) 원칙에 따른다.

힙 영역은 프로그램이 실행될 떄까지 알수 없는 가변적인 양의 데이터를 저장하기 위해 프로그램의 프로세스가 사용할 수 있도록 미리 예약되어 있는 메인 메모리의 영역으로, 프로그램들에 의해 할당되었다가 회수되는 작용이 되풀이 된다. 힙의 기억 장소는 대개 포인터 변수를 통해 동적으로 할당받고 돌려준다.


  • 레지스터
CPU 연산과 어셈블리어의 동작을 이해하기 위해 CPU의 임시 메모리인 레지스터에 대해 살펴보자 주로 많이 사용되는 인텔의 80x86 CPU는 프로그램의 동작을 위해 다음과 같은 레지스터를 제공한다.


레지스터의 명칭은 ESP의 경우 16비트의 레지스터 SP에 E를 추가한 거시다. 프로세서가 32비트로 커지면서 Extended라는 의미를 표현하기 위해 E를 붙인 것일뿐 SP와 기본적인 역할은 동일하다.


2. 프로그램의 실행구조
---생략---

3. 셸 (Shell)
셸은 운영체제를 둘러싸고 있으면서 입력받는 명령어를 실행시키는 명령어 해석기를 말한다. 셸의 종류는 크게 본셸, 콘셸,C셸로 나누어진다.

셸의 역할은 다음과 같다.
-자체의 내장 명령어 제공
-입력/출력/오류의 리다이렉션 기능 제공
-wildcard 기능 제공
-파이프라인 기능 제공
-조건부/ 무조건부 명령열(Sequences) 작성 기능 제공
-서브셸 생성 기능 제공
-후면처리 (Background Processing) 기능
-셸 스크립트(Shell Script, 프로그램) 자것ㅇ 가능

4. 프로세스 권한과 SetUID

SetUID는 유닉스 시스템을 해킹하는데 매우 중요한 요소로 SetUID 파일은 누가 실행하든지 관계없이 해당 파일이 실행될떄 파일 소유자의 권한을 갖는다는 특징이 있다.


Buffer Over Flow Attack


BOF의 개념은 C 언어의 데이터 무결성 문제로 알려졌으며, 초기에는 프로그램상의 문제로 인식되었으나 현재에는 다양한 BOF 공격 등으로 인하여 문제의 심각성이 인식되기 시작했다.

1. BOF 공격의 개념

BOF의 가장 기본적인 개념은 데이터의 형태와 길이에 대한 불명확한 정의로 인한 문제점 중에서 '길이에 대한 불명확한 정의'를 악용한 덮어쓰기로 인해 발생한다. 즉 정상적인 경우에는 사용되지 않아야 할 주소 공간, 원래는 경계선 관리가 적절하게 수행되어 덮어쓸 수 없는 부분에 해커가 임의의 코드를 덮어 쓰는 것을 의미한다.

불명확한 경계에 대한 문제는 여러가지 상황에서 다양한 형태로 일어나며 코드보안에서도 마찬가지이다. BOF에 취약한 함수와 그렇지 않은 함수가 있는데, 프로그래머가 취약한 특정 함수를 사용해야 공격이 가능하다. 그러므로 취약한 함수를 사용하지 않는 프로그래머만 있으면 BOF 공격이 훨씬 어려워 워 진다.

2. BOF 공격의 원리

bugfile.c

------------------------

int main(int argc,char *argv[])

{

char buffer[10];

strcpy(buffer,argv[1]);

printf("%s\n",&buffer);

}

------------------------

page. 265


3. BOF 공격에 대한 대응책

BOF 공격에 안전한 프로그램을 만드는 방법은 BOF에 취약한 함수를 사용하지 않거나 최신 운영체제를 사용하는 방법 등이 있다.


-BOF에 취약한 함수를 사용하지 않는다.

strcpy(char *dest, const char *src);

strcat(char *dest, const char *src);

getwd(char *buf);

gets(char *s);

fscanf(FILE *stream, const char *format,...);

scanf(const char *format,...);

realpath(char *path, char resolved_path[]);

sprintf(char *str. const char *format);

-최신 운영체제를 사용한다.

운영체제는 발전하면서 Non-Executable Stack, Stack Guard, Stack Shield 와 같이 운영체제 내에서 해커의 공격 코드가 실행되지 않도록 하는 여러 가지 장치가 있다.



Format String Attack


1. FS 공격의 개념

FS 공격은 데이터의 형태와 길이에 대한 불명확한 정의로 인한 문제점 중 '데이터 형태에 대한 불명확한 정의'로 인한 것이다. FS 라는 용어 자체는 낯설지 모르겠지만, C 프로그래밍을 배웠다면 이미 여러번 사용해본 공격이다.


Format String과 이것을 사용하는 printf()함수의 취약점을 이용하여 RET의 위치에 쉘코드의 주소를 write 하여 쉘을 획득 하는 공격.


Bufer Overflow Atack과 비교

ü RET의 위치 주소를 정확히 알아야 함 (BOF는 bufer와 RET사이의 거리만알면 됨)

ü Overflow 없이 RET에 바로 write할 수 있으므로 스택 가드나 canary를 우회 함


2. FS 공격의 원리

취약한 포맷 스트링

FS 공격은 포맷 스트링인 %s의 값을 바꾸는 것이다. 즉 명확하게 정의 되었던 데이터 형태를 불명확하게 바꾸는 것이다.


printf()는 format string이후에 해당 format string에 해당하는 인자가 없으면 Stack상에서 printf()가 호출된 시점에서 stack top위치의 내용부터 순서대로 인자로 여김


main()

{

char *buffer = "wishfree\n%x\n";

printf(buffer);

}

실헹시 wishfree 문자열 이외에 wishfree 문자열이 저장된 다음의 메모리에 존재하는 값또한 출력한다.


-별도 공부 필요


'Study > Book' 카테고리의 다른 글

정보보안개론 0x06  (0) 2015.01.23
정보보안개론 0x05  (0) 2015.01.22
정보보안개론 0x03  (0) 2015.01.13
정보보안개론 0x02  (0) 2015.01.12
정보보안개론 0x01  (2) 2015.01.11