FSB 숭실대학교 ACK 박수완(LinkC) skyhwen@naver.com.

Slides:



Advertisements
Similar presentations
SCJP. Garbage Collection  Garbage Collector( 이하 GC) 가 Heap 영역 에 할당된, 더 이상 사용되지 않는 메모리인 Garbage 를 다른 객체가 사용할 수 있도록 정리하는 것.  C++ 에서의 메모리 해제 int* v=new.
Advertisements

6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
컴퓨터와 인터넷.
Chapter 9 Format String Bug (FSB)
재료수치해석 HW # 박재혁.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
제 9 장 포인터.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
제 9 장 구조체와 공용체.
컴퓨터 프로그래밍 기초 [Final] 기말고사
Linux/UNIX Programming
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
시스템 보안 [Buffer Overflow] DEC, 15, 2013 By 박동혁.
5장. 참조 타입.
07. 디바이스 드라이버의 초기화와 종료 김진홍
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
6장. printf와 scanf 함수에 대한 고찰
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
C#.
C 2장. C 프로그램 시작하기 #include <stdio.h> int main(void) { int num;
10강. JSP 본격적으로 살펴보기-II 스크립트릿, 선언, 표현식 지시자 주석 Lecturer Kim Myoung-Ho
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
컴퓨터 개론 및 실습 11. 동적 메모리 할당.
이름 : 황 상 두 전화번호 : 이메일 : PinTool 이름 : 황 상 두 전화번호 : 이메일 :
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
에어 조건문.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
ARM Development Suite v1.2
8주차: Strings, Arrays and Pointers
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
문자열 컴퓨터시뮬레이션학과 2015년 봄학기 담당교수 : 이형원 E304호,
컴퓨터 프로그래밍 기초 [01] Visual Studio 설치 및 사용방법
Canary value 스택 가드(Stack Guard).
( Windows Service Application Debugging )
디버깅 관련 옵션 실습해보기 발표 : 2008년 5월 19일 2분반 정 훈 승
OpenCV 설정 2.21 만든이 딩딩.
에어 PHP 입문.
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
FTZ 과제풀이 Level 11,12 HyunJae Lee
13주 실습강의 학기, 소프트웨어 설계 및 실험(Ⅰ).
3장 JSP프로그래밍의 개요 이장에서 배울 내용 : JSP페이지의 기본적인 개요설명과 JSP페이지의 처리과정 그리고 웹 어플리케이션의 구조에 대해서 학습한다.
함수, 모듈.
TVM ver 최종보고서
발표자 : 이지연 Programming Systems Lab.
Numerical Analysis Programming using NRs
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
CCIT 네트워크 발표 정보보호학과 평문 사이트와 SSL 사이트, SSL strip과 데이터 변조를 이용한 로그인 취약점
CODE INJECTION 시스템B 김한슬.
Pointers summary.
6 객체.
20 XMLHttpRequest.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

FSB 숭실대학교 ACK 박수완(LinkC) skyhwen@naver.com

What is FSB? FSB(Format String Bug) Format String? 버퍼오버플로우와 함께 대표적인 시스템 해킹으로 꼽히는 기술 버퍼오버플로우가 나온지 20여년 후에 기술 발견 포맷스트링의 버그를 이용해 메모리를 변조하는 기술 Format String? ex) printf(“%s\n”,Welcome ACK!”); C언어의 변환 명세를 의미

Kind of Format String 파라미터 변수형식 %d 정수형 10진수 상수 %f 실수형 상수 %c 문자 값 %s 문자 스트링 %x 양의 정수(16진수) %n 쓰인 총 바이트 수를 지정할 정수형 포인터

Format String : %n을 이용한 변조 %n을 사용했을 뿐인데 i와 j의 값이 변했음을 알 수 있다. %n 과 대응하는 주소의 실제 값이 변했다. 변환 값은 앞에 쓰인 총 바이 트에 해당한다. 즉 %n은 자신과 대응하는 값에 앞서 쓰인 총 바이트 의 정수값을 넣는다는 것 을 짐작할 수 있다.

A vulnerable code 배열 buf를 선언하고 사용자에게 값을 입력받은 후 출력하는 간단한 프로그램 ▲invulnerable code

What is the problem? Q.단순히 쓰레기 값 일까? A의 아스키 코드는 41 임을 주목하자 첫번째 결과는 아무 이상이 없어 보이지만 %x 라는 Format String 을 사용하자 42130a14 라는 알 수 없는 8자리 숫자가 나타남을 알 수 있다. Q.단순히 쓰레기 값 일까? A의 아스키 코드는 41 임을 주목하자 4번째 명세부터 사용 자가 입력한 값을 가 리킨다. AAAA <-%x 0x8048269 0xbfffd5f8 0x42130a14

What is the key? 취약한 Printf() 로 사용자가 입력한 값에 접 근할 수 있다. 즉, printf와 %n을 함께 이용하면 사용자가 입력한 특정 주소의 값을 변경 할 수 있다

메모리 변조 시도 #1 Printf 함수내용을 cat으로 읽어 그 출 력결과를 | (pipe) 를 통해 level20의 입력값으로 넘겨준다.

메모리 변조 시도 #2 Q. 메모리 상에 정확히 기입이 됐는데 변조는 일 어나지 않았다. ◆%를 두번써준 이유는 cat 을 지나며 하나가 사라지기 때문 ◆0xbffffb20에 값을 넣어주는데 2byte씩 작은 값부터 넣어주는 이유는 메모리 적재 방식이 Little endian 이기 때문 Q. 메모리 상에 정확히 기입이 됐는데 변조는 일 어나지 않았다.

메모리 변조 시도 #3 Q. 왜 22byte가 들어간건가? 4번째 Format String 부터 입력값을 받았다는 것을 기억하라. 특정 메모리 값의 변조에 성공했다. Q. 왜 22byte가 들어간건가?

메모리 변조 시도 #4 Q. 왜 22byte가 들어간건가? 4byte+??+??+??=22byte 4byte + 2 byte + 8byte + 8byte= 22byte! FSB는 1이라도 값이 달라지면 실패하는 정교 한 공격이기 때문에 정확한 값을 위해서 x의 최대 자리수 8을 앞에 붙여주자.

Hacker School FTZ level20 Setreuid:권한 상승 Fgets : 사용자에게 79자 입력을 받는다. BOF는 불가! BOF:buffer를 overflow시켜서 메모 리를 변조시키는 방법 Printf : FSB 의 단 서

How to FSB? EGG Shell을 실행시켜 환경변수에 Shell code 를 삽입한다. 환경변수 Shell code 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 , 동적인 값들의 모임 Shell code 쉘에서 사용하는 기계어 코드를 의미 Setuid로 권한상승후에 쉘(/bin/sh)을 실행시키는 코드 적재 Setuid:파일에 걸리는 일종의 속성으로 실행시키는 동안 파일 소유자의 권한을 가지게 된다. 이는 많은 공격의 target이 되 곤 한다.

How to FSB?#2 파일이 동작하면서 실행하는 포인터에 EGG Shell로 등록한 코드의 주소를 집어 넣는다. RET(Return Address) :함수가 끝나고 실행할 주소 가 담겨있는 포인터 파일이 실행되면 Setuid 로 권한 상승이 일어 나고 EGG Shell로 삽입한 코드가 실행되면서 파일 소유자의 권한의 쉘을 얻는다.

What is the EGG shell? egg·shell n. 달걀 껍질;깨지기 쉬운 것 ━ a. 얇고 부서지기 쉬 운 특정 환경 변수(EGG)에 사용자가 입력한 shellcode 를 등록시켜 주 고 그 주소를 출력 시켜주는 프로 그램 Shell code 의 의미? 메모리에 /bin/sh라는 문자열 을 위치 시키고 이를 실행시키 는 code로 이루어져있다. Shell code를 수정하여 유동성 있 게 사용할 수 있다.

Real FSB#1 -EGG Shell, getenv 실행 ▲환경변수를 확인하는 명령어 env로 등록된 EGG의 확인 ◀EGG쉘의 주소를 정확히 알기 위해 getenv 실행

Real FSB#2 RET의 검색 Objdump 명령어를 이용해서 level20 이 실행시 호출되 는 것들을 확인해 보자. Objdump: object file 에 대한 여러 가지 정보 출력 Object file: 컴파 일 도중 만들어지는 파일로 여러가지 정 보를 포함 이중에서 이용 할 것은 main 종료시 실행되 는 .dtors 영역 이다.

Real FSB#3 Exploit code! EGG 쉘의 주소를 .dtors 의 두번째 영역에서 +4 한 값에 넣어주면 된다. Dtors 영역 0x08049594에 EGG의 주소0xbfffff1c9를 집어 넣는다. Bffff1c9 의 정수값은 3221221833 ▲각 변환 명세가 가리키는 스택 0x08049504 <-%n AAAA <-%8x ??

Real FSB#4 Exploit code! Q. 프로그램이 도중에 끝나버린다. 어디가 잘못된것일 까? 3221221833은 너무 큰수라 인식할 수 없다. 그렇다면 2byte씩 나눠 넣는것은 어떨까? 그러니까 처음 2byte는 0xbfffff1c9 중 f1c9를 다음 2byte 는 bfff 를 넣는다. F1c9 의 정수값은 61897 이고 앞서 쓴 주소 값과 문자열값 40을 빼면 61857 문자열값 40: 4(aaaa)+4(bbbb)+8(%8x)x3+4(주소값)x2 bfff를 넣어줘야 하는데 스택에서 bf로 시작하는 주소값은 ‘-’를 의미한다. 양수의 경우는 이와 구분짓기 위해 앞에 1을 생략한다. 고로 bfff의 실제 값은 1bfff인셈 1bfff은 114687이고 앞서 61857+40자가 쓰였으므로 이를 빼 주면 52790 이 된다.

Real FSB#5 Exploit code! 0x08049596~0x08049597에는 1bfff를 넣어주면 즉, 0x08049594~0x08049595에는 f1c9를 넣어주고 0x08049596~0x08049597에는 1bfff를 넣어주면 0x08049594부터 4바이트는 bffff1c9 값을 가지게 된 다. 0x08049596 <-%n= 114687=1bfff BBBB <-%52790c 0x08049594 <-%n= 61897=f1c9 AAAA <-%61857c ??? <-%x

Real FSB#5 Exploit code! 고로 최종 코드는.. 이고 이를 실행시키면

Do you have any question? #final Thank you :) Do you have any question?