
还是先连接上去看看有什么密码是上一题的flagcat一下或者IDA#include stdio.h #include string.h int filter(char* cmd){ int r0; r strstr(cmd, )!0; r strstr(cmd, PATH)!0; r strstr(cmd, export)!0; r strstr(cmd, /)!0; r strstr(cmd, )!0; r strstr(cmd, flag)!0; return r; } extern char** environ; void delete_env(){ char** p; for(penviron; *p; p) memset(*p, 0, strlen(*p)); } int main(int argc, char* argv[], char** envp){ delete_env(); putenv(PATH/no_command_execution_until_you_become_a_hacker); if(filter(argv[1])) return 0; printf(%s\n, argv[1]); system( argv[1] ); return 0; }可以看到思路基本是和上一题cmd1是一样的但是过滤条件更加严格了连/也不能使用我自己不是太熟悉所以参考了网上的很多方法下面我就说一下网上最常见的方法:使用通配符首先是理解system()指令搜索命令的执行方式http://man7.org/linux/man-pages/man3/system.3.html从这里可以看出来execl(/bin/sh, sh, -c, command, (char *) 0);此命令用于sh以此特定方式执行命.而这里https://www.freebsd.org/cgi/man.cgi?queryshsektionn1说明了command [-p] [utility [argument ...]]的-p选项的命令允许我们使用默认值PATH进行搜索。它保证找到所有标准实用程序。system本质是调用execve /bin/sh 来执行命令的。所以要想方法借助sh的特性来出现/。输入./cmd2 command -p cat f*获得flag下面内容参考至:https://blog.csdn.net/think_ycx/article/details/82991032这里还列出了很多不同的思路大家可以去看看补充system调用sh执行命令源码下载glibc后开始调试system源码。# 编译 gcc system.c -g -o system # 调试 gdb system # 加载源码 gdb directory /root/Pwn/glibc/glibc-2.23/sysdeps/posix/system调用链__libc_system-do_system-__execve (SHELL_PATH, (char *const *) new_argv, __environ) 。SHELL_PATH是/bin/sh。do_system 部分源码// ... 处理一些信号 if (pid (pid_t) 0) { /* Child side. */ const char *new_argv[4]; new_argv[0] SHELL_NAME; new_argv[1] -c; new_argv[2] line; new_argv[3] NULL; /* Restore the signals. */ (void) __sigaction (SIGINT, intr, (struct sigaction *) NULL); (void) __sigaction (SIGQUIT, quit, (struct sigaction *) NULL); (void) __sigprocmask (SIG_SETMASK, omask, (sigset_t *) NULL); INIT_LOCK (); /* Exec the shell. */ (void) __execve (SHELL_PATH, (char *const *) new_argv, __environ); _exit (127); }详细参考关于glibc的system函数调用实现https://blog.csdn.net/u010039418/article/details/77017689