
라이브 리눅스 프로세스에 ptrace 없이 공유 라이브러리(즉, 임의의 코드)를 주입합니다.
공유 라이브러리(임의 코드)를 ptrace 없이 실행 중인 리눅스 프로세스에 주입합니다. Cexigua 및 linux-inject 등에서 영감을 받았습니다.
.___.__ .__ __ __
__| _/| | |__| ____ |__| ____ _____/ |_ ______ ___.__.
/ __ | | | | |/ \ | |/ __ \_/ ___\ __\ \____ < | |
/ /_/ | | |_| | | \ | \ ___/\ \___| | | |_> >___ |
\____ | |____/__|___| /\__| |\___ >\___ >__| /\| __// ____|
\/ \/\______| \/ \/ \/|__| \/
source: https://github.com/DavidBuchanan314/dlinject
usage: dlinject.py [-h] [--stopmethod {sigstop,cgroup_freeze,none}]
pid /path/to/lib.so
Inject a shared library into a live process.
positional arguments:
pid The pid of the target process
/path/to/lib.so Path of the shared library to load (note: must be
relative to the target process's cwd, or absolute)
optional arguments:
-h, --help show this help message and exit
--stopmethod {sigstop,cgroup_freeze,none}
How to stop the target process prior to shellcode
injection. SIGSTOP (default) can have side-effects.
cgroup freeze requires root. 'none' is likely to cause
race conditions.
내가 할 수 있으니까.
다양한 anti-ptrace 기법이 존재하는데, 이 도구는 ptrace를 사용하지 않음으로써 이를 회피합니다.
나는 ptrace를 좋아하지 않습니다.
LD_PRELOAD를 사용하는 것은 주입하려는 프로세스가 깨끗한 환경의 다른 프로세스에 의해 생성된 경우 까다롭거나 불가능할 수 있습니다.
대상 프로세스에 중지 신호를 보냅니다. (선택 사항)
_dl_open() 심볼을 찾습니다.
/proc/[pid]/syscall을 통해 RIP와 RSP를 획득합니다.
/proc/[pid]/mem에서 읽어서 스택 일부와 셸코드로 덮어쓸 코드의 백업을 만듭니다.
1차 및 2차 셸코드 버퍼를 생성합니다.
/proc/[pid]/mem에 쓰기를 통해 RIP에 1차 셸코드를 삽입합니다.
1차 셸코드:
mmap()을 통해 2차 셸코드를 로드합니다.2차 셸코드:
_dl_open()을 호출합니다. 로드 시 생성자가 평소와 같이 실행됩니다.SIGSTOP 시점에 있던 위치로 점프합니다.SIGSTOP을 보내면 원치 않는 부작용이 발생할 수 있습니다. 예를 들어 다른 스레드가 waitpid()를 기다리고 있는 경우입니다. --stopmethod=cgroup_freeze 옵션은 이를 회피하지만 (적어도 대부분의 배포판에서) root 권한이 필요합니다.
복잡한 멀티스레드 애플리케이션과 어떻게 상호작용할지 완전히 확신할 수 없습니다. 분명히 문제가 발생할 가능성이 있습니다.
x86-64 리눅스 전용입니다 (현재로서는 - 32비트 지원이 추가될 가능성이 있습니다).
root 권한 또는 완화된 YAMA 설정이 필요합니다 (테스트 시 echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope가 유용합니다).
대상 프로세스가 샌드박싱된 경우 (예: seccomp 필터), 2단계 셸코드를 mmap()하거나 라이브러리를 dlopen()할 권한이 없을 수 있습니다.