隐藏与篡改Linux命令行参数

Posted CSDN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了隐藏与篡改Linux命令行参数相关的知识,希望对你有一定的参考价值。

【CSDN 编者按】有时候会遇到这样的需求,不希望命令行的某些参数被ps出来,比如命令行参数里可能存在一些用户名和密码之类的东西,在Linux下如果你想隐藏这些东西的话,你该如何操作?


作者 | dog250        责编 | 欧阳姝黎

如果一个程序的命令行是一个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 -als: cannot access 'pixie': No such file or directoryroot@zhaoya-VirtualBox:~# LD_PRELOAD=./libinject.so /bin/echo hellopixie

隐藏与篡改Linux命令行参数

2020-2021中国开发者调查报告重磅来袭,直接扫码或微信搜索「CSDN」公众号,后台回复关键词「开发者」,快速获取完整的报告内容!
 
   
   
 
隐藏与篡改Linux命令行参数