2012-03-20 7 views
1

나는 악용 사례를 작성하고 최근에 shellcode을 작성했으며 많은 사람들이 guides/books 중 많은 부분에서 스택이 시작되는 위치를 추측 할 수 있다는 것을 알게되었습니다. 그러면 작은 작업으로 우리 쉘 코드가 시작되는 스택의 주소를 추측 할 수 있습니다.스택이 반복적으로 사용될 수있을 정도로 예측 가능한 주소가 시작되지만 예측할 수없는 것으로 보이는 이유는 무엇입니까?

  • 왜 스택 시작 주소가 예측 가능합니까? 메모리의 임의의 주소에서 스택이 시작되지 않아야합니까?
  • 스택의 주소 시작이 가상 주소 공간의 일부 고정 오프셋 인 경우 시스템마다 컴퓨터가 다른 이유는 무엇입니까?
  • 서로 다른 플랫폼 간의 오류 마진과 스택 시작 주소는 어떻게됩니까?
관련

: 내 테스트 Address Space Layout Randomization (ASLR)를 들어 "the stack begins with the same address for every program", Address woes from Hacking: The Art of Exploitation, Why does the stack address grow towards decreasing memory addresses?

편집가 꺼집니다.

답변

1

내 생각에 스택의 시작 주소를 예측 가능한 것으로 결정하는 것은 스택 맨을 수정할 수있는 것만 큼 중요하지 않습니다. 메서드가 호출 될 때 메서드가 반환 될 때 코드가 다시 실행될 위치를 가리키는 프로그램 카운터를 포함하여 다양한 레지스터가 스택에 저장됩니다. 또한 스택 공간은 메서드의 로컬 변수를 저장하기 위해 예약되어 있습니다. (어쨌든 그들은 어딘가에 저장해야합니다!) 어떤 경우에는 이러한 변수를 사용하여 스택의 맨 위에 겹쳐 쓰면 코드가 실행을 다시 시작하는 위치를 변경할 수 있습니다 (예 :). 일부 디버거를 사용하여 메모리를 분해하고 검사하는 것은 일반적으로 변수가 프로그램 카운터와 관련하여 스택에서 끝나는 위치를 결정하기에 충분합니다. 그런 다음 메서드가 반환 될 때 스택의 반환 위치를 덮어 쓰면 다른 곳으로 돌아 가게하는 "간단한"문제입니다.

두 번째 두 가지 사항에 대한 대답이 아니므로 처음에는 일종의 답변이라고 생각하지만 시작일뿐입니다.