일반적으로 메모리 할당 자 함수에서 libc 내부에서 호출되는 mmap 및 munmap에 연결하고 싶습니다. 할 수있는 한 가지 방법은 LD_PRELOAD입니다. 어쨌든 프로그래밍 방식으로이 작업을 수행 할 수 있습니까? libc 내의 mmap/munmap에 연결하고 싶습니다. 응용 프로그램의 mmap/munmap에 연결하고 싶지는 않습니다. 전용 기능을 리디렉션 할LD_PRELOAD가없는 mmap/munmap 후크
0
A
답변
1
LD_PRELOAD
할당 자 (malloc
, free
등)에 관련된 기능의 작은 세트의 glibc 내부 부른다. 특히 시스템 호출은 인라인되기 때문에 함수 호출이 전혀 필요하지 않습니다. Antti Haapala가 말했듯이 ptrace
을 사용하거나 systemtap 또는 직접 작성한 커널 모듈을 사용할 수도 있습니다.
0
어쨌든 프로그래밍 방식으로이 작업을 수행 할 수 있습니까?
아니지만 꽤 있습니다. 0xE8
(또는 다른 연산 코드 CALL
) 4 바이트 뒤에 다음 명령과 __mmap
간의 델타 동일 그 :
당신은 CALL __mmap
지시 찾고 .text
libc.so.6
의 스캔 수 있다는 것이다.
그런 지시를 찾으면 mprotect
페이지를 쓸 수 있고 CALL
다른 루틴에 패치하고 mprotect
으로 되돌릴 수 있습니다.
몇 가지 단점이 있습니다
- 이것은 총 해킹입니다.
- 패치하는 동안 동시에 실행중인 스레드가 없는지 확인하는 것이 좋습니다.
- 패치하는 동안
malloc
(또는 현재 패치중인 코드를 호출 할 수있는 다른 것)으로 전화하지 않는 것이 좋습니다. - 거짓 긍정이 가능합니다 (
CALL
과 같은 바이트 시퀀스는 실제로CALL
이 아닐 수 있습니다). 내 expirience 있음 이것은 결코 일어난 일이 아니다. - 64 비트 프로세스에서 대상 루틴은
CALL
에서 멀리 떨어져있을 수 있으며+/-2GiB
오프셋을 사용하여CALL
명령에 넣을 수 있습니다. 이 문제를 해결하려면 또 다른 총 해킹이 필요합니다 (CALL
트램펄린에 의 내부에libc.so.6
이내에 충분히 길게 설정할 수 있으며 트램펄린은 임의 주소로JMP
을 수행 할 수 있습니다).
나는 이것이 귀엽지 않다고 언급 했습니까?
또 다른 대안은 __mmap
과 __munmap
루틴이 PLT를 통해 노출되어 자신 만의 libc.so.6
을 빌드하는 것입니다. 이 작업을 수행하는 패치는 아주 작지만 실행중인 모든 곳에서 자신의 GLIBC 빌드를 사용하는 것에 의존 할 수있는 경우에만 작동합니다.
0
필요한 항목에 따라 다릅니다. env 또는 putenv()를 사용하여 항상 대체 환경을 설정 한 다음 대상 프로그램을 실행할 수 있습니다. 마찬가지로 gdb를 사용하여 프로세스에 중단 점을 추가 할 수 있습니다.
왜 실제 작업을 설명하지 않습니까?
리눅스에서는'ptrace'를 사용하십시오 ... –