2010-07-07 4 views
2

내가 리눅스 64 비트 컴퓨터에 호출 스택의 명령 포인터 (RIP를) 검색에 대한 몇 가지 도움이 필요합니다. ptrace를 사용하여 스택을 탐색하고 모든 프레임/기본 포인터 (RBP) 값을 검색 할 수 있습니다. 하지만 IP 값을 원할 때 RIP와 RBP 간의 산술 및 개념 관계는 무엇입니까? RIP 값이 (RBP + 8) 위치에 저장되어 있다고 가정하고 ptrace PEEKDATA을 사용하여 읽을 수 있습니다. 내 가정이 맞습니까?관계 리눅스

+0

호출 스택의 레이아웃은 호출 규칙 및 프로세서 아키텍처에 따라 다릅니다. http://en.wikipedia.org/wiki/Call_stack 및 http://en.wikipedia.org/wiki/Calling_convention를 참조하십시오. 어쩌면 ptrace가 이것을 추상화할지 모르지만 실제로는 알지 못합니다. –

답변

2

스택에 푸시 된 모든 반환 주소는 현재 실행중인 함수의 %rip이 아니라 현재 실행중인 함수가 반환 된 후에 시작하여 %rip으로 시작됩니다.

  • 가 이상적 플랫폼이 PTRACE_GETREGS 또는 PTRACE_GETREGSET 인수를 지원합니다 : 당신은 현재 %rip에 GDB가하는 같은 방법으로 손을 얻을 수 있어야합니다. 맨 페이지와 헤더 파일은 여기서 나머지를 얻을 수 있습니다.
  • 실패하면 PTRACE_PEEKUSER 인수를 적절한 오프셋과 함께 사용하여 사용자 영역에서 레지스터를 가져와야합니다.

GDB 소스 트리에서 gdb/amd64-linux-nat.c의 고독한 세부 사항을 볼 수 있습니다.