[DefCamp CTF]para-code

0x00 前言

本来想今天写的,结果比赛环境关了
幸好手里还有源码

<?php
require __DIR__ . '/flag.php';
if (!isset($_GET['start'])){
    show_source(__FILE__);
    exit;
} 

$blackList = array(
  'ss','sc','aa','od','pr','pw','pf','ps','pa','pd','pp','po','pc','pz','pq','pt','pu','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','pf','pz','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','pf','pz','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','pf','pz','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','pf','pz','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','pf','pz','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','pf','pz','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','pf','pz','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','pf','pz','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','pf','pz','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','pf','pz','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','pf','pz','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','pf','pz','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','pf','pz','pv','pw','px','py','pq','pk','pj','pl','pm','pn','pq','ls','dd','nl','nk','df','wc', 'du'
);

$valid = true;
foreach($blackList as $blackItem)
{
    if(strpos($_GET['start'], $blackItem) !== false)
    {
         $valid = false;
         break;
    }
}

if(!$valid)
{
  show_source(__FILE__);
  exit;
}

// This will return output only for id and ps. 
if (strlen($_GET['start']) < 5){
  echo shell_exec($_GET['start']);
} else {
  echo "Please enter a valid command";
}

if (False) {
  echo $flag;
}

?>

原环境中无写权限
若有写权限可参考

CTF中字符长度限制下的命令执行 rce(7字符5字符4字符)汇总

0x01 brain.md

可知flag.php在同目录下
只给四字符长度rce
最后一个echo $flag条件判定永远为false
只能通过得到flag

shell_exec($_GET['start']);

知识扩展

linux m4

GNU M4 是传统 Unix 宏处理器的实现
那么什么又是宏处理器呢

宏处理器

参考宏处理器与预处理器的区别
许多汇编语言支持“宏”功能,在此宏语句在被翻译成机器程序之前将被翻译成一系列汇编语言语句和可能的其他宏语句。因此,宏工具是一种文本替换能力。

它可以说明宏的效用,考虑这样一种情况,其中一台机器没有单个机器或汇编语言语句将一个内存地址的内容添加到另一个内存地址作为假设的汇编指令 ADD X, Y。相反,假设机器有一条指令 LOAD,将数据从内存移动到寄存器,一条指令 ADD,将内存地址的内容添加到寄存器的内容,以及一条指令 STORE,将数据从寄存器移动到内存。

通过使用这些指令,它可以使用宏定义创建“双地址添加”指令,如下所示 -

MACRO
ADD2    X, YLOAD    YADD     XSTORE   Y
ENDMACRO

第一条语句将宏命名为 ADD2 并定义其伪参数,即形式参数 X 和 Y。

接下来的三个语句定义了宏,即它们给出了它的翻译。可以假设机器只有一个寄存器,所以没有问题 LOAD 和 STORE 指的是什么寄存器。它可以将 ADD2 用作普通的汇编语言操作代码。

用作文本替换工具
实例演示

https://blog.csdn.net/vc66vcc/article/details/77961964

直观地实操一下

在这里插入图片描述
在这里插入图片描述
一般的靶机中都不会安装该指令
所以只做基础示范
增加一下读取文件的姿势
so payload

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值