首页 > 技术文章 > 【SIPC_GAME】个人记录

Arctic-Maple 2021-03-26 23:22 原文


CheckIn

文件是压缩包,打开就是flag压缩包,再打开还是flag压缩包,所以是解压3000个flag压缩包

网上找到的递归解压脚本

import shutil
import zipfile
import os
import win32api

recursive_unzip_file = []
def recursive_unzip(path, zfile):
    file_path = path + os.sep + zfile
    # 给解压后的文件生成文件名相同的文件夹
    des_dir = path + os.sep + zfile[:zfile.index('.zip')]
    srcfile = zipfile.ZipFile(file_path)
    for file_name in srcfile.namelist():
        if file_name.endswith('.zip'):
            temp_del_file = os.path.join(des_dir, file_name)
            if temp_del_file not in recursive_unzip_file:
                recursive_unzip_file.append(temp_del_file)
        srcfile.extract(file_name, des_dir)
        if file_name.endswith('.zip'):
            temp_del_file = os.path.join(des_dir, zfile)
            if temp_del_file not in recursive_unzip_file:
                recursive_unzip_file.append(temp_del_file)
            # if zipfile.is_zipfile(filename):
            path = des_dir
            zfile = file_name
            recursive_unzip(path, zfile)


def del_file(file_path):
    """
    删除指定路径下的所有文件和文件夹
    :param file_path: 路径
    :return:
    """
    for del_file_path in file_path:
        if os.path.isfile(del_file_path):
            os.remove(del_file_path)
        elif os.path.isdir(del_file_path):
            shutil.rmtree(del_file_path)


if __name__ == '__main__':
    path = r'C:\Users\Arctic_Maple\Desktop\2'
    path = win32api.GetShortPathName(path)
    zfile = r'flag.zip'
    recursive_unzip_file.append(os.path.join(path, zfile))
    recursive_unzip(path, zfile)
    print(recursive_unzip_file)
    print(len(recursive_unzip_file))
    del_file(recursive_unzip_file)

啊这。。。

那就重复多次解压,运行一次代码能够打开的文件夹名称为

C:\Users\Arctic_Maple\Desktop\2\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag\flag

所以每次提取最终的zip然后清空2文件夹,再把本次最终zip放进2文件夹,循环

自己的脚本正在编写中,试图写出一个能一次性解压到位的脚本


misc

misc-1(未解出)

下载下来是cap文件,应该是流量分析题目

用010editor打开,搜索flag

找到有一条报文含有flag.png,地址是127.0.0.1,端口8888

再用wireshark打开,找到这条信息


导出对象,http,搜索flag

导出图片

不是长度改写,binwalk显示图片内无文件,pngcheck显示没有错位的

用stegsolve直接提取RGB三色0通道,有一个二维码


感觉非常像MD5,但是没办法按照MD5破解,而且其他的32位编码也都试过了

学长给的hint,题目叫reserve,所以把这串字符逆序

但是我反了一下顺序,md5还是解不出来啊,哪里有啥问题吗?


misc-2

压缩包里面也有一个南孚电池.jpeg,应该就是明文攻击了

压缩图片成zip,这里不能用winrar,winrar用的是AES-256算法,这里常规需要的是ZipCrypto

打开AZPR,传入nanfu.zip和新压缩的南孚电池.zip

跑出来得到一个没有密码的压缩包


web

web-1

是2019强网杯随便注原题,个人记录在这里


web-2

有2nd.php,在往上就404了

抓包


如果在1st.php中将admin=0改为admin=1,会得到一段源代码

操作2nd.php没有任何反应,先放着


根据代码,大意是:

admin需要设置为非零,方法为post,flag值不能为空

$post[flag]不完全等于$flag,最终得到

this is your flag:$flag

welcome admin

那么构造语句,得到一半的flag

之后想到的是2nd.php中默认的那句give me your flag,于是把得到的半截flag用GET传上去

得到的又是一段代码


此时抓包显示的啥也没有,那就继续看代码

首先得满足url中有 flag=flag{wHeR3_l5_tH3_0ThRr_haIF? ,否则压根不进入循环。

$this->trick1和$this->trick2的长度都不能大于5

$this->trick1会变成string类型

$this->trick1!==$this->trick2只需要类型或值有一个不相同就行

md5($this->trick1) === md5($this->trick2)md5加密后要全等

$this->trick1 != $this->trick2要求值不同

构造这部分所需的url

?trick=O:5:"trick":2:{s:6:"trick1";d:0.1;s:6:"trick2";d:0.100000000000001;}

这里很明显有个冲突,需要一个url既含有flag的先决条件又需要含有trick这段得出后半段flag

所以最终url:

?flag=flag{wHeR3_l5_tH3_0ThRr_haIF?&trick=O:5:%22trick%22:2:{s:6:%22trick1%22;d:0.1;s:6:%22trick2%22;d:0.100000000000001;}

得到后半段的flag

备注

序列化

能方便储存传输,减轻服务器压力

序列化是将变量和对象转换成字符串的过程

php中用serialize()序列化,用unserialize()反序列化

序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字

对字母大小写和空白(空格、回车、换行等)敏感,字符串是按照字节计算的

序列化会用到魔术函数__construct():构造函数在实体化对象时调用;__destruct():析构函数当删除一个对象或者对象操作终止时被执行,多用于释放空闲内存

O:5:"trick":2:{s:6:"trick1";d:0.1;s:6:"trick2";d:0.100000000000001;}

格式是
O::""::{<field name 1><field value 1><field name 2><field value 2>...}

O是common object

s是string

d是double

对象是trick类,有trick1和trick2

d这里用的是精度,也能用
NAN 合法数值
INF 无穷大

推荐阅读