2012-05-25 3 views
0

내일 시험을 위해 공부하고 나는이 질문을 가로 질러 : "libc.so mmap에 strace를

  • 개방 (우리가 strace를 다음과 콜와 실행 파일을 실행 한 후

    표준 C lib 디렉토리에 관한 및 결과 /lib/libc.so.6 ","O_RDONLY ") = 3

  • 의 mmap (NULL, 36803630, PROT_READ | PROT_EXEC, MAP_PRIVATE | MAP_DENYWRITE, 3, 0) = 0x7f312ab35000
  • 의 mmap (0x7f312aeae000, 20480, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED | MAP_DENYWRITE, 3 , 0x179000는) = 0x7f312aeae000

의 mmap의 첫 번째 콜이 PROT_READ 사용하지 왜 질문은 | PROT_EXEC와 두 번째 PROT_READ | PROT_WRITE를.

각 mmap 호출 후 어떻게되는지 자세히 설명해주십시오. 왜 프로세스가 libc (쓰기 액세스)를 수정해야하는지 이해할 수 없습니다.

답변

1

지도가 비공개이므로 (MAP_PRIVATE) 수정하지 않습니다. libc.so; 대신, libc.so에서 매핑 된 페이지의 개인 (프로세스에 대한) 사본을 수정합니다. 여기에는 데이터 세그먼트 (libc의 전역 변수)와 GOT (Global Offset Table) 및 런타임시 라이브러리를 특정 주소로 재배치하는 데 관련된 다른 구조가 포함됩니다.

+0

왜 PROT_EXEC가 사라 집니까? –

+0

데이터를 실행할 필요가 없습니다. 코드가 아니라 데이터입니다. 쓰기 가능한 메모리를 실행 가능하게 만드는 것은 보안 위험으로 간주됩니다. 공격자가 코드를 넣을 수있게함으로써 임의의 코드 실행으로 높아질 수있는 취약점을 확장하기 때문입니다. 많은 견고한 시스템은 메모리를 매핑 할 수 없으며 동시에 두 가지 실행 권한을 씁니다. –

관련 문제