2011-10-14 2 views
1

연구 프로젝트에 문제가 있습니다. 내가 뭘 하려는지 ptrace를 사용하여 대상 프로세스의 실행을 감시하는 것입니다. ptrace의 도움으로 타겟 코드 세그먼트 (중단 점과 유사)에 mprotect syscall을 주입하고 스택 보호를 PROT_NONE으로 설정합니다. 그런 다음 원래 지침을 복원하고 대상이 계속되도록합니다. 내가 잘못된 permisson segfault 얻을 때 다시 스택을 보호하지 않으려면 syscall 주입하고 나중에 segfault 일으키는 명령을 실행하고 스택을 다시 보호하십시오. Ptrace mprotect 디버깅 문제

(이것은 참으로 간단한 프로그램을 작동 않습니다.)

내 문제는 지금, 그 대상 (꽤) 무작위 라이브러리 함수 호출 (내가 동적 또는 정적 링크를 사용하는지 여부에 상관없이)에 충돌이 설정에. 충돌하는 것은 어떤 이유로 든 매핑되지 않은 메모리에 액세스하려고 시도하거나 그냥 __lll_lock_wait_private (malloc 호출 다음) 함수에 계속 매달려 있음을 의미합니다.

다시 강조하자면 충돌이 항상 발생하지는 않으며 항상 동일한 위치에서 발생하지는 않습니다.

동기화 문제처럼 들릴지 모르겠지만 내가 말할 수있는 한 (의미는 내가/proc/pid/tasks /를 보았다는 의미입니다) 실행중인 스레드는 하나뿐입니다.

그래서이 이유가 무엇인지 실마리가 있습니까? 잘 모르겠다해도 제안 사항을 알려주십시오. 여기에 아이디어가 없습니다.

+0

왜 실제 중단 점을 사용하지 않습니까? 예를 들어 http://mainisusuallyafunction.blogspot.com/2011/01/implementing-breakpoints-on-x86-linux.html을 참조하십시오. – ydroneaud

+0

고맙지 만 메모리 중단 점이 많이 필요합니다. (나는 정상적인 것들도 사용하고있다.) – salbei

+0

기록을 위해이 기사 시리즈는 http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1/ http :// /eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints/ http://eli.thegreenplace.net/2011/02/07/how-debuggers-work-part-3 -debugging-information/특히 1 바이트로 인코딩 된 트랩 명령어가 디버그 된 프로그램을 손상시키지 않아야한다고 설명하는 부분 (적어도 x86에서는) – ydroneaud

답변

1

주소 공간의 랜덤 화로 비 결정 성을 만들 수도 있습니다. 문제를 좀 더 결정적으로 만들려면이 기능을 비활성화하십시오.

편집 :

ASR을 해제하는 것은 어쩌면 밑에 누워있는 문제가있을 수 있습니다 다음 문제를 '해결'감안할 때 :

  1. 어딘가에이 유효 또는 visaversa해야 할 때 0이 유효하지 않습니다 생각. (내가 가진 것).
  2. 다른 실행에 대해 한 실행의 주소를 사용합니까?
+0

덕분에 오류가 사라지고 실제로 마침내 갈 수 있습니다. 계획:). 하지만 여전히 켜져있는 aslr이 작동하지 않는 이유를 알고 싶습니다. – salbei

+0

@salbei 원인에 대한 아이디어를 추가했습니다. –