1. 버퍼 오버플로우 공격
가. 버퍼 오버플로우
1) 개념
하나의 공격방법으로 할당된 메모리 경계에 대한 검사를 하지 않는 프로그램의 취약점을 이용해서 공격자가 원하는 데이터를 덮어쓰는 방식이다. 메모리에 발당된 버퍼의 양을 초과하는 데이터를 입력한다
2) 버퍼 오버플로우 원인
3) 버퍼오버플로우의 동작 원리
내가 개발자인데, strcpy이나 strcat 함수를 쓰면 혼날 수 있음. 매우 좋은데 위험함.
함수 안에서 쓰이는 변수는 지역변수, 전체 프로그램을 연결하는 프로그램은 전역변수임.
코딩은 여러명이 하는데, 전역변수는 함부러 넣으면 큰일남.
전역변수는 데이터, 지역변수는 스택에 만들어짐.
서로 영역이 있는데, 프로그램을 만지다보면 서로의 영역을 침범하게 됨 -> 잘못된 연산을 하게 됨.
4) 버퍼 오버플로우 대응수단
(1) 스택이나 힙에 삽입된 공격자의 코드가 실행되지 못하도록 한다.
(2) 그 위치는 고정하지 않아서 해커가 예측하기 어렵게하고
(3) 주소를 고정시키면 해커가 알기 때문에 위치를 바꿔주기
(4) 함수의 스택프레임에 대해 손상이 있는지를 확인
서브루틴
루틴 = 함수,
함수를 쓰지 않고 프로그램을 짜면 똑같은 소스의 반복을 계속 적어야함. 근데 이건 비효율적이니까.
반복되는 구간을 함수로 뺌. 이걸 funtion으로 만든 담에, 필요한 구간에 함수를 호출함.
이렇게 프로그램을 짜는게 서브루틴임. ->소스의 길이를 짧게할 수 있음. 또한, 같은 내용을 가지는 함수들의 내용 변화도 쉽게 만들 수 있음(함수 하나만 고치면 되니까)
원래 프로그램은 순차처리하다가 함수를 만나면 함수로 점프를 뜀. 그리고 작업이 끝나면 리턴해서 내 할일 함.
원래느 주기억장치 한 줄이 있으면 함수를 점프를 뛰었다가 일 처리하고, 복귀하고를 반복하는데, 해커가 악성 프로그램을 주기억장치에 숨김. 그리고 어떻게 해서든 이걸 실행해야지. 리턴할 때 리턴 메모리를 악성코드가 숨어있는
번지 위에 보냄. 그럼 이때 숨어있던 악성코드가 실행됨. 이것을 막기 위해 함수의 진입과 종료 코드를 조사하고 함수의 스택 프레임에 대해 손상이 있는지를 검사함. 그래서 프로그램 루틴이 악성코드쪽으로
(9) cpu nx기술로 효과적으로 버퍼오버플로우를 파단할 수 있다 -> 아예 실행되지 못하게 함.
tip 램 디스크
5) C언어에서 버퍼 오버플로우에 취약한 함수
취약한 함수와 안전한 함수가 있는데 취약한 함수가 쓰기가 편리하고 강력함. 그래서 개발자들은 이걸 쓰고 싶어함. 근데 편리한 만큼 위험이 좀 있음. 스트럭카피, 스트럭 캣 등.
리스트를 다 외울 수는 없고, 구분하는 법이
fsscanf()는 최근 사용하지 말것을 권장하는 함수로 바뀜.
취약한 함수와 권장함수를 잘 비교하면, 사용을 권장하는 함수는 제한을 거는 플래그를 가짐.
6) C언어에서 사용을 권장하는 함수
7) 안전한 코딩 기술
아예 설계때부터 보안 적용해서 설계
발생할 수 있는 에러 고치기
쓰지 말라고 개발전 개발자들을 교육함. 쓰지말라는 함수를 배포함.
끝나면 업체에서 와서 개발자들이 개발한 프로그램의 보안성 적합도를 체크함.
나. 스택 버퍼 오버플로우
1) 개념
프로세스 메모리의 구조
스택, 주기억장치, 프로그램이 실행되면 주기억장치, 램에 적재됨.
하나의 프로세스는 실행중인 프로그램이고 그 프로세스를 자세히보면 스택, 힙, 데이터, 코드로 나누어져있음.
스택은 지역변수, 스택은 먹고 토하기 방식을 사용함 LIFO 방식, 푸쉬 팝
서브루틴,
서브루틴에서 호출되는 루틴으로부터 복귀할 때 필요한 복귀 주소를 스택에 저장한다.
명령어를 순차처리하다가 특정함수로 점프 뜀. 그러면 점프뛸 때 리턴 주소를 푸쉬해서 스택에 100번지를 넣고, 100번지에서 200번지로 점프뛰면 스택에 200번지를 넣고, 끝나고 200번지에서 300번지로 흐르면서 끝나면 스택에 300번지를 넣음. 그리고 다시 100번지로 리턴해야하면, 300->200->100 순으로 pop해서 꺼냄. 그럼 서브루틴이 100번지로 다시 복귀함. (점프뜀)
스택을 넘치게해서 다른 곳으로 점프뛰게 하는 것, 오버플로우인 경우 프로그램을 충돌(다른 곳으로 점프를 뛰는 일)하거나 부정확하게 동작함.
스택이 함수 호출을 위해서 반환 주소를 갖고 있기 때문에 해커가 노림
그래서 반환주소를, 루트권한을 행하게 함.
코드가 점프를 뛰고 다시 복귀하고 다른 함수로 점프뛰고 다시 복귀하겠지. 해커는 복귀할 때 복귀 주소를 고치고 싶어함. 악성코드가 있는 위치로 점프를 뛰도록 고쳐서 이 악성코드가 실행되게 함.
-> 여기에 셋uid가 있어서 이거를 실행시킨 사람한테 유저의 권한을 획득하게 하는 등 사용가능;
tip.
fingerd 데몬
스택
LIFO, 나중에 먹은게 먼저 튀어나옴.
2) 셀코드
3) 공격 절차
공격 쉘코드를 버퍼에 저장함. setuid가 있는 쉘 코드를 어케든 주기억장치내의 버퍼에 저장을 함.
그런 다음에 루트 권한으로 실행되는 프로그램 상에서 특정 함수의 스택 버퍼를 오버플로우 시켜서 공격 쉘 코드가 저장되어 있는 버퍼의 주소로 반환 주소를 변경함. -> 원래는 정상적인 방향으로 리턴해야하는데, 악성 코드 방향으로 리턴되게 하는거임.
그러면 특정 함수의 호출이 완료되면 조작된 반환 주소인 공격 쉘 코드의 주소가 반환되고 쉘 코드가 실행됨.
그래서 쉘 코드가 실행되면 setuid에 의해 해커에게 잠깐 유저의 권한(루트의 권한)을 획득하게 함.
정리,
해커가 내 컴퓨터에 쉘 코드를 저장함. 그 쉘 코드는 셋유아디를 유저의 권한을 받을 수 있음.
원래는 점프를 뛰었다가 복귀행햐ㅏ는데 해커가 복귀주소를 특정 함수의 스택 버퍼를 오버플로우 시켜서 얘를 쉘 코드가 저장되어 있는 쪽으로 리턴되게 함. 그럼 이제 쉘코드가 실행이 되면 셋 유아이디가 실행이 되면서 루트 권한을 갖게 됨.
4) 공격에 대응하기 위한 방어수단
표준라이브러리 루틴을 안전한 것으로
프로세스 = 떠있는 프로그램.
버퍼오버플로우가 원래는 프로세스 구성에서 자기 영역을 침범하면 안되는데 서로 스택과 힙이 서로 침범 하는 것임 -> 당연히 연산이 꼬임.
tip
메모리 구조
다. 버퍼 오버플로 공격 대응 방법
1) 스택가드
프레임 포인터 주소 앞에 카나리아를 기록함.
프레임 포인터, 리턴 주소, 리턴 주소값이 바뀌는지 일종의 플래그를 설치한다.
그래서 추가되는 함수 종료 코드는 이전 프레임 포인터를 복원하고 제어를 카나리아 값이 변경되었는지 검사
프레임 포인터(리터ㄴ주소)는 플래그 값(카나리아) 값이 변조 되었는지 확인해서 얘가 버퍼오버플로우가 공격을 탐지함
탄광 광부들이 카나리아를 광산에 데리고 들어 갔다가 카나리아가 죽으면 탈출 하던 것에서 유래됨...
가) 개념
나) 카나리스
2) 스택쉴드
3) Non-Executable Stack
4) ASLR
라. 힙 오버플로
마. 힙 스프레잉
2. 포맷 스트링 공격
가. 개념
버퍼오버플로우와 유사하며 c언어가 생긴 후부터 존재했으나 발견에 많은 시간이 소요 되었다.
얘가 왜 생기냐면 불명확한 정의로 인한 문제점임(뭐가 불명확함?) -> 데이터 형태가
c언어에서 모니터에 프린터 할 때 원래는 버퍼를 화면에 뿌리는건데, %s라고 해서 명확하게 형태를 지정해줘야하는데, 귀찮거나 까먹어서 안하면 문제가 발생함.
c언어는 정수형, 실수형, 문자형 %s,%d등이 있음. 근데 하다가 귀찮아서
printf("%s\n", hello);
를
printf(hello);
이런식으로 작성하면 문제가 생김 ㅎㅎ;
나. 공격원리
1) 정상적인 프로그램
2) 취약한 포맷 스트링
3) 공격 방법
3. 레이스 컨디션 공격
가. 개념
자원을 서로 받으려고 싸우는 것임.
교착상태(데드락)이 발생함.(희희 회전교차로 막힘)
나. 경쟁조건 발생 원인
프로세스 A가 프린터를 하고 있다. 프로세스 B는 디스크를 점유해서 쓰기 작업중
프린터를 하다보면 책 한권을 하다보면 버퍼 용량보다 책이 크니까 A가 어쩔 수 없이 디스크를 요구함.
하필이면 그때 비가 프린터 버튼을 누르면 서로 맞물림. 그럼 데드락,교착상태에 빠짐.
다. 공격 방법
다른 계정의 권한에 접근해서 셋uid, 다른 사람(권한 ㄴ)에게 유저의 권한을 잠깐 주는 것,
나는 루트의 권한이 없는데 소스 안에 셋 유아이디가 있으면 유저의 권한을 받음.
그렇게 유저의 권한을 받아 이것저것 요청하면 컴퓨터가 뻗겠지
라. 대응 방법
소스에서 슬떼없이 셋 유아이디가 있는지 확인하고 있으면 개발자를 불러서 이거 왜 썼는지 물어야함.
보통 배껴오는데 자기도 모르는 사이에 배낀 소스에 있는 경우 있음. 그거 지우고
하드링크(단축아이콘) 지우기
파일 종류 등등 점검
4. 권한 상승 공격
5. 기타 용어
스턱스넷(국가 단위 악성프로그램)
멀웨어(악성 소프트웨어) -> 바이러스.웜/좀비의 구분이 모호해져서 걍 다 악성 프로그램으로 퉁쳐서 부르기도 함.
바이러스: 종속형, 숙주 필요, 자기복제함.
웜: 독립형, 자기복제,
좀비: 독립형, 자기복제
제로데이: 백신이 없는 악성 프로그램, 보안 패치 나오기 전에 공격하는 것.
슬랙: 저장매체의 물리적인 구조와 논리적인 구조의 차이로 발생하는 낭비공간
6. 모바일 운영체제
안드로이드, IOS
가. 개요
나. iOS
1) 개요
2) 특징
3) 장점
4) 단점
다. 안드로이드
1) 개요
2) 특징
3) 장점
4) 단점
라. 비교
| 애플 | 안드로이드 | |
| UNIX: 폐쇄형, 소스를 자기들이 가지고 자기들이 관리함. 본인이 모든 것들을 쥐고 있음. 개발자들이 어플을 만들지만 프로그램 실행 권한은 관리자가 가짐 |
리눅스, 보안이 취약하나 수많은 개발자의 업데이트로 진화가 빠름. 단점은 무거움. 관리자가 많음에 따라 배가 산으로 감. 뭐든 개방형이고, 진화가 빠른데 버그가 많음. 프로그램 실행 권한도 관리자에게 있음. |
|
tip 앱스토어
앱스토어를 만든 이유가 삼성이나 애플이나 자체적으로 아주 신박한 프로그램을 만들기는 쉽지 않음. 그래서 개발자들이 프로그램을 만들어서 앱 등록 사이트에 등록을 함. 그럼 이제 관리자가 개발자가 만ㄴ 새로운 어플이 제대로 동작하는지, 그게 안 맞으면 조율함.(테스트) 통과하면 검증센터에서 코드샤이닝 기술을 통해 코드를 다 열어봄. 거기서 문제가 없으면 마켓에 업로드 됨
'정보보안기사 > 2024 최적합 정보보호론' 카테고리의 다른 글
| PART7. 정보보안 관리 - SECTION 1. 정보보호 정책 및 조직 (0) | 2026.03.05 |
|---|---|
| PART6. 시스템 보안 - SECTION 10. 취약점 점검 (0) | 2026.03.05 |
| PART6. 시스템 보안 - SECTION 8. 서버 보안 관리 (0) | 2026.03.03 |
| PART6. 시스템 보안 - SECTION 7. 리눅스(Linux) 서버 보안 (0) | 2026.03.03 |
| PART6. 시스템 보안 - SECTION 6. UNIX 서버 보안 (0) | 2026.03.02 |