문제

어떻게 버퍼 오버플로 컴퓨터를 이용하는데 사용되었나요?

단순히 다음을 유발하여 임의의 코드를 실행할 수 있는 방법은 무엇입니까? 스택 또는 더미 넘치나요?

나는 프로그램 메모리의 일부가 덮어쓰여져서는 안 되는 부분을 이해하지만 이것이 어떻게 자신의 코드를 실행하게 하는지는 알 수 없습니다.또한, 3rd Party의 악성코드를 대상 프로세서 어셈블리 언어로 작성해야 하나요?

도움이 되었습니까?

해결책

이것은 주제에 대해 가장 널리 알려진 문서입니다. 재미와 이익을 위해 스택을 부수고 있습니다

그러나 '스택 오버플로'는 버퍼 오버플로와 관련이 없습니다. 스택 오버 플로우는 일반적으로 불량 코드의 오류 사례 일 뿐이며 충돌 (DOS) 외부의 어떤 것도 활용할 수 없습니다.

편집 : 힙 오버플로에 대해서도 물었습니다. 이것은 주제에 대한 좋은 문서입니다. http://www.w00w00.org/files/articles/heaptut.txt

다른 팁

스택에는 서브 루틴으로 뛰어들 때 데이터와 반환 주소가 모두 포함되어 있습니다. 반환 주소가있는 스택에 특정 주소를 넣으면 CPU가 특정 메모리 위치로 점프하도록 강요 할 수 있습니다. 그것은 버퍼 오버플로를위한 것입니다. 힙 오버 플로우는 약간 다르고 악용하기가 어렵습니다.

스택 오버 플로우는 스택 공간이 부족하다는 것을 나타냅니다 (특히 커널에서 일반적으로 더 제한적).

거리에 집 두 채가 있다고 상상해 보세요.하나는 친구의 집이고 하나는 세 집 아래에 있는 사악한 편집증 이웃의 집입니다.사악한 편집증 이웃은 들어오지도 떠나지도 않으며, 그의 집은 단단히 잠겨 있습니다.

이제 당신의 친구는 정말 믿음직스러운 친구입니다. 그는 당신이 그의 자리에 무엇이든 보관할 수 있도록 해줄 것입니다. 한쪽 벽부터 시작하여 상자를 하나씩 내려놓을 것입니다.사실 벽에 부딪혔는지도 확인하지 않고 상자를 하나씩 하나씩 내려놓고, 계속해서 공중으로 날아가다가 마침내 길에 있는 다른 두 집을 지나 집 안으로 들어갈 정도로 좋은 친구입니다. 사악한 편집증 이웃집.하지만 당신의 친구는 당신을 좋아하기 때문에 당신이 그렇게 하지 않을 것이라고 믿습니다(그리고 그는 약간 순진합니다).

따라서 당신은 당신의 선하고 신뢰하는 친구를 이용하여 사악한 편집증적인 이웃의 집에 무언가를 넣을 기회가 있습니다.


다음 용어를 바꾸면 버퍼 오버플로 공격에 대한 비유를 볼 수 있습니다.

  • "친구 집" --> "버퍼 오버플로를 확인하지 않는 프로그램의 일부"
  • "그의 사악한 편집증적인 이웃집" --> "안전하다고 여겨지는 프로그램의 또 다른 부분"
  • "상자" --> "버퍼 오버플로를 확인하지 않는 프로그램에 대한 인수/매개변수"

이것은 누군가가 메모리의 보안 영역이 어디에 있는지, 그리고 원하는 효과를 얻기 위해 보안 영역에 도달하게 될 문제의 프로그램에 대한 인수로 전달되어야 하는 것이 무엇인지 알아내는 경우에만 성공합니다.(데이터인지, 아니면 공격자의 코드를 실행시키는 코드인지)

서브 루틴을 호출 할 때 사실상 모든 현대 프로세서는 로컬 데이터 (스택)와 동일한 영역에서 리턴 주소를 푸시합니다. 변수의 상한 (특히 strcpy 함수)을 확인하지 않는 루틴의 경우 명령 주소 리디렉션 (버퍼 오버플로)이 발생할 수 있습니다.

void make(char *me)
{
    char sandwich[4]; // local data, this is in stack.  the buffer for data is too small
    strcpy(sandwich, me);
    puts(sandwich);

    // implicit "return;" the return instruction(RET on Intel) instructs the processor to implicitly pop an address from stack then resume execution on that address
}

void main()
{
    // calling a subroutine (CALL on Intel) implicitly instructs the processor to push the next instruction's address(getchar line) on stack before jumping to make.
    make("Love Not War"); 
    getchar();

    puts("This will not execute.  The address to next instruction(getchar) gets overwritten with Not War");

}

"또한 타사의 악의적 코드를 대상 프로세서 어셈블리 언어로 작성해야합니까?"

스택 오버 플로우는 일반적으로 실행되는 프로그램에서 발생할 수 있습니다. 예제는 종단 조건이 간과 된 재귀 루틴 (자체 호출)입니다. 스택 영역은 스택의 수많은 로컬 변수와 반환 주소로 채워집니다.

정상적인 접근법은 메모리 어딘가에 악의적 인 코드가 있다는 것입니다. 그런 다음 버퍼 오버플로를 만듭니다. 여기서 마법은 오버플로를 만드는 것이 아니라 이미 언급했듯이 프로그램 메모리의 특정 부분이 덮어 쓰여집니다. 스택에는 변수뿐만 아니라 함수를 반환 주소라고 할 때도 변수가 포함되어 있으므로 악성 코드의 주소 로이 제품을 덮어 쓰려고합니다. 버퍼 오버 플로우가있는 함수가 발신자로 돌아 오면 함수는 원래 발신자로 돌아 가지 않고 악의적 인 서브 루틴으로 돌아갑니다. 현재 실행 된 코드가 호출 코드의 권한을 활용하기 때문에, 하나는이 오버 플로우를 코드에서 찾거나 만들려고 시도합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top