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

Similar documents
Microsoft PowerPoint - chap06-2pointer.ppt

<B1E2BCFAB9AEBCAD5FB9DABAB4B1D45F F F64746F72732E687770>

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

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

슬라이드 1

: 1 int arr[9]; int n, i; printf(" : "); scanf("%d", &n); : : for(i=1; i<10; i++) arr[i-1] = n * i; for(i=0; i<9; i++) if(i%2 == 1) print

untitled

Microsoft PowerPoint - ch07 - 포인터 pm0415

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

C 언어 프로그래밊 과제 풀이

11장 포인터

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

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

Microsoft PowerPoint - Java7.pptx

PowerPoint 프레젠테이션

많이 이용하는 라면,햄버그,과자,탄산음료등은 무서운 병을 유발하고 비만의 원인 식품 이다. 8,등겨에 흘려 보낸 영양을 되 찾을 수 있다. 도정과정에서 등겨에 흘려 보낸 영양 많은 쌀눈과 쌀껍질의 영양을 등겨를 물에 우러나게하여 장시간 물에 담가 두어 영양을 되 찾는다

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

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

중간고사

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

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

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

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

Microsoft PowerPoint - 제11장 포인터

PowerPoint 프레젠테이션

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

PowerPoint 프레젠테이션

C 프로그램의 기본

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

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

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

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

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

OCW_C언어 기초

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

C++ Programming

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

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

Microsoft PowerPoint - chap-11.pptx

Microsoft PowerPoint - [2009] 02.pptx

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

PowerPoint Presentation

BY-FDP-4-70.hwp

히스토그램구하기 사전준비 : 히스토그램을저장할메모리가필요함 필요한메모리개수 à 전체영상의픽셀은그값이 0 ~ 255이므로 256 개의메모리필요함 영상을구성하는픽셀의개수는매우크므로메모리형식은 unsigned long으로해야함 ( unsigned 란 +/- 를고려하지않는다는

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

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - chap06-5 [호환 모드]

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

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

슬라이드 1

Microsoft PowerPoint - C++ 5 .pptx

C 프로그래밊 개요

C 프로그래밊 개요

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

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

PowerPoint 프레젠테이션

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

Frama-C/JESSIS 사용법 소개

Microsoft PowerPoint - chap06-4 [호환 모드]

03장.스택.key

vi 사용법

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

BMP 파일 처리

Microsoft PowerPoint - chap06-1Array.ppt

PowerPoint 프레젠테이션

The Pocket Guide to TCP/IP Sockets: C Version

PowerPoint 프레젠테이션

목차 배열의개요 배열사용하기 다차원배열 배열을이용한문자열다루기 실무응용예제 C 2

설계란 무엇인가?

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션


PowerPoint 프레젠테이션

슬라이드 1

untitled

본 강의에 들어가기 전

11장 포인터


API 매뉴얼

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

버퍼오버플로우-왕기초편 11. 리틀엔디안과빅엔디안 dumpcode() 함수에대해알게된구타는대견하게도실습을하기로마음먹습니다. 구타는먼저 4 바이트짜리정수형변수를하나만든후, 그것을 memory dump 를해보기로했습니다. #include dumpcode.h int main

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

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

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

슬라이드 1

C++ Programming

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap05-제어문.pptx

Infinity(∞) Strategy

설계란 무엇인가?

PowerPoint Presentation

untitled

KNK_C_05_Pointers_Arrays_structures_summary_v02

Microsoft Word - PLC제어응용-2차시.doc

, ( ),, ( ), 3, int kor[5]; int eng[5]; int Microsoft Windows 4 (ANSI C2 ) int kor[5] 20 # define #define SIZE 20 int a[10]; char c[10]; float

chap8.PDF

PowerPoint 프레젠테이션

Transcription:

앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습니다. 여러분모두 Windows 에서 hex editor(hex dump, hex viewer) 라는것을사용해보셨을겁니다. 바로바이너리파일을 16 진수 (hex) 로보여주는프로그램입니다. 90

이러한 hex editor 는주로평문으로출력할수없는값들을확인하거나, 바이너리파일내의특정값들을변경하고자할때사용됩니다. 그럼리눅스에서바이너리파일을 16 진수로보고자할때주로사용되는프로그램엔무엇이있을까요? 대표적인예로 /usr/bin/xxd 가있습니다 $ xxd /bin/ls 0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000.ELF... 0000010: 0200 0300 0100 0000 a093 0408 3400 0000...4... 0000020: 50a4 0000 0000 0000 3400 2000 0600 2800 P...4....(. 0000030: 1800 1700 0600 0000 3400 0000 3480 0408...4...4... 0000040: 3480 0408 c000 0000 c000 0000 0500 0000 4... 0000050: 0400 0000 0300 0000 f400 0000 f480 0408... 0000060: f480 0408 1300 0000 1300 0000 0400 0000... 0000070: 0100 0000 0100 0000 0000 0000 0080 0408... 0000080: 0080 0408 00a1 0000 00a1 0000 0500 0000... 0000090: 0010 0000 0100 0000 00a1 0000 0031 0508...1.. 00000a0: 0031 0508 7002 0000 0805 0000 0600 0000.1..p... 00000b0: 0010 0000 0200 0000 c8a2 0000 c832 0508...2.. 00000c0: c832 0508 a800 0000 a800 0000 0600 0000.2... 00000d0: 0400 0000 0400 0000 0801 0000 0881 0408... 00000e0: 0881 0408 2000 0000 2000 0000 0400 0000......... 00000f0: 0400 0000 2f6c 6962 2f6c 642d 6c69 6e75.../lib/ld-linu... 생략... 그리고비슷한프로그램으로 /usr/bin/hexdump 가있습니다. hexdump 는 xxd 와는반대의 byte order( 바이트출력순서 ) 를사용합니다. 가장첫 2 바이트를보면 hexdump 와는순서가반대인것을알수있습니다. 91

$ hexdump /bin/ls 0000000 457f 464c 0101 0001 0000 0000 0000 0000 0000010 0002 0003 0001 0000 93a0 0804 0034 0000 0000020 a450 0000 0000 0000 0034 0020 0006 0028 0000030 0018 0017 0006 0000 0034 0000 8034 0804 0000040 8034 0804 00c0 0000 00c0 0000 0005 0000 0000050 0004 0000 0003 0000 00f4 0000 80f4 0804 0000060 80f4 0804 0013 0000 0013 0000 0004 0000 0000070 0001 0000 0001 0000 0000 0000 8000 0804 0000080 8000 0804 a100 0000 a100 0000 0005 0000 0000090 1000 0000 0001 0000 a100 0000 3100 0805 00000a0 3100 0805 0270 0000 0508 0000 0006 0000 00000b0 1000 0000 0002 0000 a2c8 0000 32c8 0805 00000c0 32c8 0805 00a8 0000 00a8 0000 0006 0000 00000d0 0004 0000 0004 0000 0108 0000 8108 0804 00000e0 8108 0804 0020 0000 0020 0000 0004 0000 00000f0 0004 0000 6c2f 6269 6c2f 2d64 696c 756e... 생략... 이처럼 xxd 나 hexdump 를이용하면바이너리파일을 16 진수로출력해볼수있습니다. 그리고이들을 vi 와연동시켜사용하면 hex editor 처럼값을수정할수있기도합니다. (vi [ 파일명 ] 실행후 :%!xxd, 복귀시엔 :%!xxd -r) 그럼, 파일형태의바이너리가아닌, 현재실행중인메모리의주소와값을 16 진수로출력하려면어떻게해야할까요? 크게두가지방법이있는데요, 첫째, 디버거 (Debugger) 라는툴을이용하여동적으로메모리를분석하는방법, 둘째, 메모리의주소를출력하는코드를소스코드에추가하는방법입니다. 이중비교적간단하고또많이쓰이는두번째방법에대해설명해드리겠습니다. 다음은메모리주소와값을출력해볼예제프로그램입니다. 92

./10/ex1.c int main() char str[20] = hackerschool! ; printf( %s\n, str); 여기서우리가알고싶은것은변수 str의주소와그에해당하는 16진수값들입니다. 그럼다음과같이소스코드를수정하면될것입니다../10/ex2.c int main() int i; char str[20] = hackerschool! ; printf( %s\n, str); printf( ============= HEX DUMP START =============\n ); // 주소값출력 printf( 0x%08x, &str); // 16 진수값출력 for(i=0; i<sizeof(str); i++) printf( %02x, str[i]); printf( \n============= HEX DUMP END =============\n ); 실행화면은다음과같습니다. 93

$ gcc -o ex2 ex2.c $./ex2 hackerschool! ================== HEX DUMP START =============== 0xbffffb30 68 61 63 6b 65 72 73 63 68 6f 6f 6c 21 00 00 00 00 00 00 00 ================== HEX DUMP END ================= $ 이제위코드를기본으로하여더욱 hex dump 답게만들어나갈수있는데요, 다음은국내해커 ohhara님께서이미만들어놓으신 dumpcode.h라는헤더입니다../10/dumpcode.h // dumpcode.h by ohhara void printchar(unsigned char c) if(isprint(c)) printf( %c,c); // 해당하는값을문자로표시 else printf(. ); // 출력불가능한문자는그냥. 으로표시 // 메모리시작주소와출력할크기를인자로받음 void dumpcode(unsigned char *buff, int len) int i; for(i=0;i<len;i++) // 16 바이트단위로주소출력 if(i%16==0) printf( 0x%08x,&buff[i]); // hex 값출력 printf( %02x,buff[i]); // 해당 16 진수들을각각문자로출력 if(i%16-15==0) 94

int j; printf( ); for(j=i-15;j<=i;j++) printchar(buff[j]); printf( \n ); // 마지막라인이 16바이트이하일경우정렬유지 if(i%16!=0) int j; int spaces=(len-i+16-i%16)*3+2; for(j=0;j<spaces;j++) printf( ); // 부족한공간만큼 space로이동한후, for(j=i-i%16;j<len;j++) printchar(buff[j]); // 남은문자값들출력 printf( \n ); 이를소스코드에추가하거나, 혹은 dumpcode.h 로만든후 include 시키면 dumpcode() 라는함수를사용할수있게됩니다. 또는 dumpcode.h 를 /usr/include/ 디렉토리에복사해넣으시면어느경로에서든 include 하여사용하실수있습니다. 그리고 dumpcode() 함수의원형은다음과같습니다. void dumpcode(unsigned char *buff, int len); buff 엔 dump 하고자하는메모리의시작주소, 그리고 len 엔 dump 할크기를지정합니다. 95

다음은 dumpcode() 를사용한예제입니다../10/ex3.c #include dumpcode.h int main() int i; char str[20] = hackerschool! ; printf( %s\n, str); // str 변수에서부터 100 바이트를출력 dumpcode((unsigned char *)&str, 100); [ 실행결과 ] $./ex3 hackerschool! 0xbffffb30 68 61 63 6b 65 72 73 63 68 6f 6f 6c 21 00 00 00 hackerschool!... 0xbffffb40 00 00 00 00 20 97 04 08 68 fb ff bf cb 09 03 40......h...@ 0xbffffb50 01 00 00 00 94 fb ff bf 9c fb ff bf 68 38 01 40...h8.@ 0xbffffb60 01 00 00 00 90 83 04 08 00 00 00 00 b1 83 04 08... 0xbffffb70 24 86 04 08 01 00 00 00 94 fb ff bf e4 82 04 08 $... 0xbffffb80 ac 86 04 08 60 ae 00 40 8c fb ff bf 90 3e 01 40...`..@...>.@ 0xbffffb90 01 00 00 00... $ 이제마치 xxd 명령을사용한것처럼메모리내용을볼수있게되었습니다. 이처럼메모리의주소와값을눈으로직접확인해가면서버퍼오버플로우를공부하면, 더쉽게메모리의구조를이해할수있게되고, 우리가변조한메모리값이잘바뀌었는지확인하거나, 버퍼오버플로우취약점을어떻게공략해야할지에대한전략을잘짤수있게됩니다. 96

버퍼 오버플로우-왕기초편 10.메모리를 Hex dump 뜨기 dumpcode()는 시스템 해킹을 공부할 때 매우 유용하게 사용되니 잘 익혀두시기 바랍니다. 97