Memory Protection Mechanism of Linux

Slides:



Advertisements
Similar presentations
프로그램이란 프로그램 생성 과정 프로젝트 생성 프로그램 실행 컴퓨터를 사용하는 이유는 무엇인가 ? – 주어진 문제를 쉽고, 빠르게 해결하기 위해서 사용한다. 컴퓨터를 사용한다는 것은 ? – 컴퓨터에 설치 혹은 저장된 프로그램을 사용하는 것이다. 문제를 해결하기 위한.
Advertisements

1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
GOgOS 사양 체크 GOgOS 는 Microsoft PowerPoint 로 제작되었습니다. 파워포인트로 이용 가능한 기능 ( 도형, 실행 설정, 애니메이션, 매크로, VBA) 으로 제작되어 Microsoft PowerPoint 2007 이상 및 PowerPoint 2010.
아이튠즈 계정 생성. 1. 인터넷을 통해 설치한 아이튠즈를 실행 한 후 그림의 순서대로 선택을 합니다. 1 2.
출석수업 과제 – 총 5문제, 10월 25일 제출 정보통계학과 장영재 교수.
Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
재료수치해석 HW # 박재혁.
무료문자 보내기 62. 창업자께서 현재 스마트폰 무제한 약정 요금제를 사용하고 계시다면
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
1장. 이것이 C 언어다.. 1장. 이것이 C 언어다. 프로그래밍 언어 1-1 C 언어의 개론적 이야기 한글, 엑셀, 게임 등의 프로그램을 만들 때 사용하는 언어 ‘컴퓨터 프로그래머’라는 사람들이 제작 C 언어(C++ 포함)를 가장 많이 사용함.
컴퓨터 프로그래밍 기초 [Final] 기말고사
Windows Server 장. 사고를 대비한 데이터 백업.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
Windows 8 Ksystem G&I 설치.
시스템 보안 [Buffer Overflow] DEC, 15, 2013 By 박동혁.
회원가입을 클릭하시면 학회홈페이지 회원가입페이지로 이동합니다.
회원가입 클릭.
PLISM 컴포넌트 설치 방법.
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
Cross Compiler 설치.
회원가입 클릭.
Sungkyunkwan University OS Project Dongkun Shin
10강. JSP 본격적으로 살펴보기-II 스크립트릿, 선언, 표현식 지시자 주석 Lecturer Kim Myoung-Ho
Method & library.
자바응용.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
7가지 방법 PowerPoint에서 공동 작업하는 다른 사용자와 함께 편집 작업 중인 사용자 보기
27장. 모듈화 프로그래밍.
29강 JAVA 스레드 - 스레드란? - 멀티스레드 문법 - synchronized Lecturer Kim Myoung-Ho
메모리 관리 & 동적 할당.
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
뇌를 자극하는 Windows Server 2012 R2
24장. 파일 입출력.
LIT-GenAppSetup ※ Texting+ 클라이언트 프로그램은 제품 인증을 받은 제품입니다.
Adobe 제품 다운로드 및 설치 방법 안내 Adobe Creative Cloud Adobe License 권한을 받으신 분
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
27강 JAVA Collections - II - Map계열 컬렉션 클래스 살펴보기 - Set계열 컬렉션 클래스 살펴보기
발표자료는 다음링크에서 다운로드 받으실 수 있습니다.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
9강. 클래스 실전 학사 관리 프로그램 만들기 프로그래밍이란 결국 데이터를 효율적으로 관리하기 위한 공구
GM7 PLC 모니터링 프로그램 한국 폴리텍 항공대학 항공정보통신과 송 승 일.
※ 편리한 사이버 연수원 사용을 위한 인터넷 최적화 안내 ※
빌드 성공.
성령님은 무엇을 도와 주실까요? 이 세상을 만드신 분이세요 우리를 구원해 주신 분이세요 우리를 도와 주시는 분이세요
Canary value 스택 가드(Stack Guard).
( Windows Service Application Debugging )
디버깅 관련 옵션 실습해보기 발표 : 2008년 5월 19일 2분반 정 훈 승
헤드라인 헤드라인 헤드라인 헤드라인 헤드라인 헤드라인 헤드라인 헤드라인 헤드라인 헤드라인 헤드라인 헤드라인 텍스트 샘플 텍스트
약식 진리표를 이용한 타당성 증명 진리표 그리기 방법의 한계
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
안녕하세요!.
bOuT 마찰차 전동 4조 박승기, 백승민, 이중환, 송슬기
12 그리드 시스템.
함수, 모듈.
발표자 : 이지연 Programming Systems Lab.
하나님의 말씀 이스라엘이여 여호와의 구원을 너는 행복한 사람이로다 그는 너를 돕는 방패시요 너 같이 얻은 백성이 누구냐
Android -Data Base 윤수진 GyeongSang Univ. IT 1.
자신의 브랜딩으로 사업자 모으기 Allyse Sedivy, 더블 프레지덴셜 다이아몬드 “당신의 꿈이 실현가능하다고
IPC 펌웨어 업그레이드 방법 안내 ** 반드시 IPC를 NVR POE 포트 연결 전에 작업 하시기 바랍니다. IPC를 NVR POE 포트에 연결 하실 경우 IP 대역폭을 마추셔야 하는 작업이 필요합니다. **
주라, 그리하면 너희에게 줄 것이니 곧 후히 되어 누르고 힘들어 넘치도록 하여 너희에게 안겨 주리라 너희가 헤아리는
CCIT 네트워크 발표 정보보호학과 평문 사이트와 SSL 사이트, SSL strip과 데이터 변조를 이용한 로그인 취약점
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
CODE INJECTION 시스템B 김한슬.
13. 포인터와 배열! 함께 이해하기.
오늘의 강의 제목을 입력하세요 소 속 : 인문대학 국어국문학과 이 름 : 홍길동 교수 1.
Presentation transcript:

Memory Protection Mechanism of Linux TEAM PWN&PLAY YIS of KSIA 김태욱 xodnr631@naver.com fb.com/xodnr631 안녕하세요, 코드게이트 주니어에 참석하신 모든 여러분들. 제 소개를 먼저 한 다면 저는 강원도 속초고등학교 3학년인 김태욱 입니다. 화면에 제 이메일 주소와 제 페이스북 주소가 있으니 발표가 끝나고 연락 주시면 감사하겠습니다.

YIS 또 한국 학생 IT 동아리 연합에 소속되어 있는 YIS 동아리에서 온라인 팀장을 맡고있습니다.

TEAM PWN&PLAY 저는 TEAM PWN&PLAY에서 활동중입니다.

SYSTEM HACKING Memory Protection Mechanism of Linux 제가 오늘 여러분들 앞에서 발표할 내용은 운영체제 리눅스의 메모리 보호기법에 대해 발표할것입니다. 일단 리눅스 메모리 보호기법은 시스템에 관심이 많은 분들이 주의깊게 들어주시면 유익하실텐데 오늘 발표하는 내용은 시스템 해킹에서 정말 중요한 내용입니다. 여러 시스템 해킹 기술을 대상으로 특정 메모리 영역을 보호하는 기술들입니다. 공격기술까지 자세하게 짚고 넘어가지는 않겠지만 오늘 설명해드릴 보호기법 4가지인 ASLR, DEP, ASCII Armor, Canary 기술을 여러분들이 확실히 이해하실 수 있도록 도와드리겠습니다. 그리고 여러분들이 나중에 시스템 해킹을 공부하시게 될때 제 발표를 기억해내면서 “아, 이런 원리를 가지고 있었던 놈이지. 어떻게 어떻게 공격을 시도해봐야겠다” 라고 생각해주시고 공격을 한다면 오늘 발표는 매우 만족스러울거라 생각됩니다. 그 리눅스 메모리 보호기술을 바로 설명해드리기 전에 제가 버퍼 오버플로우라는 시스템 해킹기술을 간단히 설명해드릴 것입니다. 그 이유는 일단 버퍼 오버플로우는 마초중의 마초, 시스템 해킹 기술 중 몰라서는 안되는 기술이며 해킹대회 시스템 문제로도 가장 많이 출제되는 유형입니다. 이번 코드게이트 취약점 문제도 마찬가지였죠. 또 명성에 걸맞게 운영체제의 메모리 보호기술이 여태까지 계속해서 업그레이드 되고 있는 이유 중 하나이기도 합니다.

Buffer Overflow (1) 사용자가 입력한 데이터의 크기가 너무 과하여 제한된 버퍼의 용량을 넘쳐버렸을때 생기는 버그를 이용해 해킹하는 기술 버퍼 : 컴퓨터의 주기억 장치와 주변장치 사이에서 데이터를 주고받을때 정보를 임시로 기억해두는 임시저장공간 먼저 여러분들께 시스템 해킹 기술인 버퍼 오버플로우에 대해 간단하게 설명을 해드릴 예정입니다. 그 이유는 메모리 보호기법이 현재까지 업그레이드 되고 있는 이유는 여러가지 지만 그 중 가장 큰 비율을 차지하고 있는 이유 중 하나가 바로 마초중의 마초, 이 시스템 해킹 기술인 ‘버퍼 오버플로우’ 해킹 기술 때문입니다. 이 버퍼 오버플로우 해킹 기술은 사용자가 입력한 데이터의 크기가 너무 과하여 제한된 버퍼의 용량을 넘쳐버렸을때 생기는 버그를 이용해 해킹하는 기술이며 여기서 버퍼는 임시저장공간을 말합니다. 이렇게만 얘기하면 상당히 어려울텐데 간단하게 비유를 한다면 아침드라마나 저녁드라마를 챙겨보시는 분들 계실겁니다. 드라마에 자주 나오는 이야기인데 정말 착한 주인공이 있습니다. 주인공에게 어느날 큰 문제가 닥쳤습니다. 바로 회사의 큰 거래를 하루빨리 성사시켜야 된다는 명령이 떨어졌으며 해결못할경우 해고를 당합니다. 어쩔수 없이 주인공은 자신의 단짝을 술자리에 불러냅니다. 주인공은 단짝친구가 술에 약한 것을 알고 계속해서 술을 맥입니다. 결국에 술 때문에 맛이간 친구는 친구의 꼬드김에 넘어가 거래를 하게되고 다음날 일어난 친구는 아무것도 기억이 안나지만 요상한 꼬드김에 넘어간걸 눈치채게되고 친구는 연락을 안받는… 그런…. 상황이 일어납니다. 여기서 바로 주인공은 친구에게 버퍼 오버플로우 해킹을 시도한것이며 단짝친구의 멘탈이 버퍼이며, 술이 데이터 입니다. 바로 과하게 흘러들어간 술, 데이터가 친구의 멘탈, 버퍼를 넘쳐버려 해킹을 당한것입니다.

Buffer Overflow (1) 사용자가 입력한 데이터의 크기가 너무 과하여 제한된 버퍼의 용량을 넘쳐버렸을때 생기는 버그를 이용해 해킹하는 기술 버퍼 : 컴퓨터의 주기억 장치와 주변장치 사이에서 데이터를 주고받을때 정보를 임시로 기억해두는 임시저장공간

Buffer Overflow (2) 낮은 주소 CODE DATA HEAP STACK 높은 주소 컴파일 된 기계어 코드 전역/정적 및 각종 변수 HEAP 프로그래머가 직접 할당한 공간 STACK 지역 변수, 함수 인자, 환경 변수 높은 주소 먼저 메모리 구조는 다음과 같이 이루어져있습니다. 코드영역, 데이터영역, 힙영역, 스택영역이 있으며 각 영역의 역할은 다음과 같습니다. 코드영역은 컴파일 된 기계어 코드, 데이터 영역은 전역/정적 변수 힙 영역은 프로그래머가 직접 할당한 공간입니다.

Buffer Overflow (2) 낮은 주소 CODE DATA HEAP STACK 높은 주소 컴파일 된 기계어 코드 전역/정적 및 각종 변수 HEAP 프로그래머가 직접 할당한 공간 STACK 지역 변수, 함수 인자, 환경 변수 높은 주소 버퍼 오버플로우가 집중적으로 일어나는 스택 영역은 지역 변수, 함수의 인자 등 함수 호출과 관련된 영역입니다.

Buffer Overflow (3) BUFFER SFP RET BUFFER – SFP – RET – Argc/Argv – 환경변수 - 파일명 BUFFER SFP RET 스택 영역에 대해 좀 더 자세하게 보신다면 스택의 구조는 다음과 같이 이루어져 있습니다. 크게 본다면 버퍼, SFP, RET로 이루어져있습니다. 버퍼는 말 그대로 변수며, SFP는 세이프 프레임 포인터로 현재 함수의 주소가 들어있으며 RET는 리턴 어드레스로 돌아갈 함수의 주소가 들어있습니다.

Buffer Overflow (3) A A A A A A A A A A A A A A A A A A A BUFFER SFP BUFFER – SFP – RET – Argc/Argv – 환경변수 - 파일명 BUFFER SFP RET A A A A A A A A A A A A A A A A A A A 버퍼 오버플로우 공격의 핵심은 RET, 리턴 어드레스 이며 바로 리턴 어드레스를 변조시켜 공격을 하는것이 버퍼 오버플로우 공격입니다.

Stack 낮은 주소 CODE DATA HEAP STACK 높은 주소 컴파일 된 기계어 코드 전역/정적 및 각종 변수 프로그래머가 직접 할당한 공간 STACK 지역 변수, 함수 인자, 환경 변수 높은 주소 하지만 시스템을 자세히 공부해보시지 않은 분들이라면 스택이 도대체 뭐하는 놈인가 감이 잘 안 올 수도 있습니다.

Stack 유저영역 낮은 주소 CODE DATA HEAP STACK 높은 주소 컴파일 된 기계어 코드 전역/정적 및 각종 변수 프로그래머가 직접 할당한 공간 STACK 지역 변수, 함수 인자, 환경 변수 높은 주소 유저영역 그래서 간단하게 설명해드린다면 스택은 메모리 영역 중 유저 영역의 한 부분입니다. 바로 또 이 유저 영역이란 무엇인가.

Memory 커널 유저 HIGH LOW 컴퓨터의 메모리는 여러분들이 컨닝페이퍼를 작성하듯이 컴퓨터가 계산을 위해 데이터와 명령어들을 보관해놓은 곳 입니다. 컴퓨터 메모리는 크게 커널영역과 유저영역으로 나뉘어져 있습니다. 사람의 뇌가 두뇌, 중뇌, 소뇌로 나뉘어져 있는것과 똑같이 말입니다.

STACK | HEAP | DATA | CODE Memory 커널 유저 HIGH LOW STACK | HEAP | DATA | CODE 여기서 이제 또 컴퓨터 메모리의 경우에는 유저영역 부분이 역할별로 세분화 되어있으며 여기에 스택이란 놈이 있는것입니다. 자, 이렇게 이제 버퍼 오버플로우의 이론적인 내용은 마치고 넘어가겠습니다.

Buffer Overflow (5) <BOF 문제풀이 유형> 해외는 물론 국내에도 버퍼 오버플로우 워게임 서비스가 여러개 있습니다. 먼저 여러분들께 어떻게 공격이 이루어지는가. 간단한 시연과 유형 설명을 해드리도록 하겠습니다.

Buffer Overflow (5) int main(int argc, char *argv[]) { char buffer[256]; if(argc < 2){ printf("argv error\n”); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } 가장 전형적인 버퍼 오버플로우 문제 유형입니다. 256바이트 크기의 변수이며 인자가 두 개인지 검사하며 스트린카피함수를 통해 입력받은 인자를 변수에 복사하는데 이 때 인자의 크기를 검사하지않는 부분에서 취약점이 존재하므로 해킹이 일어납니다.

Buffer Overflow (5) 가장 전형적인 버퍼 오버플로우 문제 유형입니다. 256바이트 크기의 변수이며 인자가 두 개인지 검사하며 스트린카피함수를 통해 입력받은 인자를 변수에 복사하는데 이 때 인자의 크기를 검사하지않는 부분에서 취약점이 존재하므로 해킹이 일어납니다.

Buffer Overflow (5) int main() { char buffer[16]; gets(buffer); printf("%s\n", buffer); } 또 다른 문제 유형입니다. 이 문제는 버퍼의 영역이 매우 좁습니다. 이 떄는 여러분들이 직접 매우 작은 크기의 쉘코드를 직접 만들어주셔서 공격하셔야 합니다.

Buffer Overflow (5) // here is changed! // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); 이번 유형에 추가된 소스코드는 바로 환경변수 메모리 영역을 초기화 하는 코드입니다. 이를 통해 에그쉘이라는 프로그램을 이용해 환경변수를 통해 공격하는 방법을 방지합니다.

Buffer Overflow (5) // here is changed! if(strlen(argv[0]) != 77){ printf("argv[0] error\n"); exit(0); } 이번 문제는 파일 제목 글자수를 검사하는 코드가 추가되어있습니다. Argv[0] 이 파일의 제목을 가리키는 인자입니다. 이 문제에서는 그냥 실행할경우 파일 접근이 안 될텐데, 바로 심볼릭 링크라는 것을 이용해 파일의 바로가기를 생성하는데 여기 조건이 걸려있는대로 파일명을 77자로 생성해주면 파일 접근에 성공하실 수 있습니다.

BUT 그러나!!!!! 여러분들은 정말 중요한걸 잊고있습니다. 과연 하드코딩함으로써만 방어가 가능할까요, 버퍼 오버플로우는 메모리에 접근하여 해킹을 시도하는 기술입니다. 단순히 소스코드, 그러니깐 방어도구의 업그레이드 뿐 아니라 방어환경, 즉 운영체제의 메모리 기술을 업그레이드 함으로써도 해킹을 막아낼수 있다는 말이겠죠..

이렇게 여러분의 공격스킬이 계속해서 업그레이드 되어갈수록.

바로 똑같이 앞서 말씀드렸듯이 적들의 공격스킬은 물론 여러분들의 공격을 막아낼 방어구와 방어스킬 또한 업그레이드 되고 있다는 사실입니다. 여러분들의 공격스킬이 업그레이드되면서 공격이 성공할때마다 윈도우, 리눅스와 같은 운영체제들은 좀 더 강력한 방어구를 걸치고, 좀 더 강력한 방어스킬을 가지고 업그레이드합니다. 근데 여러분은 업그레이드된 적을 몰라뵈고 똑같은 무기와, 똑같은 방패, 똑같은 스킬로 되돌아온 적을 공격하러갑니다. 그러면 어떻게될까요!? 당연히 말하지않아도 여러분은 업그레이드 된 적에게 당하고 맙니다.

그래서 여러분들이 제일 먼저 해야될건 적이 어떻게 업그레이드 되었는지 알아야 된다는것입니다 그래서 여러분들이 제일 먼저 해야될건 적이 어떻게 업그레이드 되었는지 알아야 된다는것입니다. 적을 알고 나를 알면 지피지기 백전백승! 이란 말이 있듯이 적에 대해서 먼저 알아둬야된다는것입니다. 그렇다면 아무리 강한 적이라도 물러서지 않고 공격을 시도 할 수 있으며 성공할 수 있는겁니다. 아까 단짝 친구가 술에 약한 것을 알고 술을 이용해 접근한건데 만약 그 주인공이 친구가 술에 약한 것을 몰랐다면 어떻게 되었을까요? 괜히 술자리에 불러냈다가 거래 성사시키려다가 먼저 엄청 취해버려서 뒤통수를 맞을수도 있겠죠? 이것도 바로 적을 알고 나를 알고 다가가는 기술입니다. 친구가 여자를 이용해도 안 통하고, 돈에도 통하지 않는 것을 알고 하지만 술이란 공격도구에 약한 것을 안 주인공은 친구에게 술이란 공격도구로 접근을 합니다. 이렇게 적을 알고 나를 알면 지피지기 백전백승이란 말입니다.

지금 보고계신 그림은 바로 적들의 방어기술 업그레이드 현황입니다.

오늘 여러분들께 적 들의 방어기술을 보여드리기 위해 사용한 놈은 바로 ‘페도라 12’ 입니다.

DEP(Data Execution Prevention) Memory Protection (1) DEP(Data Execution Prevention) 그리고 이제 다음으로 두 번째로 설명해드릴 기술은 DEP란 기술 입니다. 이 DEP 란 기술은 스택이나 힙에 실행권한을 부여하지 않는 보호기술입니다. 실행권한은 ‘x’ 로 표시되는데 붙여져있지 않으신게 보이시죠, 바로 실행권한이 없어진것을 말합니다. 공격자가 BOF 공격을 일으키면 DEP가 적용된 상태이므로 실행권한이 없어 BOF 공격 코드가 실행되지 않습니다.

DEP(Data Execution Prevention) Memory Protection (1) DEP(Data Execution Prevention) STACK BUFFER SFP RET 인자 환경변수 파일명 그림으로 쉽게 설명해보겠습니다.

DEP(Data Execution Prevention) Memory Protection (1) DEP(Data Execution Prevention) STACK BUFFER SFP RET 인자 환경변수 파일명 LOW HIGH 먼저 앞서서 보여드렸던 공격방법들은 모두 쉘코드를 올린 특정 장소(그러니깐 변수, 환경변수, 파일명과 같은곳이요.) 의 주소를 리턴어드레스에 심어놔 공격을 했었습니다. 프로그램이 실행이되면 자연스럽게 스택을 참조하면서 공격이 일어나는것이죠.

DEP(Data Execution Prevention) Memory Protection (1) DEP(Data Execution Prevention) STACK BUFFER SFP RET 인자 환경변수 파일명 LOW HIGH 하지만 이 DEP가 적용된 이후로 스택을 참조하며 프로그램이 실행될때 리턴어드레스에서 변조시킨 주소로 이동을 할텐데 여기서 이동되는 부분이 스택이라면 또 스택을 참조하는건데 그럼 또 다시 스택을 참조할게될때 이 DEP 방어기술로 인해 리턴어드레스에 성공적으로 주소를 덮어씌워 그 곳으로 이동한다 하더라도 실행이 되지 않고 프로그램이 비정상적으로 종료되는것입니다. 이 DEP 보호기술은 제가 앞서 설명해드렸던 ASLR 보다 먼저 나왔던 기술인데 이 DEP의 경우에는 쉬운 우회 공격기술이 있습니다.

Memory Protection (1) STACK RTL(Return-to-libc) LOW HIGH BUFFER SFP 인자 환경변수 파일명 LOW HIGH 바로 RTL 이라고 하는 기술입니다. 리턴 투 라이브러리의 약자이며 이 공격기술은 DEP와 같은 보호기술을 우회하기 위해 만들어졌습니다. 이 공격기술은 해커가 변조해야되는 리턴어드레스를 변조할때 스택이 아니라 공유 라이브러리 내의 함수로 덮어씌워줍니다. 그러면 스택에서 실행권한을 요구할 필요 없이 라이브러리 내에 있는 함수나 환경변수를 요구하게 되며 자연스럽게 스택의 실행권한을 차단한 DEP 보호기술은 우회하게 되는 것입니다.

Memory Protection (1) RTL(Return-to-libc) BUFFER SFP RET A A A A A A A A A A A A A A A A A A A 리턴어드레스를 변조시키는 작업에서

&system() &execl() &/bin/sh Memory Protection (1) RTL(Return-to-libc) BUFFER SFP RET A A A A A A A A A A A A A A A A A A A &system() &execl() &/bin/sh 공유 라이브러리 내의 함수 중 권한을 요구하는 함수들을 불러와 리턴어드레스에 덮어 씌워 권한을 획득하고 쉘을 실행하여 해킹에 성공하는것입니다.

ASLR(Address Space Layout Randomization) Memory Protection (2) ASLR(Address Space Layout Randomization) 첫 번째로 소개시켜드릴 방어기술은 ASLR입니다. 흔히 랜덤스택이라고도 불리는 이 기술은 스택 영역의 배치를 난수화 시킴으로써 스택을 참조하는 프로그램이 실행될때마다 메모리 주소가 변동되어 해커가 쉽게 스택의 주소를 유추할 수 없게 만듭니다. 지금 실행 중인 프로세스 중 스택의 주소만 출력해서 확인하고있는건데 명령어를 실행할때마다 스택을 참조할텐데 이때마다 주소가 달라지는것을 확인할 수 있습니다.

ASLR(Address Space Layout Randomization) Memory Protection (2) ASLR(Address Space Layout Randomization) STACK 그림으로 쉽게 설명해보겠습니다.

ASLR(Address Space Layout Randomization) Memory Protection (2) ASLR(Address Space Layout Randomization) STACK BUFFER SFP RET 인자 환경변수 파일명 LOW HIGH 보통 저희가 버퍼 오버플로우 공격을 할 때 가장 많이 사용하는 전형적인 공격방법이 바로 스택 공간을 이용하는 방법입니다.

ASLR(Address Space Layout Randomization) Memory Protection (2) ASLR(Address Space Layout Randomization) STACK BUFFER SFP RET 인자 환경변수 파일명 LOW HIGH 난짱해커 스택의 주어진 버퍼영역에 쉘코드를 올리고 그 쉘코드가 올라가 있는 주소를 리턴 어드레스에 덮어씌워 공격을 시도하곤 하였습니다.

ASLR(Address Space Layout Randomization) Memory Protection (2) ASLR(Address Space Layout Randomization) STACK BUFFER SFP RET 인자 환경변수 파일명 LOW HIGH 난짱해커 다시 말해서 스택이라는 공간이 있는데 화면에 보여지는것처럼 스택이 구성되어있습니다. 흔히 여러분들이 알 수 있는 버퍼 그러니깐 변수, SFP, RET, 인자, 환경변수, 파일명이 있는데 아까 말씀드렸듯이 가장 전형적인 공격방법이 보통 인자를 통해 버퍼의 값을 입력받고 그 인자나 버퍼의 시작주소 혹은 쉘코드가 나오기 전 부분의 주소를 RET 로 덮어씌워 프로그램이 RET 를 수행할때 변조한곳으로 이동하게 하여 해킹이 일어나게됩니다. 근데 이 ASLR, 랜덤스택이라는 기술로 그 주소가 계속 랜덤형식으로 되어 찾을 수가 없게 된것입니다.

ASLR(Address Space Layout Randomization) Memory Protection (2) ASLR(Address Space Layout Randomization) STACK BUFFER SFP RET 인자 환경변수 파일명 LOW HIGH 난짱해커

ASLR(Address Space Layout Randomization) Memory Protection (2) ASLR(Address Space Layout Randomization) STACK BUFFER SFP RET 인자 환경변수 파일명 LOW HIGH 난짱해커

ASLR(Address Space Layout Randomization) Memory Protection (2) ASLR(Address Space Layout Randomization) STACK BUFFER SFP RET 인자 환경변수 파일명 LOW HIGH 난짱해커

ASLR(Address Space Layout Randomization) Memory Protection (2) ASLR(Address Space Layout Randomization) STACK BUFFER SFP RET 인자 환경변수 파일명 LOW HIGH 난짱해커

ASLR(Address Space Layout Randomization) Memory Protection (2) ASLR(Address Space Layout Randomization) STACK BUFFER SFP RET 인자 환경변수 파일명 LOW HIGH 난짱해커

ASLR(Address Space Layout Randomization) Memory Protection (2) ASLR(Address Space Layout Randomization) STACK BUFFER SFP RET 인자 환경변수 파일명 LOW HIGH 난짱해커 똑같은주소 그래서 아까 유형 설명할때 나왔었던 작은 쉘코드를 이용해 풀거나, 심볼릭링크를 이용해 풀거나, 에그쉘을 이용해 환경변수에 푸는 유형들 또한 마찬가지로 어려워 졌다는 상황입니다.

다음과 같은 프로그램을 이용해서 다시 보겠습니다 다음과 같은 프로그램을 이용해서 다시 보겠습니다. 이 프로그램은 인자를 입력받으며 프로그램을 실행하면 변수의 주소, 파일명의 주소와 입력받은 인자의 주소를 출력합니다. 여기서 Argv[0]은 파일명을 의미하며 Argv[1]은 첫 번째로 입력받은 인자를 뜻합니다.

왼쪽은 해커스쿨에서 제공된 LOB 워게임 서비스에서 실행하였을때의 결과며 오른쪽은 페도라 12 환경에서 실행하였을때 결과입니다 왼쪽은 해커스쿨에서 제공된 LOB 워게임 서비스에서 실행하였을때의 결과며 오른쪽은 페도라 12 환경에서 실행하였을때 결과입니다. 차이점이 정확히 보이시죠, LOB 환경에서는 프로그램이 재실행될때마다 주소가 똑같지만 페도라 12 환경에서는 실행할때마다 주소가 계속해서 달라집니다. 그러니깐 리눅스에서 문제 파일을 GDB나 덤프코드로 디버깅을 하며 분석할때 (윈도우 환경에서 올리디버거로 디버깅하는거라 생각하시면 됩니다) 시작 주소를 찾아내어 그 주소를 타겟으로 공격을 하는데, LOB 환경에서는 랜덤스택이 적용되어 있지 않으므로 당연히 찾은 주소를 이용해 그냥 공격하면 되지만 페도라 12 환경에서는 ASLR이 적용되어 있어 계속해서 바뀌므로 분석한 주소로 공격을 할때 또 주소가 바뀌므로 공격이 먹히지 않게 되는것입니다. 이해가 되십니까? 랜덤스택이란 놈이 간단하게 비유를 한다면 엑스맨의 미스틱이라고 할 수 있겠는데요, 혹시 미스틱이라는 캐릭터를 아시는 분이 계십니까. ↑ 고정 된 주소 ↑ 계속해서 바뀌는 주소

↑ 고정 된 주소 ↑ 계속해서 바뀌는 주소 바로 이 캐릭터인데요, 다들 아시죠? 미스틱은 자신이 원하는 모습으로 계속해서 변신을 할 수 있습니다. 영화 엑스맨 전투신 중 에서도 미스틱은 이런 계속해서 변신할 수 있는 기술을 이용한 적들과의 전투신이 있죠. 새로운 적이 나타날때마다 새로운 모습으로 얼마든지 변신이 가능한데 랜덤스택을 이와 똑같이 생각해주시면 됩니다. 프로그램을 실행할때마다 스택의 주소가 바뀌는 기술을 말입니다. ↑ 고정 된 주소 ↑ 계속해서 바뀌는 주소

Memory Protection (3) ASCII Armor 세 번째로 설명해드릴 방어기술은 ASCII Armor 란 기술입니다. 이 기술은 제가 방금전에 설명해드린 RTL 과 같은 공격기술 때문에 생긴 보호기술로 라이브러리를 보호하기 위한 기술입니다. 주소를 \x00와 같은 널문자로 시작하게 만들어 라이브러리를 호출하는 BOF 공격을 할 경우 널 문자를 만나면 프로그램이 끝나는 것을 이용하여 공격을 막아냅니다.

Memory Protection (3) STACK ASCII Armor LOW HIGH BUFFER SFP RET 인자 환경변수 파일명 LOW HIGH 그림으로 쉽게 설명을 해드리겠습니다. 아까 DEP 라는 보호기술이 추가되어서 RTL 이라는 공격 기술을 이용한다고 했었죠. 스택공간을 이용하지 못하게되니 그 외의 공간을 이용하여 공격을 하는 방법이었는데,

Memory Protection (3) STACK ASCII Armor LOW HIGH BUFFER SFP RET 인자 환경변수 파일명 LOW HIGH 그러니깐 아까 설명해드렸던 RTL 기법을 통해 라이브러리의 함수를 호출하거나 데이터를 전달 하는 경우 함수의 첫 바이트에 널문자를 삽입해 연속된 함수의 호출을 방해합니다. 프로그래밍을 공부해보신 분이라면 아시겠지만 이러한 원리로 널문자를 만나 프로그램이 종료되는것을 이용해 공격을 방어합니다.

Memory Protection (4) Canary BUFFER SFP RET

Memory Protection (4) Canary BUFFER SFP RET CANARY 카나리 기술은 BOF를 모니터링 하는 역할이라고 생각하시면 될것같습니다. 변수영역과 RET 사이에 또 다른 장애물을 설치하는 기술입니다. 근데 이 장애물이 참으로 까다로운 놈입니다.

Memory Protection (4) Canary A A A A A A A A A A ? ! # $ A A A A A BUFFER SFP CANARY RET A A A A A A A A A A ? ! # $ A A A A A 카나리값이라고 데이터영역에서 랜덤한 값을 삽입해 함수가 시작되거나 종료되는 시점에 원본 데이터와의 체크를 통해 오버플로우를 감지하며 이 카나리값에 해당하는 조건을 만족하지 못한다면 프로그램이 종료되는데 BOF 공격 시 오버플로우에 대한 경고까지 하고 프로그램을 종료시킵니다.

Memory Protection (4) Canary CANARY RANDOM 이게 또 카나리 공격이 크게 3가지로 분류가 되는데 첫번째는 랜덤 카나리로 ASLR 기술처럼 프로그램이 실행될때마다 랜덤으로 카나리값을 생성해 공격자가 조건을 만족하지 못하게 만드는 방법이며

Memory Protection (4) Canary CANARY RANDOM TERMINATOR 두번째는 터미네이터 카나리로 카나리값이 구성될 때 마지막 값을 널문자와 같은 종료문자로 구성시켜 공격자가 접근을 할 수 없도록 만들어 내는 방법입니다.

Memory Protection (4) Canary CANARY RANDOM TERMINATOR NULL 그리고 마지막 세번째 방법으로는 널 카나리 기술로 카나리 값을 완전히 널문자로 구성시켜버려 접근을 못 하게 만들어버립니다. 여기까지 총 4가지 리눅스 메모리 보호기술을 설명해드렸으며 정리를 한번 하고 끝내도록 하겠습니다.  

DEP 첫 번째로 설명해드렸었던 기술이 ASLR 이었죠, 스택의 주소를 랜덤화 시켜서 공격에 어려움을 가지게 하는 기술이었습니다.

두 번째로 설명해드렸던 기술은 DEP 라는 기술로 스택의 실행 권한을 없애버려 보통 스택에 쉘코드를 올려놓고 공격하는 공격기법을 막아내는 보호기술 이었습니다. DEP + ASLR

DEP + ASLR + ASCII Armor 세 번째로 아스키아머라고 라이브러리 함수 주소의 시작을 널문자로 구성시켜 DEP 를 우회하는데 사용되는 RTL 기술을 막아내는 보호기술입니다.

DEP + ASLR + ASCII Armor + Canary 마지막으로 설명해드렸었던 보호기술은 가장 강력한 놈으로 카나리로 카나리값이란걸 생성해 조건을 만족하지 못한다면 공격을 무력화 시키는 보호기술 이었습니다.

  이상으로 제 발표를 마치겠습니다. 들어주셔서 감사하고 수고하셨습니다.