2013-12-20 3 views
5

는이 코드로 크래시 덤프가 있습니다하위 명령으로 인해 잘못된 포인터가 읽힐 수 있습니다.

mov  r11,rsp 
push rdi 
sub  rsp,0A0h 
mov  qword ptr [rsp+30h],0FFFFFFFFFFFFFFFEh 

그것은 함수의 프롤로그입니다. 따라서 !analyze -vsub과 함께 INVALID_POINTER_READ라고 말합니다. AMD 명령어 세트는 인수가 메모리 포인터가 아니면 sub 명령어가 예외를 생성 할 수 없다고 말합니다.

또한 READ_ADDRESSffffffffffffffff이지만, 레지스터 창에서 나는 rsp12b3e0임을 알 수 있습니다. 그리고 이것은 64 비트 OS에서 32 비트 응용 프로그램입니다.

이 오류의 가능한 원인과 해결 방법에 대해 알고 싶습니다.

UPD :

방법은 마이크로 소프트 비주얼 스튜디오 9.0 \ VC \에서 std._Tree.insert (const를 VALUE_TYPE & _Val)이다는 \ xtree을 포함한다.

컴파일러는 Visual Studio 2008 설치의 cl.exe, 32 비트, 버전 15.00.30729.01입니다.

명령 행 :

/FD /EHsc /MD /GS- /Zc:wchar_t- /Yu"stdafx.h"/W3 /WX /nologo /c /Zi /TP /wd4250 /FI -Zm200 -MP -w34100 -w34189 

링커는 같은 소스 버전 9.00.30729.01에서입니다.

UPD : 64 비트 디버거가있는 32 비트 응용 프로그램 디버깅에 회의적인 시각을 가진 사용자를 위해 32 비트 버전의 디버거를 실행하고 동일한 결과를 얻었습니다. 그래서 나는 여전히 그것이 sub 지시라고 생각합니다.

UPD : 응용 프로그램32 비트 플랫폼 용으로 제작되었습니다. 그러나 프로세서운영 시스템64 비트입니다. 따라서 덤프에서 32 비트 값을 가진 64 비트 레지스터를 볼 수 있다는 것은 이상한 일이 아닙니다.

+1

DEP? 또는 디버거의 가짜 정보. –

+2

당신은 확실히 실패한'sub'입니까? RIP가 실패한 명령어 다음을 가르치고 싶지는 않습니다 ...? – cHao

+0

David, EXCEPTION_PARAMETER1은 0으로 DEP가 아닙니다. – cassandrad

답변

2

다른 문제가 있습니다. 전체 opcode 집합 내에 메모리 읽기 연산이 없습니다. 두 번의 쓰기 (푸시 및 mov) 만 있습니다. 귀하의 정렬 괜찮아요 및 즉시 qword 값을 배치 -2 확인해야 스택의 영역에서 이루어집니다.

OS 및 opcode의 약한 부분이이 작업과 관련이 없습니다. 나는 항상 64 비트 레지스터를 사용한다. 모든 것이 16 비트 일 때 32 비트를 사용하는 것과 같습니다.

다른 곳을보세요.