2012-02-19 2 views
-1

스택에서 코드를 실행하여 버퍼 오버플로를 수행해야한다는 지시가 있습니다. 나는 그렇게하려고 노력해 왔지만 스택의 "ret"위치를 코드가 상주 할 스택 위치로 바꿀 때마다 seg 오류가 발생합니다. "ret"위치를 실제 .o 파일 (실제 어셈블리 코드와 같은)에있는 주소로 바꾼다면 정상적으로 작동합니다. 스택의 위치로 돌아갈 수 없습니까? 스택 주소로 돌아갈 수 없다면 자신의 어셈블리 코드로 버퍼 오버 플로우를 수행하는 방법이 혼란 스럽습니다 ... (btw, IA32 little endian 컴퓨터를 사용하고 있습니다).버퍼 오버플로 공격 - 스택의 주소로 돌아 가기?

내 단계 :

  1. 넘침
  2. 은 위의 "RET"스폿 덮어 (거기에 저장된 실제 값)이 % EBP 위치를 덮어 쓰기 (모든 FF 넣어) 32 문자 버퍼 어셈블리 파일의 주소가 아닌 스택에 주소가 있습니다.
  3. 내 어셈블리 바이트 코드를 임 플 래팅합니다. (시작 부분에 nop 명령을 추가하여 4 바이트의 배수로 이루어 졌는지 확인하십시오.)

를 실행하고이

답변

4

스택 페이지가 실행으로 표시되어 있는지 확인 독방 감금 오류에 이르게; 최신 운영 체제는 일반적으로 스택을 실행 불가능으로 설정하므로 프로그램 카운터를 설정할 때 바로 즉시 분리됩니다.

+0

, 우리는 스택이 실행으로 표시되어 있다고 가정합니다 (그렇지 않으면 그들은 우리에게 같은 과제를주지 못할 것이다 이). 다른 아이디어? 고맙습니다. – de1337ed

1

이것은 플랫폼에 따라 여러 가지가 있습니다. 모든 메모리가 실행 가능한 것은 아니며 최신 시스템에서는 일반적으로 쓰기 가능한 메모리와 실행 가능한 메모리 사이에 배타적 인 메모리가 있습니다. linux를 사용하는 경우 mprotect을 추가로 호출하여 스택을 빌드 할 수 있으므로 스택을 실행 가능하도록 변경합니다. 이것은 더 복잡하고 건설 된 탑재 물을 필요로 할 것이지만 가능하다.

다른 옵션은 반환 주소 다음에 인수에 여전히 문제가 있다는 것입니다. 즉, 스택을 손상시키지 않았으므로 다른 함수를 호출 할 때 "운이 좋았을"수 있습니다. 코드. 더 읽기

:

  1. NX bit
  2. 나는이 과제에 대한 생각 mprotect