2009-10-21 2 views
14

저는 잠시 동안 Windows XP Pro에서 64 비트 C 및 C++ 프로젝트 용 Visual Studio 2005를 사용하고 있습니다. 디버거에서 수시로 사용해온 인기있는 트릭 중 하나는 프로그램의 이전 디버깅 실행 (숫자 0x00000000FFAB8938)에서 수치 포인터 값을 기억하고 적절한 유형 변환 (예 : ((MyObject *) 0x00000000FFAB8938)->data_field)으로 윈도우를 추가하는 것이 었습니다. 다음 디버깅 실행 중에 객체가 차지하는 메모리를 관찰하십시오. 많은 경우 코드가 변경되지 않는 한 할당 된 메모리 레이아웃이 변경되지 않을 것으로 예상하는 것이 합리적이므로이 작업은 상당히 편리하고 유용한 작업입니다. 즉, 작동합니다.Windows Vista에서의 포인터 안정성

그러나 비교적 최근에 저는 Windows Vista (Home Premium) 64 비트가 탑재 된 랩톱에서 동일한 버전의 Visual Studio를 사용하기 시작했습니다. 이상하게도이 설정에서이 트릭을 사용하는 것이 훨씬 더 어렵습니다. 실제 메모리 주소는 아무런 이유없이 실행될 때마다, 즉 프로그램의 코드가 전혀 변경되지 않은 경우에도 자주 변경되는 것처럼 보입니다. 실제 주소는 완전히 무작위로 변하지 않는 것으로 보입니다. 고정 된 값의 고정 된 값 세트에서 하나의 값을 선택하지만,이 경우에는이 유형의 메모리를 보는 것이 훨씬 어렵습니다.

누구든지 Windows Vista에서이 동작이 발생하는 이유를 알고 있습니까? 무엇이 메모리 레이아웃의 변화를 일으키는가? 다른 [시스템] 프로세스의 프로세스 주소 공간에 외부 침입이 있습니까? 또는 Vista에서 Heap API 구현의 몇 가지 특징/기능입니까? 어떤 일이 일어나지 않도록 방지 할 방법이 있습니까?

+1

Linux에서는 버퍼 오버 플로우 공격을 피하는 데 더 긴 시간이 소요됩니다. 어쩌면 그것은 MS에 의해서 마침내 구현 되었습니까? – jdehaan

+0

글쎄, 나는 이것에 대해서 알고 있지만 AFAIK는 컴퓨터를 재부팅 할 때만 작동한다. 좀 더 정확히 말하자면 MS는 각 부팅시에 무작위 화하기 위해 버전을 구현했다고 들었습니다 (Linux에서 어떻게 작동하는지 모릅니다). 따라서 Vista에서 관찰 한 동작은 관련성이없는 것처럼 보입니다. – AnT

+0

이것은 뭔가 일지 모르지만. 64 비트 응용 프로그램을 디버깅 할 수있는 32 비트 응용 프로그램 인 VS 2005를 실행하고 있습니다. AFAIK, MS의 원격 디버깅 메커니즘을 통해 작동합니다. VS 2005에서 64 비트 응용 프로그램을 시작할 때마다 Vista가 본질적으로 새로운 64 비트 환경을 "부팅"할 수 있습니까 (따라서 무작위 화가 일어날 수 있습니다)? – AnT

답변

30

Windows Vista는 address space layout randomization, heap randomization, and stack randomization을 구현합니다. 이는 각 코드 및 데이터가 메모리에있는 위치에 대한 지식에 의존하는 버퍼 오버플로 공격을 막으려는 보안 메커니즘입니다.

MoveImages 레지스트리 값을 설정하여 ASLR을 해제 할 수 있습니다. 힙 무작위 화를 비활성화하는 방법을 찾지 못했지만 일부 Microsoft 사람은 _crtheap에 상대적인 주소 계산을 권장합니다. 힙이 돌아 다니더라도 상대 주소는 안정적으로 유지 될 수 있습니다.

+0

인용 해 주셔서 감사합니다. :) 그것은 추측하는 것이 한 가지이지만, 그 증거를보기에 좋다. – BobbyShaftoe