src 및 length 매개 변수를 제어 할 때 다음 조건에서 eip를 덮어 쓸 수 있습니까?memcpy 오버플로
방어 적이기 (플로트 * 이명 령, 플로트 *의 SRC, INT 길이) 나는 EIP (?)를 덮어 쓸 수 있어야하지만 의미있는 무언가를 덮어 쓸 수 있습니다 생각
?
** 죄송합니다. EIP를 덮어 쓰면 함수가 반환 된 후 EIP 레지스터에서 사용되는 리턴 포인터를 덮어 쓰면서 프로그램 실행을 전송합니다.
src 및 length 매개 변수를 제어 할 때 다음 조건에서 eip를 덮어 쓸 수 있습니까?memcpy 오버플로
방어 적이기 (플로트 * 이명 령, 플로트 *의 SRC, INT 길이) 나는 EIP (?)를 덮어 쓸 수 있어야하지만 의미있는 무언가를 덮어 쓸 수 있습니다 생각
?
** 죄송합니다. EIP를 덮어 쓰면 함수가 반환 된 후 EIP 레지스터에서 사용되는 리턴 포인터를 덮어 쓰면서 프로그램 실행을 전송합니다.
경우 memcpy
의 유효한 구현과 유사). 이는 x86의 레지스터가 메모리 매핑되지 않기 때문입니다. memcpy가 호출 될 때 스택에 푸시 된 리턴 값을 겹쳐 써서 간접적으로 수행 할 수 있습니다. 그런 다음 memcpy가 반환하면이 나쁜 값을 eip
에 넣고 누가 어디에서 왔는지 계속해서 실행하려고합니다.
의미있는 것으로 덮어 쓰는 한, 이는 의미있는 의미에 따라 다릅니다. "OS의 관점에서 볼 때 프로그램을 중단시키지 않는 것"을 의미한다면 "예"입니다.당신이 완전히 임의의 데이터로 덮어 쓴다고 가정한다면 통계적으로 많은 페이지가 프로그램에 매핑되어 실행 가능한 페이지와 메모리 페이지가 가능하고 실행 파일로 이동할 확률을 계산할 수 있습니다 페이지. 그런 다음 충돌이 발생하지 않고 매우 오래 실행할 수있는 확률을 계산하는 데 더 힘든 시간이 있습니다 (실제로는 의 기본 형식입니다)문제).
eip는 레지스터이므로 덮어 쓸 수 없습니다. 스택의 값만 덮어 쓸 수 있습니다. 버퍼 오버플로 공격은 함수의 반환 값을 덮어 쓰므로 메모리의 어딘가에 배치 한 코드로 해석 할 수있는 데이터에 실행을 전달합니다.
귀하의 설명에 대한 응답으로 :
예. 함수가 호출되면 반환 포인터가 스택에 푸시되므로이 메모리 위치에 쓸 수 있습니다. 변수에 대한 할당 (x86 아키텍처 및 기본 호출 규칙을 가정) 바로 위에 있습니다. 처리 된 어셈블리 언어 명령어에 해당하는 바이너리 데이터를로드해야하는 바로 다음 메모리 위치를 가리키는 값을 여기에 쓸 수 있습니다. 앞서 설명한대로 스택을 삭제하고 주입 된 코드를 실행 한 후에도 프로그램이 계속 실행될 수 있습니다. 그렇게하기 위해서는 반환 주소를 스택의 다른 곳에 저장하고 올바른 위치에 복사 한 쉘 코드를 작성한 다음 리턴을 실행해야합니다.
또한 dest 매개 변수를 제어 할 수 있다고 가정합니다. 원하는 위치에 데이터를 배치 할 수 없다면 아무 것도 쓸모가 없습니다.
"eip 덮어 쓰기"로 어떤 점이 좋습니까?
EIP는 메모리가 아니라 레지스터입니다. 덮어 쓰지 않습니다.
memcpy가 EIP가 가리키는 메모리에서 명령 스트림을 덮어 쓸 수 있습니다. 그러나 코드 페이지는 일반적으로 데이터/스택/힙 페이지에 너무 가깝지 않으며 종종 읽기 전용이기도합니다.
더 일반적인 것은 힙이나 스택의 데이터를 덮어 씁니다. 이후 명령은 EIP에로드 할 주소로 사용합니다. 예를 들어 함수 포인터를 덮어 쓰고 콜백으로 사용하거나 반환 주소를 덮어 쓰고 점프합니다.
는 (귀하의 예제에서는src
및
length
가
dest
에 대해 무엇을 제어하지만 것을 말한?) 당신은 무엇이든이있는 경우
eip
에 의해 당신이 (다음, 아니, 직접 86의 확장 명령 포인터를 의미
명확하지 않은 것에 대해 사과드립니다. EIP를 덮어 쓰면 함수가 반환 된 후 EIP 레지스터에서 사용하게 될 리턴 포인터를 덮어 쓰고 프로그램 실행을 전송합니다. – User10001
나는 그것을 생각하지 않는다. eip는 CPU 위치 레지스터가 아니라 RAM 위치이며, 그것을 변경하는 유일한 방법은 어셈블리의 직접 점프 (via)를 통한 것이다. – BlackBear
흥미로운 답변과 함께 다음 질문을 참조하십시오 : http://stackoverflow.com/questions/460519/how-are-buffer-overflows-used-to-exploit-computers – anatolyg