ptrace 함수를 사용하여 호출을 감지 할 수있는 프로그램을 작성하려고합니다. PTRACE_SINGLESTEP 사용 지침에 따라 프로그램 지침을 실행할 수 있습니다. OP_CODE 0xe8이 레지스터 RIP에 의해 지정되면 PTRACE_PEEKTEXT를 사용하여 RIP가 가리키는 주소 다음 4 바이트를 가져옵니다. 그러면 인터넷에서 찾은 설명서에 따르면 4 바이트 coutains는 점프 할 위치를 나타내는 오프셋입니다. PTRACE_PEEKTEXT가 이상한 값을 반환하고있는 것처럼 보입니다. 오프셋이 너무 큽니다. 아래 여기에 내 코드 : 여기ptrace로 통화 오프셋 감지
instr_num = ptrace(PTRACE_PEEKTEXT, this->pid, regs.rip, 0);
dest = ptrace(PTRACE_PEEKTEXT, this->pid, regs.rip + 1, 0);
if (instr_num == 0xe8)
{
printf("call : %ld\n", regs.rip + dest);
}
그리고 출력입니다 :
call : -2853719444197214464
call : -2853719444197214464
call : -2853719444197214464
그리고 이것은 objdump를 -D 출력, 당신은에서 통화 사이의 오프셋의 15 바이트가 볼 수 메인 함수 FUNC의 시작 : 내가 전화를 발견 직후, 나는 한번의 ptrace (PTRACE_SINGLESTEP)를 할 경우
00000000004004c4 <func>:
4004c4: 55 push %rbp
4004c5: 48 89 e5 mov %rsp,%rbp
4004c8: 5d pop %rbp
4004c9: c3 retq
00000000004004ca <main>:
4004ca: 55 push %rbp
4004cb: 48 89 e5 mov %rsp,%rbp
4004ce: b8 00 00 00 00 mov $0x0,%eax
4004d3: e8 ec ff ff ff callq 4004c4 <func>
4004d8: 5d pop %rbp
4004d9: c3 retq
, 내 RIP 난 그냥 t 뛰어 함수의 ADRESS 포함됩니다 o? 내 검사 결과에 따르면 그렇지 않다고 생각하지만, 그렇게해야한다고 생각합니다.
실제로는 부호있는 오프셋입니다. –
@IgorSkochinsky 그래, 나는 그것을 깨달았다. 나는 구현 정의 된 동작을 피하고 캐스트를 잊어 버리려고했습니다. 편집 됨. 감사 – Guillaume