[pwnable.kr]cmd1

在这里插入图片描述
看题目是跟PATH环境变量有关

在这里插入图片描述
看cmd1.c

#include <stdio.h>
#include <string.h>

int filter(char* cmd){
        int r=0;
        r += strstr(cmd, "flag")!=0;
        r += strstr(cmd, "sh")!=0;
        r += strstr(cmd, "tmp")!=0;
        return r;
}
int main(int argc, char* argv[], char** envp){
        putenv("PATH=/thankyouverymuch");
        if(filter(argv[1])) return 0;
        system( argv[1] );
        return 0;
}

定义了一个filter函数做简单的过滤,
不允许出现flag、sh、tmp字符

想到的第一个绕过方法自然是利用通配符
在这里插入图片描述
看了网上的wp意识到自己压根就没思考程序里面改path变量的意义,
平时在使用 rm、rmdir、ls 等命令时,无论当前位于哪个目录,都可以直接使用,
而无需指明命令的执行文件所在的位置(绝对路径),
其实这是 PATH 环境变量在起作用。

而题目中改了path变量之后,
就需要通过绝对路径才能使用之前的命令,

然后就了解到了which命令,
可以判断当前使用的命令所在的绝对路径
在这里插入图片描述
还有其他的一些绕过方法
在这里插入图片描述
base64,
$() 小括号里面是 Linux 命令,作用就是执行里面的命令后返回执行的结果;和 ``(反引号)作用一样。
而${}则是变量替换

在这里插入图片描述
引号绕过

在这里插入图片描述
反斜杠转义

在这里插入图片描述
利用环境变量,
这里才意识到单引号和双引号在shell里是不同的,

不过,引号有单引号和双引号之分,二者的主要区别在于,
被单引号括起来的字符都是普通字符,就算特殊字符也不再有特殊含义;
而被双引号括起来的字符中,"$"、"\"和反引号是拥有特殊含义的,"$"代表引用变量的值,
而反引号代表引用命令。

以及,filter函数通过检测字符‘sh’来禁止调用shell,
简单对比bash和sh,发现这里sh拥有更高的权限
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然而这个权限似乎不是从sh来的,看到sh实际上是指向dash的软连接
在这里插入图片描述
应该是cmd1的sgid导致的
在这里插入图片描述
试了一圈下来,除了bash和实际指向busybox的static-sh,
其他的shell都能继承到egid
在这里插入图片描述
懵了,
也查不到是什么东西导致了这种差异

还可以调用vim来读写文件,

./cmd1 '/usr/bin/vim'

然后输入:e flag
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值