2009-11-15 5 views
8

C로 코드 삽입 아이디어에 혼란스러워합니다. 누군가가 설명하고 어떻게 수행했는지 보여 주면 감사하겠습니다.C에서 코드 삽입 이해 및 수행

C에서 길이가 1024 인 소켓의 내용에 쓰여지는 크기 512의 Char 배열이 있고 그 char 배열에는 현재 일종의 코드가 있지만 쓰여진 것의 절반 만 포함한다고 말할 수 있습니다.

버퍼에서 실행되는 악성 코드가 어떻게 오버플로 되는가? 프로세스 구조 (스택, 힙, 데이터, 텍스트)에서 혼란 스럽습니다.

+3

올바른 답변 옆에있는 확인란을 클릭하여 이전 질문 중 일부에 대한 답변을 수락 할 수 있습니다. –

+0

나는 그 기능에 대해서 알지 못했다. – Recursion

답변

8

일반적인 트릭은 프로그램의 코드와 변수가 메모리에 레이아웃되는 방식과 관련이 있습니다. 예를 들어, 함수가 호출되면 프로그램 (컴파일러에 의해 삽입 된 코드)은 반환 할 명령어의 주소를 저장해야합니다. 이 32 비트 워드 그냥 스택의 시작 이전 인 경우 그래서, 사람은 할 수 :

void foo() 
{ 
    int array[5]; 
    int var = 0; 
    int var2 = 0; 

    // read in user input 
    printf("Enter index and value to write:"); 
    scanf("%i", var); 
    scanf("%i", var2); 

    // malicious user might set var to -1 and var2 to an address to execute 
    // if say the 32-bit value before the stack variables is the instruction to 
    // return to 
    array[var] = var2 

    // return now goes to malicious code 
} 

(. 그래서 당신의 일이 그런 일이 가능하지 않도록 코드를 구성하는 것입니다 :))

함수 호출을 구현하는 방법, 할당 된 스택 변수, 전달 된 값 및 반환 된 반환 값에 대한 규칙을 calling convention이라고합니다. 첨부 된 기사를 읽고 C 관례 회의를 잘 이해하기 바란다.

0

과 같을 수 있습니다 각 서브 루틴의 일반적인 스택 :

  • 매개 변수
  • 반환 주소 (이 루틴을 호출 한 코드의 주소) (이 서브 루틴에 매개 변수로 전달 된 값)
  • 저장된 레지스터 값
  • 로컬 변수

서브 루틴 로컬 수 변수가 있으면 e와 어떻게 든 로컬 변수의 끝을 지나면 리턴 주소와 같은 값 (스택에있는 값)을 덮어 씁니다. 즉, 서브 루틴이 "리턴 할 때 서브 루틴의 끝에서 실행될 코드의 주소 ".

2

스택에 버퍼를 할당하고 오버플로하는 경우 스택에 버퍼를 씁니다. 스택에는 버퍼를 할당 한 함수에 대한 리턴 포인터가 들어 있습니다. 따라서 스택의 버퍼를 오버플로하면 반환 포인터를 임의로 설정할 수 있습니다. 이에 따라 실행 스레드를 제어 할 수 있습니다.

코드를 실제로 주입하는 방법은 달라집니다. 스택 또는 페이지를 포함하는 페이지는 종종 코드 실행을 허용하지 않도록 설정됩니다. 역사적으로 작은 악의적 인 프로그램을 스택 자체에 저장하는 것이 가능했을 것입니다. Return oriented programmingreturn-to-libc 공격의 새로운 변종이며, 둘 다 NX 비트에서 작동합니다.