还是先连接上去看看有什么,密码是上一题的flag
cat一下或者IDA
#include <stdio.h>
#include <string.h>int filter(char* cmd){int r=0;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(p=environ; *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?query=sh&sektion=&n=1
说明了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