실제로 이것은 응용 프로그램 자체에서 수정 되어야 합니다. 이러한 응용 프로그램 은 오픈 소스 여야 하므로 앱 자체에서 문제를 해결하는 것이 옵션이되어야합니다. 이런 종류의 실수를 저지르는 보안 관련 응용 프로그램은 다른 실수도 발생할 수 있으므로 신뢰하지 않습니다.
간단한 인터 포저
그러나 당신은 다른 방법을 요구하고 있었으므로 여기에 하나가 있습니다.
#define _GNU_SOURCE
#include <dlfcn.h>
int __libc_start_main(
int (*main) (int, char * *, char * *),
int argc, char * * ubp_av,
void (*init) (void),
void (*fini) (void),
void (*rtld_fini) (void),
void (* stack_end)
)
{
int (*next)(
int (*main) (int, char * *, char * *),
int argc, char * * ubp_av,
void (*init) (void),
void (*fini) (void),
void (*rtld_fini) (void),
void (* stack_end)
) = dlsym(RTLD_NEXT, "__libc_start_main");
ubp_av[argc - 1] = "secret password";
return next(main, argc, ubp_av, init, fini, rtld_fini, stack_end);
}
이것을 컴파일하십시오
gcc -O2 -fPIC -shared -o injectpassword.so injectpassword.c -ldl
그런 다음 프로세스를 실행하십시오.
LD_PRELOAD=$PWD/injectpassword.so darkcoind masternode start fakepasshrase
인터 포저 라이브러리는 main
애플리케이션 의 함수가 실행 되기 전에이 코드를 실행합니다. main에 대한 호출에서 마지막 명령 행 인수를 실제 비밀번호로 대체합니다. 그러나 /proc/*/cmdline
(와 같은 도구에서 볼 수 있는) 명령 행 ps
에는 여전히 가짜 인수가 포함됩니다. 분명히 소스 코드와 컴파일 한 라이브러리는 자신이 읽을 수 있도록해야하므로 chmod 0700
디렉토리 에서 가장 잘 작동해야합니다 . 암호는 명령 호출의 일부가 아니므로 bash 기록도 안전합니다.
고급 인터 포저
보다 정교한 작업을 수행 __libc_start_main
하려면 런타임 라이브러리가 제대로 초기화되기 전에 실행 된다는 점을 명심해야합니다 . 따라서 절대적으로 필수가 아닌 한 함수 호출을 피하는 것이 좋습니다. 마음의 내용에 함수를 호출하려면 main
모든 초기화가 완료된 후 호출 되기 직전에 호출 해야 합니다. 내가 가지고있는 다음과 같은 예를 들어 지적 Grubermensch 감사 명령 행 인수로 전달 된 암호를 숨기는 방법을 가져 getpass
내 관심을.
#define _GNU_SOURCE
#include <dlfcn.h>
#include <unistd.h>
static int (*real_main) (int, char * *, char * *);
static int my_main(int argc, char * * argv, char * * env) {
char *pass = getpass(argv[argc - 1]);
if (pass == NULL) return 1;
argv[argc - 1] = pass;
return real_main(argc, argv, env);
}
int __libc_start_main(
int (*main) (int, char * *, char * *),
int argc, char * * ubp_av,
void (*init) (void),
void (*fini) (void),
void (*rtld_fini) (void),
void (* stack_end)
)
{
int (*next)(
int (*main) (int, char * *, char * *),
int argc, char * * ubp_av,
void (*init) (void),
void (*fini) (void),
void (*rtld_fini) (void),
void (* stack_end)
) = dlsym(RTLD_NEXT, "__libc_start_main");
real_main = main;
return next(my_main, argc, ubp_av, init, fini, rtld_fini, stack_end);
}
암호를 입력하라는 메시지가 표시되므로 더 이상 인터 포저 라이브러리를 비밀로 유지할 필요가 없습니다. 자리 표시 자 인수는 비밀번호 프롬프트로 재사용되므로 다음과 같이 호출하십시오.
LD_PRELOAD=$PWD/injectpassword.so darkcoind masternode start "Password: "
또 다른 대안은 파일 디스크립터 (예 : gpg --passphrase-fd
does) 또는 x11-ssh-askpass
, 또는 기타 에서 암호를 읽습니다 .