Restaurante La Strada

ptrace 예제

Posted on

이 수동 페이지에서 추적자가 추적자에서 ptrace 명령을 받아들일 준비가 된 중지 된 상태를 ptrace-stop이라고 합니다. Ptrace-stop은 신호 전달 정지, 그룹 정지, 시스콜 스톱 등으로 더 세분화될 수 있습니다. 이러한 중지된 상태는 아래에 자세히 설명되어 있습니다. ptrace는 자식의 코드를 통해 단일 단계에 대한 기능을 제공합니다. ptrace(PTRACE_SINGLESTEP,..)에 대한 호출은 커널에게 각 명령에서 자식을 중지하고 부모가 제어하도록 지시합니다. 다음 예제에서는 시스템 호출이 실행될 때 실행되는 명령을 읽는 방법을 보여 주며 있습니다. 나는 libc에 의해 만들어진 호출을 귀찮게하는 대신 무슨 일이 일어나고 있는지 이해하기 위해 작은 더미 실행 을 만들었습니다. 이 코드는 PTRACE_GETREGS를 사용하여 ptrace에 대한 호출을 제외하고 이전 예제와 유사합니다. 여기서는 에 정의된 user_regs_struct를 사용하여 레지스터 값을 읽었습니다. 다음 단계는 시스템 호출 정보를 수집하는 것입니다. 여기서 아키텍처를 특정하게 됩니다.

x86-64에서는 시스템 호출 번호가 rax로 전달되고 인수(최대 6개)는 rdi, rsi, rdx, r10, r8 및 r9로 전달됩니다. 레지스터를 읽는 것은 또 다른 Ptrace 호출이지만 추적상태가 변경되지 않기 때문에 기다릴 필요가 없습니다(2). 이 문서에 대 한 x86-64에 리눅스의 Ptrace에 초점을 거 야, 그리고 몇 가지 리눅스 특정 확장을 활용 거 야. 이 기사의 경우 오류 검사를 생략하지만 전체 소스 코드 목록에는 오류가 표시됩니다. 이제 는 몇 가지 재미를위한 시간이다. 다음 예제에서는 쓰기 시스템 호출에 전달 된 문자열을 반대로 합니다: 이 문서와 파트 II의 모든 예제 코드(다음 달 호에 인쇄될 예정)는 Linux 저널 FTP 사이트 [ftp.linuxjournal.com/pub/lj/listings/issue103/6011.tgz]에서 타르 아카이브로 사용할 수 있습니다. Ptrace를 사용하여 OpenBSD의 서약(2)과 같은 것을 구현하려고 한다고 가정해 보겠습니다.이 경우 프로세스는 제한된 시스템 호출 집합만 사용하도록 약속합니다. 아이디어는 많은 프로그램이 일반적으로 많은 시스템 액세스 (파일 열기, 바인딩 소켓 등)가 필요한 초기화 단계가 있다는 것입니다.