Microsoft Word - UFuz3 분석.doc

Similar documents
Deok9_Exploit Technique

hlogin2

No Slide Title

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

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

Debug Technique

IDA 5.x Manual hwp

K&R2 Reference Manual 번역본

BMP 파일 처리

0x00 Contents 0x About Nickster 0x Analaysis 0x Exploit

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

chap 5: Trees

11장 포인터

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

INTRO Basic architecture of modern computers Basic and most used assembly instructions on x86 Installing an assembly compiler and RE tools Practice co

API 매뉴얼

슬라이드 1

Microsoft Word - building the win32 shellcode 01.doc

제목

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

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

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

슬라이드 1

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

Frama-C/JESSIS 사용법 소개

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

chap7.key

Microsoft PowerPoint - chap01-C언어개요.pptx

5.스택(강의자료).key

Chapter #01 Subject

PowerPoint Presentation

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

03장.스택.key

PowerPoint 프레젠테이션

Microsoft Word - MSOffice_WPS_analysis.doc

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

PowerPoint 프레젠테이션

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

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

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

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

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

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

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft Word doc

Microsoft PowerPoint - chap06-2pointer.ppt

<4D F736F F F696E74202D204B FC7C1B7CEB1D7B7A55F F6E48616E646C6572B8A6C5EBC7D1BFA1B7AFB0CBC3E2B9D7BCF6C1A

강의10

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp


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

UI TASK & KEY EVENT

PowerPoint 프레젠테이션

목차 1. 소개... 3 가. BOF란?... 3 나. 윈도우 BOF 개발환경및사용툴 Shellcode 작성하기... 4 가. cmd 쉘 ) 소스코드작성 ) 디스어셈블리 ) 어셈블리코드편집 간단

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

MPLAB C18 C

untitled

Microsoft Word - FunctionCall

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

hlogin7

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

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

Microsoft PowerPoint APUE(Intro).ppt

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


untitled

쉽게 풀어쓴 C 프로그래밍

1장 윈도우 프로그래밍 들어가기

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Microsoft Word - 1. ARM Assembly 실습_xp2.doc

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

11장 포인터

슬라이드 1

Microsoft Word - Reversing Engineering Code with IDA Pro-4-1.doc

PowerPoint 프레젠테이션

2009년 상반기 사업계획

6주차.key

adfasdfasfdasfasfadf

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

gdb 사용법 Debugging Debug라는말은 bug를없앤다는말이다. Bug란, 컴퓨터프로그램상의논리적오류를말하며, 이것을찾아해결하는과정이바로, debugging이다. 초기컴퓨터들은실제벌레가컴퓨터에들어가서오작동을일으키는경우가있었다고하며, 여기서 debug 이라는말이

ISP and CodeVisionAVR C Compiler.hwp

C++ Programming

Microsoft PowerPoint - ch07 - 포인터 pm0415


歯9장.PDF

商用

슬라이드 1

02장.배열과 클래스

untitled

vi 사용법

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

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

02( ) CSTV11-22.hwp

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

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

/* */

Transcription:

파일퍼저 UFuz3 분석 이용일 (foryou2008@nate.com) 2008-07-26 0. 개요 UFuz3 는 eeye 에서공개한파일퍼저입니다. UFuz3 의기능분석및상세분석을통해, 퍼저는어떤모 습을갖추고있는지, 또한퍼저는내부적으로어떤방식으로동작하는지살펴보려고합니다. 1. 기능분석 UFuz3 는파일을파싱하는루틴내에 Integer Overflow 가존재하는지를검사합니다. 따라서퍼징의대 상이되는대상프로그램은데이터파일을입력으로받아야하는제한이있습니다. 다음은파일파싱루틴내에 Integer Overflow 가존재하는예제입니다. (UFuz3 도움말에있는예제소 스입니다. 정확히말해, 이소스는 Integer Overflow 를포함하고있다라고볼수없습니다.) #include <windows.h> #include <stdio.h> void subfunc(char *buf, DWORD len) { FILE char *fp; *mem; mem = malloc(32768); memcpy(mem, buf, len); // buffer overflow if ((fp = fopen(mem, "r"))) fclose(fp); free(mem);

} int APIENTRY WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPTSTR lpcmdline, int ncmdshow) { FILE char char *fp; buf[64000]; szfilename[512]; DWORD v; DWORD WCHAR dwargc; **lpszargv; lpszargv = CommandLineToArgvW(GetCommandLineW(),&(dwArgc)); if (dwargc==2){ memset(szfilename,0,sizeof(szfilename)); _snprintf(szfilename,sizeof(szfilename)-1,"%ws",lpszargv[1]); if ((fp=fopen(szfilename,"rb"))){ fread(buf, 1, sizeof(buf), fp); v=*((dword *)(buf+16)); // 파일시작 + 오프셋 0x10 위치의값을 // subfunc의두번째인자인 length로사용한다. subfunc(buf+4,v); fclose(fp); }else{ sprintf(buf,"can not open '%s'",szfilename); MessageBox(NULL,buf,"Error",MB_OK); } }else{ sprintf(buf,"invalud number of arguments (%d)",dwargc); MessageBox(NULL,buf,"Error",MB_OK); } return 0; } [ 소스 1] UFuz3 도움말예제소스 [ 소스 1] 은특정파일을오픈하고, 오픈한파일의시작으로부터 0x10 위치에있는더블워드값을

length 로활용합니다. 이때 length 의바운더리체크를하지않아, 할당된메모리의크기보다더많은 length 만큼의데이터를쓸수있는기회가발생합니다. 만약데이터파일이다음과같이조작되었다고가정해봅시다. ADDRESS 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ------------------------------------------------------------------------------ 00000000 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF... 00000010 00 90 00 00 61 61 61 61 61 61 61 61 61 61 61 61...aaaaaaaaaaaa 00000020 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa 데이터파일의 0x10 0x13 까지는 length로활용되는부분인데, 0x00009000로조작되었습니다. 따라 서 32768 바이트크기의메모리에 36864 바이트만큼의파일데이터를쓰게될것이므로오버플로우가 발생할것입니다. * [ 소스 1] 은 UFuz3 의도움말에들어가있는예제소스인데, Integer Overflow 의예제로사용하기에는 적절하지않다고생각합니다. Integer Overflow 라는것은말그대로, Integer Variable 이수용할수있는 값의범위를초과하게되어예상하지못한결과를만들어내게되는것인데, Widthness overflow 나 Arithmetic Operation 의결과로써그원인이발생합니다. 하지만 [ 소스 1] 의경우에는, 어떤 Arithmetic Operation 의결과로서 Integer Variable 에오버플로우가발생하는것이아니라, 단순히 Boundary Checking 을하지않아서발생하는오버플로우라생각되어질수밖에없습니다. 하지만예제가부적절 하다고해서 UFuz3 가 Integer Overflow 를찾지못한다는것은아닙니다. UFuz3 는데이터파일의여러 랜덤한위치에 Integer Overflow 를일으킬만한값을적고, 대상프로그램을실행하여 Integer Overflow 를유도하고있습니다.

이제, 실제 [ 소스 1] 을컴파일한대상프로그램과데이터파일을가지고 UFuz3 를실행해보겠습니다. [ 그림 1] Ufuz3 GUI 실행첫화면 [ 그림 2] 퍼징옵션설정화면

다음은옵션설명입니다. 옵션이름 설명 Target Application 대상프로그램을지정합니다. Data File 대상프로그램이사용할데이터파일을지정합니다. Endian 워드인코딩방식을지정합니다. 보통대부분의윈도우어플리케이션 은 Little-Endian 방식을사용합니다. 하지만 Real-Player 와같은몇몇 어플리케이션은 Big-Endian 방식을사용합니다. Timeout 만약에어플리케이션이 Exception 을발생하지않을경우에, 강제로어 플리케이션을종료시켜야할것입니다. 지정한 Timeout 내에어플리케 이션이종료하지않으면, 강제로종료합니다. Threads Ufuz3 은멀티스레딩을지원합니다. Threads 에서지정한수만큼스레드 가생성되어, 분산적으로데이터파일을조작하여, 대상프로그램을검사합니다. Threads 옵션을잘활용하면, 좀더빠르게결과를도출해낼수있습니다. Start Offset 데이터파일의시작위치를지정합니다. Patterns 데이터파일에쓰여질패턴을지정합니다., 를사용해여러개의패턴 도지정가능합니다. Size Field Recognition Length 필드라고판단되지않는데이터파일영역은 skip 합니다. 보통 length 필드는 32 1E 00 00 과같이 0x00 을포함합니다. 따라서만약 이옵션을켜놓았다면, 데이터파일에서 0x00 을포함하지않는필드 는 Length 필드가아니라고판단하여 Skip 할것입니다.

[ 그림 3] Ufuz3 의퍼징결과 [ 그림 3] 의결과를해석해보겠습니다. Offset Value Address 설명 00000012 FFFF 0040153A 데이터파일오프셋 0x12 위치에 FFFF값을적고, 대상프로그램을실행했더니, 0x0040153A 위치에서예외가발생했다는의미입니다. 00000011 FFFF 004016C0 데이터파일오프셋 0x11 위치에 FFFF값을적고, 대상프로그램을실행했더니, 0x004016C0 위치에서예외가발생했다는의미입니다. 00000010 FFFFFFFF 0040153A 데이터파일오프셋 0x10 위치에 FFFFFFFF값을적고, 대상프로그램을실행했더니, 0x0040153A 위치에서예외가발생했다는의미입니다.

2. 상세분석 MS Windows 에서는프로그램을디버깅하기위한 Debugger API Set 을제공합니다. UFuz3 역시이러 한 Debugger API 를사용하여대상프로그램을실행하고, 예외가발생하는지를확인하고있습니다. UFuz3 은대상프로그램을디버그하기위해 CreateProcess 를사용해대상프로그램을실행합니다. 여 기서관심을가져야할파라미터는바로프로세스의생성옵션을지정하는 dwcreationflags 부분입니 다. dwcreationflags 중에서 DEBUG_PROCESS 플래그설명을살펴봅시다. (From MSDN) The calling thread starts and debugs the new process and all child processes created by the new process. It can receive all related debug events using the WaitForDebugEvent function. A process that uses DEBUG_PROCESS becomes the root of a debugging chain. This continues until another process in the chain is created with DEBUG_PROCESS. If this flag is combined with DEBUG_ONLY_THIS_PROCESS, the caller debugs only the new process, not any child processes. CreateProcess를호출한스레드는생성된프로세스와그자식프로세스까지모두디버그합니다. WaitForDebugEvent 함수를사용해디버그와관련된모든이벤트를받을수있습니다. DEBUG_ONLY_THIS_PROCESS와같이사용되면, 자식프로세스는제외하고오직생성된프로세스만디버그합니다. UFuz3 는아래와같이 DEBUG_PROCESS 플래그를사용하여 CreateProcess 를호출하는것을알수있 습니다..text:00401241 push ecx ; lpprocessinformation.text:00401242 lea edx, [esp+1d0h+startupinfo].text:00401249 push edx ; lpstartupinfo.text:0040124a push eax ; lpcurrentdirectory.text:0040124b push eax ; lpenvironment.text:0040124c push 11h ; dwcreationflags.text:0040124e push 1 ; binherithandles.text:00401250 push eax ; lpthreadattributes

.text:00401251 push eax ; lpprocessattributes.text:00401252 push esi ; lpcommandline.text:00401253 push eax ; lpapplicationname.text:00401254 mov [esp+1f4h+lparam], eax.text:00401258 mov [esp+3ch], eax.text:0040125c mov [esp+40h], eax.text:00401260 mov [esp+44h], eax.text:00401264 mov [esp+1f4h+startupinfo.cb], 44h.text:0040126F call ds:createprocessa 앞서언급했듯이, 디버그이벤트를통지받기위해, WaitForDebugEvent API 를사용한다고하였습니다. UFuz3도 WaitForDebugEvent API를사용할것입니다. 한번살펴봅시다..text:00401282 mov ecx, dwmilliseconds.text:00401288 mov esi, ds:waitfordebugevent.text:0040128e add esp, 0Ch.text:00401291 push ecx ; dwmilliseconds.text:00401292 lea edx, [esp+1d0h+dwprocessid].text:00401296 push edx ; lpdebugevent.text:00401297 call esi ; WaitForDebugEvent WaitForDebugEvent 의프로토타입은다음과같습니다. 즉, 지정한 dwmilliseconds 만큼디버그이벤트 를기다리는동안에디버그이벤트가발생하면, lpdebugevent 에디버그이벤트관련정보를채우고, 리턴하는것입니다. 만약에지정한 dwmilliseconds 내에디버그이벤트가발생하지않았거나, 예기치 못한에러가발생했다면 WaitForDebugEvent 는 zero 를리턴하고, 지정한시간내에디버그이벤트가 발생했다면 nonzero 를리턴합니다. BOOL WINAPI WaitForDebugEvent( out LPDEBUG_EVENT lpdebugevent, in DWORD dwmilliseconds);

여기서추론해볼수있는부분은, 1) dwmilliseconds 부분에는우리가 UFuz3 실행시에옵션으로지정했던 Timeout 값이들어갈것이다. 2) 만약 WaitForDebugEvent 가 zero 를리턴했다면, 지정한 Timeout 동안에아무런이벤트가발생하지 않았다는의미이며, 이는곧예외가발생하지않았음을의미한다. 따라서프로세스를강제로종료해야 할것이다. 3) 만약 WaitForDebugEvent 가 nonzero 를리턴했다면, 지정한 Timeout 동안에디버그이벤트가발생했 다는것을의미한다. 따라서디버그이벤트의내용을살펴, 그것이예외와관련된이벤트였다면, 대상 프로그램에서예외가발생했다는것을의미하며이것은 UFuz3 가원하던결과이다. 따라서이러한결 과를저장한다. 우선 1) 부터확인해보겠습니다. UFuz3 의퍼징옵션중 Timeout 값을 1000msec 로지정하고, 퍼징을실행한후디버거를통해 WaitForDebugEvent 의파라미터를확인해봅니다. 다음은 ollydbg 에서확인한모습입니다. 추론한대로 우리가지정한 Timeout 퍼징옵션이그대로 WaitForDebugEvent 에서사용되는것을알수있습니다. 다음은 3) 을확인해보겠습니다. WaitForDebugEvent 에서 nonzero 를리턴했다면, WaitForDebugEvent 의 첫번째파라미터 (DEBUG_EVENT 구조체타입 ) 는유효한값이들어가있을것입니다. 다음은 DEBUG_EVENT 구조체의정의입니다. typedef struct _DEBUG_EVENT { DWORD dwdebugeventcode; DWORD dwprocessid; DWORD dwthreadid; union { EXCEPTION_DEBUG_INFO Exception;

CREATE_THREAD_DEBUG_INFO CreateThread; CREATE_PROCESS_DEBUG_INFO CreateProcessInfo; EXIT_THREAD_DEBUG_INFO ExitThread; EXIT_PROCESS_DEBUG_INFO ExitProcess; LOAD_DLL_DEBUG_INFO LoadDll; UNLOAD_DLL_DEBUG_INFO UnloadDll; OUTPUT_DEBUG_STRING_INFO DebugString; RIP_INFO RipInfo; } u; } DEBUG_EVENT, *LPDEBUG_EVENT; DEBUG_EVENT의 dwdebugeventcode 멤버는이름에서알수있듯이, 디버그이벤트가무엇인지를알 려주는 ID 입니다. UFuz3 가관심을가지는디버그이벤트는예외가발생한경우겠죠. 따라서 UFuz3 는 dwdebugeventcode 이 EXCEPTION 이벤트를가리키는지를살펴볼것입니다. 다음코드는 dwdebugeventcode 가 EXCEPTION_DEBUG_EVENT(1) 인지를확인하는부분입니다..text:004012A3 loc_4012a3: ; CODE XREF: sub_401200+100 j.text:004012a3 mov eax, [esp+1cch+dwprocessid] ; ; switch (dwdebugeventcode) ; { ; case EXCEPTION_DEBUG_EVENT: ; goto loc_4012cd;.text:004012a7 sub eax, 1 ; #define EXCEPTION_DEBUG_EVENT 1.text:004012AA jz short loc_4012cd dwdebugeventcode 에따라 DEBUG_EVENT 구조체에서참조해야하는멤버가달라지게됩니다. dwdebugeventcode 가 EXCEPTION_DEBUG_EVENT 일경우에는, DEBUG_EVENT 구조체의 EXCEPTION_DEBUG_INFO Exception 을참조해야합니다. EXCEPTION_DEBUG_INFO 구조체는다음과같 습니다. typedef struct _EXCEPTION_DEBUG_INFO {

EXCEPTION_RECORD ExceptionRecord; DWORD dwfirstchance; } EXCEPTION_DEBUG_INFO, EXCEPTION 이벤트도여러가지종류가있을것입니다. 잘못된메모리참조예외 (Access Violation) 이나 Breakpoint 예외, Divide By Zero 예외등이있습니다. 이중에서 UFuz3 는잘못된메모리참조예외에 대해서만캐치를하는군요. EXCEPTION 이벤트의상세종류는 EXCEPTION_RECORD 의 ExceptionCode 에서알려주고있습니다. UFuz3 는 EXCEPTION_RECORD 의 ExceptionCode 멤버값이 EXCEPTION_ACCESS_VIOLATION 인지를확인 하여디버그프로세스가 Access Violation 예외가발생하였는지를판단하고있습니다..text:004012CD loc_4012cd: ; CODE XREF: sub_401200+aa j ; ; switch (DEBUG_EVENT->Exception.ExceptionRecord.ExceptionCode) ; { ; case EXCEPTION_ACCESS_VIOLATION: // 0C0000005h ; goto loc_401362;.text:004012cd cmp dword ptr [esp+2ch], 0C0000005h.text:004012D5 jz loc_401362.text:00401362 loc_401362: ; CODE XREF: sub_401200+d5 j.text:00401362 mov eax, dword ptr [esp+1cch+arg_4].text:00401369 push eax ; char.text:0040136a push offset aexception_acce ; "EXCEPTION_ACCESS_VIOLATION (%d)\n".text:0040136f call sub_401000.text:00401374 mov ecx, [esp+84h].text:0040137b push ecx ; char.text:0040137c push offset adwfirstchanced ; " dwfirstchance = %d\n".text:00401381 call sub_401000.text:00401386 mov edx, [esp+3ch].text:0040138a push edx ; char

.text:0040138b push offset aexceptioncodex ; " ExceptionCode = %x\n".text:00401390 call sub_401000.text:00401395 mov eax, [esp+50h].text:00401399 push eax ; char.text:0040139a push offset aexceptionaddrx ; " ExceptionAddr = %x\n".text:0040139f call sub_401000.text:004013a4 lea ecx, [esp+1ech+newfilename].text:004013ab push ecx.text:004013ac push offset ExistingFileName.text:004013B1 mov edi, 5.text:004013B6 call sub_4010e0 * Windows Debugger API Set 에대한더자세한정보는 msdn 을참고해주세요. 3. 결론 UFuz3 는아주기본적인파일퍼저입니다. 다른퍼저에비해어떤특징적인부분을제공하고있지는 않습니다. 버그도많이보이고, 인터페이스도사실엉망입니다. 그리고퍼징결과또한만족스럽지못 하고요. eeye 에서저런프로그램을공개했다는것이다소의문입니다 ( 개인적인견해입니다.) 하지만파 일퍼징을공부하는입장에서, UFuz3 을사용해봄으로써기본적으로파일퍼저가어떤기능을수행하 며, 또한윈도우에서는어떤식으로구현되는지를알아볼수있었다는데의의를두고싶습니다.

파일이름 : UFuz3 분석폴더 : C: Documents and Settings hp 바탕화면서식파일 : C: Documents and Settings hp Application Data Microsoft Templates Normal.dot 제목 : UFuz3 분석주제 : 만든이 : m 키워드 : 메모 : 만든날짜 : 2008-07-26 AM 11:31:00 수정횟수 : 151 마지막으로저장한날짜 : 2008-07-26 PM 2:49:00 마지막으로저장한사람 : m 전체편집시간 : 198 분마지막으로인쇄한날짜 : 2008-07-26 PM 2:49:00 문서량페이지수 : 12 단어수 : 1,835 ( 약 ) 문자수 : 10,463 ( 약 )