2012-03-16 3 views
0

리눅스 커널 출력을 살펴보면, EIP와 다른 코드 주소는 0xC01 ----- 범위의 값을가집니다. 내 System.map 및 objdump -S vmlinux 출력에서 ​​모든 코드 주소는 적어도 0xC1 ------ 이상입니다. 내 vmlinux에 포함 된 디버그 기호 (CONFIG_DEBUG_INFO)가 있습니다.리눅스 커널 텍스트 심볼

나는 직렬 연결 (KGDB)를 통해 디버깅, 그리고 다시 나는 내가 System.map 및 objdump 출력이 무엇인지에 $ EIP를 조정할 수 없습니다 같은 문제가, gdb ./vmlinux와 GDB를로드 할 때. 내가 GDB에서 where을 실행할 때, 나는 스택에 뒤죽박죽 엉망를 얻을 :

#0 0xC01----- in ??() 
#1 0xC01----- in ??() 
#2 0xC01----- in ??() 
... 

사람이/이러한 문제를 해결하는 방법에 대한 제안을 할 수 있습니까? 내 주요 관심사는 OOPS의 eip 값을 System.map 또는 objdump -S vmlinux에 실제로 매핑하는 방법입니다. OOPS가 함수 이름과 객체 코드에 오프셋을 주겠지 만 앞서 언급 한 문제와 gdb가 스택 백 트레이스를 올바르게 표시 할 수없는 이유에 대해 더 우려하고 있습니다.

답변

0

OOPS는 사용자가 기능이 아닌 장소로 뛰어 들었기 때문에 나타납니다.
이렇게하면 쉽게 충돌이 발생하고 디버거가 주소를 기호로 해석하지 못하게됩니다.

이 EIP 주변을 분해하여 확인할 수 있습니다. 내가 맞다면 기계어 코드로 이해가되지 않을 것입니다.

일반적으로 다음과 같은 두 가지 원인이 있습니다.
1. 손상된 함수 포인터를 사용하는 함수 호출. 이 경우 마지막 스택 프레임 앞에 호출자가 표시되어야합니다. 하지만이 프레임이 없으므로 다른 이유 일 수 있습니다. 2. 스택 오버런 - 반송 주소가 손상되어 잘못된 위치로 돌아 왔습니다. 그렇다면 ESP가 가리키는 데이터는 EIP에 주소를 포함해야합니다. 가장 중요한 정보 소스가 누락되어 스택 오버런 디버깅이 어렵습니다. "원시"형식 (x/xa addr)으로 스택을 인쇄하여 이해할 수 있습니다.