2012-05-28 3 views
1

내가 오버 플로우 착취 세 가지 단계가 필요합니다 이해 이용한다.힙 오버 플로우는

2. 전자 메일로 제어.

3. 임의 코드를 실행하도록 eip를 설정하십시오.

나는 힙 착취에 관한 ben hawkens 기사를 읽고 궁극적으로 내 코드를 가리 키도록 함수 포인터를 재정의하는 방법에 대한 몇 가지 전술을 이해했습니다. 즉

, 이해가 2 단계

내가 어떻게 프로세스 메모리 공간에 내 코드를 삽입 할 단계 1과 3

  1. 을 이해하지?

  2. 3 단계에서 함수 포인터를 으로 대체합니다. 셸 코드에 대한 포인터입니다. 어떻게 계산할 수 있습니까 \ 어떤 주소인지 알고 싶습니다. 주입 된 코드가 주입 되었습니까? .. (이 문제는 ESP "JMP을 사용하여 유래에서 를 해결)

답변

2

1 단계는 공격 코드의 취약점을 필요 일반이 취약성을 포함 :

  • 버퍼 오버 플로우 (공통 I의 C 코드 프로그램이 임의의 긴 문자열을 고정 버퍼로 읽는 경우 발생)
  • 비보안 데이터 평가 (SQL 및 스크립트 언어는 공통이지만 다른 언어에서도 발생할 수 있음)

3 단계에서는 대상 아키텍처에 대한 자세한 지식이 필요합니다.

+0

나는 알고 있습니다. 힙 오버 플로우의 경우에 셸 코드 주소를 찾기 위해 예를 들어 주시겠습니까? – Michael

+0

아니요, 저는 바이러스를 만드는 습관이 아니므로 신경 쓰지 않았습니다. –

+0

온라인으로 나열된 방법이 많이 있습니다. 을 예로들 수 있습니다. 때로는 전자 메일이가는 위치를 정확하게 제어 할 수 없기 때문에 많은 사람들이 메모리를 무작위로 전환 할 때 냅스터 썰매를 아래쪽으로 쳤을 것이라는 희망으로 많은 양의 메모리를 덮어 쓰는 "썰매"를 사용합니다. 익스플로잇. 때로 힙 공격 (오버플로뿐만 아니라)은 임의의 4 바이트를 쓸 수 있습니다. 스택 주소를 알고 있으면 반환 된 eip를 덮어 쓸 수 있습니다. 힙 공격은 버퍼 오버 플로우에 비해 익스플로잇과 관련이 있습니다. – Dan

2

힙 오버플로에서 시스템에 ASLR이 활성화되어 있지 않은 것으로 가정하면 오버플로에 사용하는 메모리 청크 주소 (버퍼라고도 함)를 알 수 있습니다.

하나의 옵션은 응용 프로그램 사용자로서 버퍼 내용을 제어 할 수있는 경우 버퍼가있는 곳에 쉘 코드를 배치하는 것입니다. 쉘 코드 바이트를 버퍼에 넣으면 해당 버퍼 주소로 건너 뛰기 만하면됩니다.

점프를 수행하는 한 가지 방법은 예를 들어 .dtors 항목을 덮어 쓰는 것입니다. 취약한 프로그램이 끝나면 버퍼에있는 쉘 코드가 실행됩니다. 복잡한 부분은 .dtors 덮어 쓰기입니다. 이를 위해서는 게시 된 힙 사용 기술을 사용해야합니다.

필수 조건은 ASLR이 비활성화되어 (취약한 프로그램을 실행하기 전에 버퍼의 주소를 알아야 함) 버퍼가있는 메모리 영역을 실행 가능해야한다는 것입니다.

더 많은 경우, 2 단계와 3 단계는 동일합니다. eip를 제어한다면 쉘 코드 (임의 코드)를 가리킬 논리가됩니다.

P.:... ASLR을 우회하는 것이 더 복잡합니다.

1
  1. 프로세스 공간에 코드를 어떻게 삽입합니까?

    이것은 매우 진술/질문입니다. 프로세스 공간에서 코드의 '악용 가능한'영역이 필요합니다. 예를 들어, Windows는 현재 가능한 경우 strncpy()에 대부분의 strcpy()를 다시 쓰고 있습니다. 나는 strcpy를를 사용하는 코드의 모든 영역이 성공적를 strncpy을 통해 변경 될 수 없습니다 때문에

    가능하면 말한다. 왜? 그렇기 때문에 아래의 차이점에서이 핵심의 @ ~;

    strcpy($buffer, $copied); 
    

    또는

    strncpy($buffer, $copied, sizeof($copied)); 
    

    이 실제 시나리오에서 구현하기 strncpy 그렇게 어려운 만드는 것입니다. 대부분의 strncpy 작업에는 '마법 번호'가 설치되어야합니다 (sizeof() 연산자는이 마법 번호를 만듭니다)

    코더의 코드 값은 char buffer[1024];과 같은 엄격한 준수를 사용하여 가르칩니다. 코딩 연습.

    비교에서 - buffer[]=""; 또는 buffer[1024]="";을 사용하는 것이 착취의 핵심입니다.

    int size = 1024; 
    
    char buffer[size]; 
    char copied[size]; 
    
    strncpy(buffer,copied, size); 
    

    이 오버 플로우를 중지하지만 악용 지역을 소개합니다 : 예를 들어 우리는 후자에이 코드를 변경하는 경우에는, 우리는 또 다른 ... 시스템에

    char * buffer; 
    char * copied; 
    
    strcpy(buffer, copied);//overflow this right here... 
    

    또는이 도입 악용 얻을 1024 블록의 코드/데이터로 예측 가능하고 구조화 된 크기로 인해 RAM에 저장됩니다.

    따라서 원래의 포스터는 프로그램의 주소 공간에서 strcpy를 찾으면 strcpy가있는 경우 프로그램을 악용 가능하게 만듭니다.

    strncpy 이상의 프로그래머가 strcpy를 선호하는 데는 여러 가지 이유가 있습니다. 매직 번호, 변수 입력/출력 데이터의 크기 ... 프로그래밍 스타일 ... 등 ... 내 코드에서 나 자신을 어떻게 찾을 수 있습니까

  2. (내 위치)이 예에 대한

    확인 다양한 해커의 책 ~

    하지만 시도해보십시오.

    label: 
    pop eax 
    pop eax 
    call pointer 
    
    jmp label 
    pointer: 
    mov esp, eax 
    jmp $ 
    

    이는 예입니다 작동하지 않는 내가 다음 모리스 웜을 작성하기위한 책임을지지 싶지 않아 사실로 인해! 그러나 괜찮은 프로그래머라면이 코드의 jist를 얻을 것이고 여기서 내가 말하는 것에 대해 즉시 알 것이다.

    앞으로 내 오버 플로우 기술이 효과가 있기를 바랍니다.

관련 문제