真的,这应该在应用程序本身中修复.此类应用程序应该是开源的,因此应该可以选择在应用程序本身中修复问题.与此类错误相关的安全相关应用程序也可能会出现其他错误,因此我不相信它.
简单的插入器
但是你要求采用不同的方式,所以这里有一个:
#define _GNU_SOURCE
#include
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,他指出how to hide a password passed as command line argument引起了我的注意.
#define _GNU_SOURCE
#include
#include
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)或x11-ssh-askpass等中读取密码.