GOM Player 2.0.12 (.ASX)
Stack Overflow Exploit
Document V0.2
HACKING GROUP
HACKING GROUP
HACKING GROUP
HACKING GROUP
“
OVERTIME
OVERTIME
OVERTIME
OVERTIME
”
이 문서는 2009.01.08일자로
milw0rm
에 DATA_SNIPER께서 등록한 곰플레이어 관련
exploit을 분석한 문서이다.
Study를 목적으로 만들었고 잘못된 분석일 가능성이 너무 많기 때문에 서로 공유는
하되 잘못된 부분은 메일로 지적 바란다.^^
<
<
<
< 목
목
목
목 차
차
차
차 >>>>
1. execute exploit
1. execute exploit
1. execute exploit
1. execute exploit
2. analyze exploit
2. analyze exploit
2. analyze exploit
2. analyze exploit
3. analyze asx file
3. analyze asx file
3. analyze asx file
3. analyze asx file
4. summary
4. summary
4. summary
4. summary
1. execute exploit
우선
우선
우선
우선 분석하기
분석하기 전에
분석하기
분석하기
전에
전에
전에
milw0rm
에
에 올라온
에
에
올라온
올라온
올라온 exploit
exploit을
exploit
exploit
을
을
을 한번
한번
한번
한번 실행해
실행해
실행해
실행해 본다
본다
본다
본다....
※ ※ ※
※ 이이이이 취약점취약점취약점취약점은은은은 이전에이전에이전에이전에 Parvez Anwar께서 2007께서께서께서 2007 2007 2007년년년년 2 2월초에 2 2월초에월초에월초에 GOM Player ASX Playlist Buffer Overflow라라라라 는
는 는
는 이름으로이름으로이름으로이름으로 발표를발표를발표를발표를 한한한한적이적이적이적이 있다있다있다있다. “ref href” 태그를태그를태그를태그를 이용해서이용해서이용해서이용해서 URI 링크를링크를링크를링크를 시키는데시키는데시키는데시키는데 length체크를체크를체크를체크를 하지하지하지하지 않아않아않아않아 긴긴긴긴 URI를를를를 넣음으로써넣음으로써넣음으로써넣음으로써 스택스택스택스택 기반의기반의기반의기반의 버퍼오버플로우가버퍼오버플로우가버퍼오버플로우가버퍼오버플로우가 발생된다발생된다발생된다발생된다.
1.1
1.1
1.1
1.1 실행
실행
실행
실행 환경
환경
환경
환경
OS : Microsoft Windows XP Pro V2002 SP2 OS : Microsoft Windows XP Pro V2002 SP2 OS : Microsoft Windows XP Pro V2002 SP2 OS : Microsoft Windows XP Pro V2002 SP2 GOM
GOM GOM
GOM Version : Version : Version : Version : 2.0.122.0.122.0.122.0.12.3375.3375.3375.3375
1.2 exploit
1.2 exploit
1.2 exploit
1.2 exploit 컴파일
컴파일
컴파일
컴파일
exploit download : exploit download : exploit download :
exploit download : http://milw0rm.com/exploits/7702http://milw0rm.com/exploits/7702http://milw0rm.com/exploits/7702http://milw0rm.com/exploits/7702
compiler : Visual Studio .NET 2003 compiler : Visual Studio .NET 2003 compiler : Visual Studio .NET 2003 compiler : Visual Studio .NET 2003
1.3
1.3
1.3
1.3 바이너리
바이너리
바이너리
바이너리 실행
실행
실행
실행
해당 해당 해당
해당 exploit exploit exploit을 exploit을을을 컴파일하고컴파일하고컴파일하고 실행을컴파일하고 실행을실행을실행을 한다한다한다한다....
같은 같은 같은
같은 위치에위치에위치에위치에 ““““GAZA.asxGAZA.asxGAZA.asxGAZA.asx””””파일이파일이파일이파일이 생성된다생성된다생성된다생성된다....
<
< <
< 생성된생성된생성된 악성생성된 악성악성악성 asx asx asx파일 asx파일파일 >파일 > > >
““““GAZA.asxGAZA.asxGAZA.asxGAZA.asx””””파일을파일을파일을파일을 실행시키면실행시키면실행시키면 곰플레이어가실행시키면 곰플레이어가 실행되면서곰플레이어가곰플레이어가 실행되면서실행되면서실행되면서 계산기가계산기가계산기가계산기가 실행된다실행된다실행된다.... 실행된다
< < <
2. analyze exploit
다음으로
다음으로
다음으로
다음으로
milw0rm
에
에 등록된
에
에
등록된
등록된
등록된 expolit
expolit을
expolit
expolit
을
을
을 분석해
분석해
분석해 보자
분석해
보자
보자
보자
2
2
2
2.1
.1
.1 exploit
.1
exploit
exploit 분석
exploit
분석
분석
분석
H H H
Header1[] : asxeader1[] : asxeader1[] : asxeader1[] : asx파일파일파일파일 포멧의포멧의포멧의포멧의 헤더부분헤더부분헤더부분.... 헤더부분 Header2[] : asx
Header2[] : asx Header2[] : asx
Header2[] : asx파일파일파일파일 포멧의포멧의포멧의포멧의 끝부분끝부분끝부분.... 끝부분
Shell[] : windows cale( Shell[] : windows cale( Shell[] : windows cale(
Shell[] : windows cale(계신기계신기계신기) code.계신기) code.) code. ) code.
RE RE RE
RET_T_T_T_Univ[] : 0xUniv[] : 0xUniv[] : 0xUniv[] : 0x00464577004645770046457700464577, , 스택오버플로우로, , 스택오버플로우로스택오버플로우로 EIP스택오버플로우로 EIP EIP EIP덮어씌울덮어씌울덮어씌울덮어씌울 주소주소주소 주소 N
N N
Nop[] op[] op[] : op[] : : : Nops 8BytesNops 8BytesNops 8BytesNops 8Bytes
Payload : Payload : Payload :
Payload : 메모리메모리메모리메모리 copy copy copy copy 및및및 파일및 파일파일 생성파일 생성생성 생성
위 위 위
위 배열을배열을배열을배열을 Header1+junk(0x41)+RET_Univ+Nop+Shell+Header2Header1+junk(0x41)+RET_Univ+Nop+Shell+Header2Header1+junk(0x41)+RET_Univ+Nop+Shell+Header2 순으로Header1+junk(0x41)+RET_Univ+Nop+Shell+Header2 순으로순으로순으로 payload payload payload payload를를 생성를를 생성생성생성 후후후후 GAZA.asx GAZA.asx GAZA.asx파 GAZA.asx파파파 일에
일에 일에
일에 write write write함 write함함.... 함
3. analyze asx file
생성된
생성된
생성된
생성된 GAZA.asx
GAZA.asx
GAZA.asx
GAZA.asx 파일을
파일을
파일을
파일을 분석해
분석해
분석해
분석해 보자
보자
보자
보자
3.1
3.1
3.1
3.1 ASX
ASX
ASX 란
ASX
란
란
란?
?
?
?
ASF Str
ASF Str
ASF Str
ASF Stream Redirector
eam Redirector
eam Redirector
eam Redirector
실제 실제 실제
실제 동영상동영상동영상동영상 데이터가데이터가데이터가데이터가 아닌아닌아닌아닌 텍스트텍스트텍스트 정보만을텍스트 정보만을 가지고정보만을정보만을 가지고가지고 있는가지고 있는있는있는 메타메타 파일메타메타 파일파일임파일임임임....
메모장 메모장 메모장
메모장 등에서등에서등에서등에서 열어열어열어열어 보면보면보면보면 HTML HTML HTML HTML 과과 유사한과과 유사한유사한유사한 형식으로형식으로형식으로형식으로 이루어이루어 져이루어이루어 져져져 있음있음있음있음....
이 이 이
이 파일에는파일에는파일에는 실제파일에는 실제실제실제 동영상이동영상이동영상이동영상이 위치하고위치하고위치하고 있는위치하고 있는 URL 있는있는 URL URL URL 정보정보정보정보와와와 그외의와 그외의그외의그외의 기타기타 정보기타기타 정보정보정보( ( ( 저작권( 저작권저작권, 저작권, , 만든이, 만든이, 만든이만든이, , , 제목제목제목제목 ) )등을 ) )등을등을 표등을 표표표 기할
기할 기할
기할 수수 있고수수 있고있고있고 배너배너배너배너 광고광고광고광고를를 삽입하여를를 삽입하여삽입하여삽입하여 자사의자사의자사의 동영상자사의 동영상동영상동영상 컨텐츠를컨텐츠를 보호컨텐츠를컨텐츠를 보호보호 및보호 및및 홍보할및 홍보할홍보할 수홍보할 수수수 있는있는 기능을있는있는 기능을기능을기능을 제공제공제공함제공함함함....
3.2
3.2
3.2
3.2 ASX
ASX
ASX 의
ASX
의
의 기초
의
기초
기초
기초
<asx version = "3.0" ><asx version = "3.0" ><asx version = "3.0" ><asx version = "3.0" > <entry><entry><entry><entry>
<ref href = "mms://<ref href = "mms://<ref href = "mms://<ref href = "mms://overtimesovertimesovertimesovertimes.com.kr/test.asf"/>.com.kr/test.asf"/>.com.kr/test.asf"/>.com.kr/test.asf"/> </entry></entry></entry></entry>
</asx></asx></asx></asx>
3.2
3.2
3.2
3.2 GAZA.asx
GAZA.asx
GAZA.asx 분석
GAZA.asx
분석
분석
분석
위에서 위에서 위에서
위에서 설명했듯이설명했듯이설명했듯이설명했듯이 GAZA.asx GAZA.asx GAZA.asx파일을 GAZA.asx파일을파일을 메모장으로파일을 메모장으로메모장으로메모장으로 열어보자열어보자열어보자열어보자
O O O
Ollydbgllydbgllydbg로llydbg로로 분석해보자로 분석해보자분석해보자 분석해보자 취약한
취약한 취약한
취약한 곰플레이어곰플레이어 파일을곰플레이어곰플레이어 파일을파일을 올리로파일을 올리로올리로올리로 로드한다로드한다로드한다.... 그리고로드한다 그리고그리고 GAZA.asx그리고 GAZA.asx 파일을 GAZA.asx GAZA.asx 파일을파일을파일을 파일열기로파일열기로파일열기로 한파일열기로 한한한 상태에서상태에서상태에서상태에서 브레이크브레이크브레이크브레이크 포인트걸리게
포인트걸리게 포인트걸리게
포인트걸리게 한다한다한다. 한다. . 그럼. 그럼그럼그럼 메모리에메모리에 GAZA.asx메모리에메모리에 GAZA.asx GAZA.asx GAZA.asx파일이파일이파일이 로딩됨을파일이 로딩됨을 알수로딩됨을로딩됨을 알수알수 있다알수 있다있다....있다((((메모리메모리 서칭기능으로메모리메모리 서칭기능으로서칭기능으로 쉘코드의서칭기능으로 쉘코드의쉘코드의쉘코드의 연속연속연속연속 된
된 된
된 부분을부분을부분을 검색어로부분을 검색어로검색어로검색어로 서칭하면서칭하면서칭하면 찾을서칭하면 찾을 수찾을찾을 수수수 있다있다있다있다)))) 그리고그리고 해당그리고그리고 해당해당해당 메모리에메모리에메모리에 memory bp메모리에 memory bp memory bp를 memory bp를 걸어놔서를를 걸어놔서걸어놔서 이부분을걸어놔서 이부분을이부분을이부분을 건드는건드는건드는건드는
코드를 코드를 코드를
코드를 선별한다선별한다선별한다선별한다. . . 우선. 우선 이런식으로우선우선 이런식으로이런식으로이런식으로 접근해접근해접근해접근해 보자보자보자보자.... step over(F8)
step over(F8) step over(F8)
step over(F8)로로로 계속로 계속계속 call계속 call call call문을문을문을 지나쳐보면문을 지나쳐보면 계산기가지나쳐보면지나쳐보면 계산기가계산기가 뜨는계산기가 뜨는뜨는 시점을뜨는 시점을시점을시점을 찾을찾을 수찾을찾을 수수 있다수 있다있다있다. . . 그럼. 그럼 해당그럼그럼 해당해당해당 call call call문을 call문을문을문을 step step step step into(F7)
into(F7) into(F7)
into(F7)로로로 자세히로 자세히자세히자세히 분석해분석해분석해분석해 보자보자보자보자. . 수상한. . 수상한수상한수상한 것것것것(??)(??)(??)(??)는는 혹시는는 혹시혹시혹시 몰라몰라몰라 캡쳐를몰라 캡쳐를캡쳐를캡쳐를 해놨으며해놨으며 이해놨으며해놨으며 이이 문서에도이 문서에도문서에도문서에도 그냥그냥그냥그냥 덧붙였다덧붙였다덧붙였다덧붙였다.... 별도
별도 별도
별도 설명이설명이설명이설명이 없으면없으면없으면없으면 그냥그냥그냥그냥 넘어가도넘어가도넘어가도넘어가도 될듯하다될듯하다될듯하다될듯하다....
위 위 위
위 그림그림그림그림 중중중중 아래와아래와아래와아래와 같은같은 CALL같은같은 CALL CALL CALL문이문이문이 눈에문이 눈에눈에 보인다눈에 보인다보인다보인다....
우선 우선 우선
우선 해당해당해당해당 함수가함수가함수가함수가 무슨무슨 일을무슨무슨 일을일을 하는지일을 하는지하는지하는지 확인해보자확인해보자확인해보자확인해보자
루프문이다 루프문이다 루프문이다
루프문이다. . . . 해당해당해당해당 DS:[ESI DS:[ESI DS:[ESI DS:[ESI]]]]부분을부분을 dump부분을부분을 dump dump dump해보니해보니해보니 아래와해보니 아래와아래와아래와 같다같다같다.... 같다
메모리에 메모리에 메모리에
메모리에 있는있는있는 asx있는 asx asx asx파일파일파일파일 내용을내용을 메인내용을내용을 메인메인 스레드의메인 스레드의스레드의 Stack스레드의 Stack Stack영역으로 Stack영역으로 복사하는영역으로영역으로 복사하는복사하는 것을복사하는 것을것을 볼것을 볼볼볼 수수 있다수수 있다있다있다.... 복사하는복사하는복사하는 내용은복사하는 내용은내용은내용은 asx
asx asx
asx파일파일 내용중파일파일 내용중내용중 ““““<ref href =내용중 <ref href =<ref href =”””” 태그<ref href = 태그 다음에태그태그 다음에다음에다음에 오는오는오는오는 실제실제 동영상실제실제 동영상동영상 파일의동영상 파일의파일의파일의 주소이다주소이다주소이다. 주소이다. 현재는. . 현재는현재는 쉘코드이다현재는 쉘코드이다쉘코드이다쉘코드이다....
IDA IDA IDA
IDA에서에서에서에서 분석을분석을분석을분석을 하면하면하면하면 wcscpy wcscpy wcscpy wcscpy라는라는 심볼명을라는라는 심볼명을심볼명을 가진심볼명을 가진가진가진 함수임을함수임을 알수함수임을함수임을 알수알수 있다알수 있다있다.... 있다
<IDA
<IDA <IDA
<IDA로로로로 해당해당해당해당 심볼심볼심볼심볼 확인확인확인확인, wcscpy>, wcscpy>, wcscpy> , wcscpy>
wcscpy wcscpy wcscpy
wcscpy는는는는 어떤어떤어떤어떤 함수일까함수일까함수일까함수일까? strcpy? strcpy? strcpy? strcpy의의 유니코드의의 유니코드유니코드유니코드 버전이라고버전이라고버전이라고 보면버전이라고 보면 된다고보면보면 된다고된다고된다고 한다한다한다한다.... 파일
파일 파일
파일 I/O I/O I/O나 I/O나나 문자열나 문자열문자열 처리시문자열 처리시처리시처리시 기본적으로기본적으로기본적으로 2Bytes기본적으로 2Bytes로 2Bytes 2Bytes로로로 처리를처리를처리를 해버리게처리를 해버리게 되서해버리게해버리게 되서되서되서 사용한다고사용한다고사용한다고사용한다고 한다한다한다한다.... 그런데
그런데 그런데
그런데 이이이이 함수는함수는함수는함수는 보안에보안에보안에 보안에 취약취약취약취약하다하다. 하다하다. . . 복사할복사할 사이즈를복사할복사할 사이즈를사이즈를 정해주는사이즈를 정해주는정해주는정해주는 파라미터가파라미터가파라미터가파라미터가 없으며없으며, 없으며없으며, , , wcscpy(dst, src)wcscpy(dst, src)wcscpy(dst, src)wcscpy(dst, src)중중중 중 src
src src
src가가가가 null null null null로로로로 종료를종료를 하지종료를종료를 하지하지하지 않으면않으면않으면 그대로않으면 그대로그대로그대로 복사가복사가복사가 되고복사가 되고 버퍼되고되고 버퍼버퍼버퍼가가가가 플로우가플로우가플로우가 되게플로우가 되게되게 된다되게 된다.... 즉된다된다 즉즉즉 ““““href=href=href=””””다음의href= 다음의다음의다음의 주소주소주소주소 를
를 를
를 length length length length체크를체크를체크를 하지체크를 하지 않고하지하지 않고않고않고 복사하기복사하기복사하기 때문에복사하기 때문에때문에때문에 우리의우리의 쉘코드가우리의우리의 쉘코드가쉘코드가쉘코드가 오버플로우오버플로우오버플로우 되면서오버플로우 되면서되면서 로딩되면서 로딩 될수로딩로딩 될수될수될수 있었던있었던있었던 거다있었던 거다거다거다.... 이
이 이
이 함수함수함수함수 대신대신대신대신 사용할수사용할수사용할수사용할수 있는있는있는있는 wcscpy_s(dst, dst_size, src)wcscpy_s(dst, dst_size, src) 함수wcscpy_s(dst, dst_size, src)wcscpy_s(dst, dst_size, src) 함수함수가함수가가가 있다고있다고있다고있다고 한다한다한다.... 한다 암튼
암튼 암튼
암튼 우리는우리는우리는우리는 양껏양껏양껏양껏 쉘코드를쉘코드를쉘코드를 스택에쉘코드를 스택에 넣을스택에스택에 넣을넣을넣을 수수수수 있게있게있게있게 됬다됬다됬다됬다.... 이제
이제 이제
이제 우리는우리는우리는 스택의우리는 스택의스택의스택의 쉘코드를쉘코드를쉘코드를쉘코드를 실행시켜실행시켜실행시켜실행시켜 줄줄 EIP줄줄 EIPEIP를EIP를를를 변조시키면변조시키면변조시키면변조시키면 된다된다된다된다....
계속 계속 계속
계속 분석해보면분석해보면분석해보면분석해보면 위위위위 wcscpy wcscpy wcscpy wcscpy를를를를 해해놓해해놓놓놓고고고고 EAX EAX EAX EAX에에에 SS:[EBP+10에 SS:[EBP+1099998888]]]]이 SS:[EBP+10 SS:[EBP+10 이이 가리키는이 가리키는가리키는 값가리키는 값값값을을을 EAX을 EAX에 EAX EAX에에 넣는다에 넣는다넣는다. 넣는다. 여. . 여여여기서는기서는기서는기서는 FFFFFFFF
FFFFFFFF FFFFFFFF
FFFFFFFF가가가 되가 되되겠되겠다겠겠다다다. . . . 이이 값이이 값값값을을을을 201,202,203,102,103,401,303, 201,202,203,102,103,401,303, 201,202,203,102,103,401,303,666601,311,312, 201,202,203,102,103,401,303, 01,311,312,01,311,312,999901,701,702,101,301,501,80101,311,312, 01,701,702,101,301,501,80101,701,702,101,301,501,80101,701,702,101,301,501,801 값과
값과 값과
값과 비교비교비교비교를를를 하고는를 하고는하고는하고는 아래아래아래아래 그림부분에그림부분에 가게그림부분에그림부분에 가게가게가게 된다된다된다된다.... 위위위 값위 값값을값을 잘을을 잘잘은잘은은은 모모모르겠모르겠르겠르겠으나으나 정상적인으나으나 정상적인정상적인 파일을정상적인 파일을파일을 올리면파일을 올리면 202올리면올리면 202 202 202가가가가 됨을
됨을 됨을
됨을 볼수볼수볼수볼수 있다있다있다있다. . . . 아
아 아
그럼 그럼 그럼
그럼 계속계속계속계속 분석해보자분석해보자분석해보자분석해보자. . . 위. 위 FFFFFFFF위위 FFFFFFFF FFFFFFFF값 FFFFFFFF값값값으로으로으로으로 어어어느어느것느느것것것 하나하나하나하나 일일일일치치치치가가 안되고는가가 안되고는안되고는 아래안되고는 아래아래아래 그림그림그림으로그림으로으로으로 넘어가게
넘어가게 넘어가게
넘어가게 된다된다된다. 된다. . . RET_UnivRET_UnivRET_UnivRET_Univ가가 기가가 기기기억날억날억날 것이다억날 것이다것이다. 것이다. . 기. 기억기기억억이억이이이 안나면안나면안나면안나면 위위위위 ““““2. analyze exploit2. analyze exploit2. analyze exploit2. analyze exploit””””를를를를 참참참참고고고 고
즉 즉 즉
즉 위위위 그림에위 그림에그림에 설명처럼그림에 설명처럼설명처럼설명처럼 RETN4 RETN4 RETN4 RETN4를를 함으로를를 함으로함으로써함으로써써써 RET_Univ RET_Univ RET_Univ의 RET_Univ의의 주소의 주소(0x004주소주소(0x004(0x00466664577)(0x004 4577)4577)가4577)가가가 EIP EIP EIP에 EIP에 저에에 저저장되고저장되고장되고장되고 실행실행실행실행 된다된다된다.... 된다 해당
해당 해당
해당 주소주소주소주소번번번지에는번지에는지에는지에는 JJJJMP ESPMP ESPMP ESPMP ESP opcode opcode opcode opcode가가가가 있다있다있다있다. . . .
그럼 그럼 그럼
그럼 ESP ESP ESP로 ESP로로로 점프하게점프하게점프하게 되고점프하게 되고되고되고 ESPESP에ESPESP에에에 있는있는있는 우리의있는 우리의우리의 N우리의 N N NOPOP코드를OPOP코드를 확인할수코드를코드를 확인할수확인할수확인할수 있다있다있다있다.... 짧짧짧짧은은 NOP 은은 NOP NOP NOP 슬슬슬레이드를슬레이드를레이드를레이드를 타시고타시고타시고타시고 바
바 바
4. summary
간단 간단 간단
간단하게하게 버퍼오버플로우에하게하게 버퍼오버플로우에버퍼오버플로우에 취약한버퍼오버플로우에 취약한취약한취약한 함수로함수로 생기는함수로함수로 생기는생기는생기는 홀홀홀홀이이 있었으며이이 있었으며있었으며 곰플레이어가있었으며 곰플레이어가곰플레이어가곰플레이어가 이런이런이런이런 함수를함수를 사용함으로함수를함수를 사용함으로사용함으로써사용함으로써써써 exploit
exploit exploit
exploit이이 생이이 생생겨생겨겨겨 난난난 것임난 것임.... 내것임것임 내내내 생생생생각엔각엔각엔각엔………
언 언 언
언제제제제봐봐봐도봐도 이런도도 이런이런 취약점을이런 취약점을취약점을취약점을 발견발견발견하신발견하신 분은하신하신 분은분은분은 참참참 대참 대대단대단한단단한한한 거거거거 같다같다같다같다.... 어
어 어
어떻떻떻떻게게게 이런게 이런 생이런이런 생생각생각각을각을을을 하지하지??????? 하지하지??????? ??????? ??????? 아니아니아니아니 어어어어떻떻게떻떻게게게 이이이이렇렇렇렇게게 짜게게 짜짜고짜고고고치치치치는는 고스는는 고스고스고스톱톱톱처럼톱처럼처럼 서로처럼 서로 상서로서로 상상상관관관관없을없을없을 듯한없을 듯한, 듯한듯한, , 서로, 서로서로서로 멀멀멀멀 리
리 리
리 떨떨어진떨떨어진어진어진 듯한듯한듯한 코드듯한 코드코드들코드들들들이이 이이이 이이이렇렇렇게렇게게 연관게 연관연관성있게연관성있게 실행되게성있게성있게 실행되게실행되게끔실행되게끔끔 하는건지끔 하는건지하는건지 참하는건지 참참참…………대…………대대대단단단단한한 거한한 거거 같다거 같다같다같다....
암튼 암튼 암튼
암튼 오오오오늘늘늘늘도도도 그냥도 그냥 고수분그냥그냥 고수분고수분들고수분들들 대들 대대단대단단단하하단하하단단단 거거거거 느끼느끼느끼느끼며며며 문서를며 문서를 마칠문서를문서를 마칠마칠마칠까까까 한다까 한다한다;;한다;;;;;; 작
작 작
작성한성한 문서성한성한 문서문서문서 내용은내용은내용은 제내용은 제제제 지식지식지식지식 위주로위주로 하위주로위주로 하하하여여여 틀린여 틀린틀린 부분이틀린 부분이부분이부분이 많많을많많을을 수을 수수수 있다는있다는있다는있다는 위위위위험험이험험이이이 있있있단있단 사실을단단 사실을사실을 명심하시고사실을 명심하시고명심하시고명심하시고 지적
지적 지적
지적 바란바란바란바란다다다. 다. . . 마마지마마지지지막막막막으로으로으로 패치으로 패치패치 후패치 후에후후에에에 코드가코드가코드가코드가 어어어떻어떻떻게떻게 변했는지게게 변했는지변했는지변했는지 한한한번한번번번 확인해보자확인해보자확인해보자확인해보자.... 감
감 감