2011-09-28 2 views
4

정적 상수 배열 구조를 변경하려는 프로그램으로 인해 Linux 응용 프로그램에서 seg 오류를 디버깅했습니다 (데이터가 ELF의 읽기 전용 섹션에 있었고 이후에 제공된 페이지에로드 됨). 읽기 전용 권한).gdb가 일시적으로 페이지에 쓰기 권한을 부여합니까?

GDB에서 잘못된 저장소를 작성한 어셈블러 줄에 중단 점을 넣었습니다. 중단 점이 발생하면 GDB를 사용하여 수동으로 동일한 쓰기 작업을 수행했습니다. GDB는 아무런 불만없이이 작업을 수행했으며, 가치를 다시 읽음으로써 그것이 실제로 작성되었다는 것을 증명했습니다. 나는/proc/thepid/maps를 보았고 그 특정 페이지는 여전히 "쓰기 불가능"으로 표시되었다.

내 질문은 : GDB는 임시로 읽기 전용 페이지에 쓰기 권한을 설정하고 쓰기를 수행 한 다음 권한을 재설정합니까? 감사.

답변

12

은 GDB가 일시적으로 쓰기 권한

호에

설정하지 리눅스/* 86 (GDB 읽고 하부 (디버깅) 프로세스 메모리를 작성하기 위해 사용하는 무엇) ptrace() 열악한 사람들이 읽고 쓸 수없는 페이지에 대한 읽기 및 쓰기가 가능하므로 설명 된 혼동을 초래할 수 있습니다.

이것은 커널의 버그로 간주 될 수 있습니다.

커널 디버거는 브레이크 포인트/트랩 명령과 원래 명령어를 덮어 씀으로써 이루어진다 브레이크 포인트 (심을 수 있도록의 ptrace 정상적으로 기록 불가능한 .text 섹션에 기록 할 수 있도록을 가지고 있음에 유의해야한다 - - int3을 통해 PTRACE_POKETEXT 요청).

커널은 POKE_DATA에 대해 동일한 작업을 수행 할 필요가 없습니다

하지만 man ptrace는 말한다 :

PTRACE_POKETEXT, PTRACE_POKEDATA 
    Copies the word data to location addr in the child's memory. 
    As above, the two requests are currently equivalent. 

나는 그것이 현재의 행동을 유발하는 equivalentness 믿습니다.

+0

오늘 매우 감사합니다. – gimmeamilk

+0

@gimmeamilk : 질문에 대한 대답을 "수락"하십시오. 가장 좋아하는 답의 왼쪽에있는 체크/눈금 표시를 클릭하면됩니다 (체크는 투표의 바로 아래, 왼쪽에 있습니다). 응답자는 승인 된 응답에 대해 평판 포인트를 얻습니다. –

관련 문제