2013-06-17 3 views
0

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? 내 검사 결과에 따르면 그렇지 않다고 생각하지만, 그렇게해야한다고 생각합니다.

답변

0

보십시오

printf("call : 0x%lx\n", regs.rip + (long) (int) (dest & (unsigned long) UINT_MAX); 

dest 64 비트 값이지만, 32 비트 부호화 여기 오프셋. 이런 종류의 코드에서는 16 진수 인쇄가 훨씬 더 편리합니다.

+0

실제로는 부호있는 오프셋입니다. –

+0

@IgorSkochinsky 그래, 나는 그것을 깨달았다. 나는 구현 정의 된 동작을 피하고 캐스트를 잊어 버리려고했습니다. 편집 됨. 감사 – Guillaume