如果一個程式的命令列是一個password之類的不便展示的字串,如何不讓ps列印出來呢?
ps是從/proc/$pid/cmdline里拿的命令列,而/proc/$pid/cmdline則是在內核空間決議用戶程式的stack區域獲取的資料,那么答案很簡單,只需要覆寫掉這個區域即可,下面是個示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
char orig[16];
// 獲取stack上的命令列
strcpy(orig, argv[1]);
// 獲取命令列之后第一時間覆寫stack上的命令列
strcpy(argv[1], "skinshoe");
getchar();
}
如果應用程式不可修改代碼重新編譯,有沒有什么統一的辦法呢?當然有,用LD_PRELOAD很方便:
// inject.c
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int (*_main) (int, char * *, char * *);
static int pixie_main(int argc, char **argv, char **env)
{
char tmp[16];
strcpy(tmp, argv[1]);
strncpy(argv[1], "pixie", strlen(argv[1]));
argv[1] = tmp;
return _main(argc, argv, env);
}
int (*orig_start_main)(int (*main)(int, char **, char **),
int argc,
char **argv,
void (*init) (void),
void (*fini) (void),
void (*_fini) (void),
void (*stack_end));
int __libc_start_main(int (*main)(int, char **, char **),
int argc, char **argv,
void (*init)(void),
void (*fini)(void),
void (*_fini)(void),
void (*stack_end))
{
orig_start_main = dlsym(RTLD_NEXT, "__libc_start_main");
_main = main;
return orig_start_main(pixie_main, argc, argv, init, fini, _fini, stack_end);
}
編譯之:
gcc -O2 -fPIC -shared -o libinject.so inject.c -ldl
下面是一個“不能改的現有程式”:
// demo.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
printf("%s\n", argv[1]);
getchar();
}
用LD_PRELOAD執行之:
LD_PRELOAD=./libinject.so ./demo 12345
此時,demo程式列印的依然是12345,然后ps看到的就是pixie了,
把LD_PRELOAD部署到路徑里就好了,這是劫庫的標準手法,
事事都是雙刃劍,能做好事就能做壞事,用上面的把戲其實是可以任意修改任意程式的命令列的:
int (*_main) (int, char * *, char * *);
static int pixie_main(int argc, char **argv, char **env)
{
argv[1] = "pixie";
return _main(argc, argv, env);
}
試試看:
root@zhaoya-VirtualBox:~# LD_PRELOAD=./libinject.so ls -a
ls: cannot access 'pixie': No such file or directory
root@zhaoya-VirtualBox:~# LD_PRELOAD=./libinject.so /bin/echo hello
pixie
浙江溫州皮鞋濕,下雨進水不會胖,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/272265.html
標籤:其他
上一篇:各位大佬,系結資料庫的QTableView怎么在指定串列格中添加控制元件?
下一篇:YUV的存盤格式
