1. Stack Buffer overflow 공격
1) strncpy() 사용해서 버퍼만큼만 복사하거나, if문으로 문자열 크기 비교체크해서 복사하면 해결
process가 메모리에 로딩되었을 때의 메모리 구조에는 몇몇의 영역으로 구분되어있다.
이는 low address부터 나열하면 다음과 같은 순서이다.
Code Area (실행코드 위치, 기계어)
Data Area (초기화 된 정적변수 및 전역변수)
BSS Area (초기화 되지 않은 정적변수 및 전역변수)
Heap (동적메모리 할당)
Stack (함수를 처리하기 위한 영역, 함수 내 로컬변수, 함수의 매개변수)
위 영역 중에 Stack 영역에서 Buffer overflow 를 이용한 공격방법은 아래와 같다.
예를들어 어떤 프로세스의 main함수에서 func() 함수를 호출될 때,
func() 함수 처리 후 돌아왔을 때 수행되어야할 주소 RET를 저장하고,
func() 함수를 기준으로 하기위해 기존의 main함수의 EBP 레지스터를 저장하고,
func() 함수의 로컬변수 등 처리를 위한 데이터들이 stack에 push/pop 되어가며 수행되다가
func() 처리가 끝나면, 위에서 저장했던 RET, EBP를 불러와서 기존 main함수로 되돌아 오게 된다.
위 과정에서 RET를 임의의 주소로 덮어쓸 수 있다면,
해커는 이를 악용해서 공격용 process를 미리 메모리에 로딩해놓고, 이 process의 주소로 덮어쓰게 하여,
새로운 shell을 root권한으로 실행하는 등의 행위로 root권한을 획득할 수 있게 된다.
위 공격을 하려면 2가지 조건이 전제되어야 한다.
1) 공격에 이용하려는 프로세스는 root 소유이고, setuid가 설정되어 있어야 한다.
2) 악용하기 위한 공격용 process를 미리 메모리에 로딩해놓아야 한다.
* CPU에는 여러 레지스터가 있지만, 아래 3가지를 참고하자.
1) ESP : 스택 연산이 발생하는 스택 프레임의 최상위 포인터 (EBP를 기준으로 상대위치 의미)
2) EBP : 해당 스택 프레임의 베이스 포인터
3) EIP : 다음에 실행할 명령어의 주소값을 가지고 있다. (= Program Count)
2. Race Condition 공격
1) A 프로세스가 /tmp 디렉토리에 tmp.dat 라는 파일을 생성하고 오픈해서 write를 한다고 하고,
A프로세스가 root소유의 프로세스이고, tmp.dat 라는 파일에 root권한을 가지도록 setuid를 한다고 가정.
이 시점을 캐치하여, 공격용 프로세스를 통해 tmp.dat라는 동일한 이름의 파일을 심볼릭 링크파일로 해서
/etc/shadow와 같이 중요한 파일에 링크를 건 파일을 생성시킨다.
2) 위 과정에서 A 프로세스와 공격용 프로세스가 tmp.dat라는 파일을 누가 먼저 생성 시키는지의 race가 발생하게 된다.
정상적인 경로를 통해 A 프로세스가 먼저 tmp.dat 파일을 생성시키면,
공격용 프로세스는 이 파일을 지우고, 자신이 생성시킨 파일을 수행하도록 유도할 것이다.
** 여기서도 마찬가지로 공격에 이용하려는 A 프로세스는 root 소유이고, setuid가 설정되어 있어야 한다.
3. Format String 공격
1) process가 메모리에 로딩되었을 때의 메모리 주소에 잘못된 데이터를 덮어씀으로 인한 공격
2) printf 계열의 함수 사용 시 틀리지 않고 쓰면 해결, %n은 변수의 주소값 이다.