2017-10-01 18 views
0

일반적으로 메모리 할당 자 함수에서 libc 내부에서 호출되는 mmap 및 munmap에 연결하고 싶습니다. 할 수있는 한 가지 방법은 LD_PRELOAD입니다. 어쨌든 프로그래밍 방식으로이 작업을 수행 할 수 있습니까? libc 내의 mmap/munmap에 연결하고 싶습니다. 응용 프로그램의 mmap/munmap에 연결하고 싶지는 않습니다. 전용 기능을 리디렉션 할LD_PRELOAD가없는 mmap/munmap 후크

+0

리눅스에서는'ptrace'를 사용하십시오 ... –

답변

1

LD_PRELOAD 할당 자 (malloc, free 등)에 관련된 기능의 작은 세트의 glibc 내부 부른다. 특히 시스템 호출은 인라인되기 때문에 함수 호출이 전혀 필요하지 않습니다. Antti Haapala가 말했듯이 ptrace을 사용하거나 systemtap 또는 직접 작성한 커널 모듈을 사용할 수도 있습니다.

0

어쨌든 프로그래밍 방식으로이 작업을 수행 할 수 있습니까?

아니지만 꽤 있습니다. 0xE8 (또는 다른 연산 코드 CALL) 4 바이트 뒤에 다음 명령과 __mmap 간의 델타 동일 그 :

당신은 CALL __mmap 지시 찾고 .textlibc.so.6의 스캔 수 있다는 것이다.

그런 지시를 찾으면 mprotect 페이지를 쓸 수 있고 CALL 다른 루틴에 패치하고 mprotect으로 되돌릴 수 있습니다.

몇 가지 단점이 있습니다

  1. 이것은 해킹입니다.
  2. 패치하는 동안 동시에 실행중인 스레드가 없는지 확인하는 것이 좋습니다.
  3. 패치하는 동안 malloc (또는 현재 패치중인 코드를 호출 할 수있는 다른 것)으로 전화하지 않는 것이 좋습니다.
  4. 거짓 긍정이 가능합니다 (CALL과 같은 바이트 시퀀스는 실제로 CALL이 아닐 수 있습니다). 내 expirience 있음 이것은 결코 일어난 일이 아니다.
  5. 64 비트 프로세스에서 대상 루틴은 CALL에서 멀리 떨어져있을 수 있으며 +/-2GiB 오프셋을 사용하여 CALL 명령에 넣을 수 있습니다. 이 문제를 해결하려면 또 다른 총 해킹이 필요합니다 (CALL 트램펄린에 의 내부에 libc.so.6 이내에 충분히 길게 설정할 수 있으며 트램펄린은 임의 주소로 JMP을 수행 할 수 있습니다).

나는 이것이 귀엽지 않다고 언급 했습니까?

또 다른 대안은 __mmap__munmap 루틴이 PLT를 통해 노출되어 자신 만의 libc.so.6을 빌드하는 것입니다. 이 작업을 수행하는 패치는 아주 작지만 실행중인 모든 곳에서 자신의 GLIBC 빌드를 사용하는 것에 의존 할 수있는 경우에만 작동합니다.

0

필요한 항목에 따라 다릅니다. env 또는 putenv()를 사용하여 항상 대체 환경을 설정 한 다음 대상 프로그램을 실행할 수 있습니다. 마찬가지로 gdb를 사용하여 프로세스에 중단 점을 추가 할 수 있습니다.

왜 실제 작업을 설명하지 않습니까?