当前位置: 首页 > news >正文

2021 第四届 浙江省大学生网络与信息安全竞赛技能赛 预赛 Writeup,4题

文章目录

      • 1、Web:Checkin
      • 2、Misc:听说你在找flag?
      • 3、Crypto:Easy Railfence
      • 4、Misc:qrimg

1、Web:Checkin

题目:

  • 给了一个网站链接

思路:

  • 进入网站后,F12 ChromeDev对网站抓一个包即可。
    在这里插入图片描述

2、Misc:听说你在找flag?

题意:

  • 给了一个zip的压缩包, 一张图片以及一个被加密的rar文件,rar中有一个txt文件。
    在这里插入图片描述

  • 首先尝试从图片入手,拖入01Edit发现末尾的提示。
    在这里插入图片描述

  • 然后从压缩包入手,从第一个PK开始到最后,分离出了一个加密的zip。
    在这里插入图片描述

  • ARCHPR纯数字爆破该压缩包的密码。
    在这里插入图片描述

  • 解压后,找到压缩包里最大的图片,01Edit先看看。发现末尾有一串base64.
    在这里插入图片描述

  • 丢进扔CyberChef里,保存成png图片,得到一张全新的图
    在这里插入图片描述

  • 修改图片的高度,得到新的base64
    在这里插入图片描述

  • 抄下来,继续扔进去解密。
    RmluZGluZy4uLg==
    在这里插入图片描述

  • 得到rar压缩包的密码,解压得到flag.txt中的flag文件内容
    在这里插入图片描述

3、Crypto:Easy Railfence

题意:

  • 给了个py文件
    在这里插入图片描述

思路:

  • 观察代码,发现加密只进行了位置对换,不知道Rail和offset,但是知道了flag的格式。
    肯定是最后m = flag {_____ 长度已知 _______},然后经过两个参数加密后得到最终的字符串。

  • 可以发现g,l,{},这些字符在整个加密结果中只有一个并且位置已经确定,因此可以爆破得到Rail和offset只有两种可能。
    在这里插入图片描述

  • 代码中的encrypt部分是不用改的,flag只保留长度和flag{}这几个字符,然后枚举rail和offset判断一下即可。

    import hashlib
    
    #m = 'reetdrvhns0eutbftafmeon}linnd=a1cOh!gcedos{neuwkYav0irOceytounw'
    m = 'flag{_________________________________________________________}'
    
    def encrypt(c,rails,offset):
        c = '$' * offset + c
        length = len(c)
        result = {x: "" for x in range(rails)}
        for a in range(length):
            width = rails * 2 - 2
            num = a % width
            if (num < rails):
                result.update({num: result[num] + c[a]})
            else:
                ll = 2 * rails - 2 - num
                result.update({ll: result[ll] + c[a]})
        d = ""
        for k in range(rails):
            d = d + result[k]
        d = d.replace('$','')
        return d
    #    print (d), encrypt就这里return, 其他不改
    
    for Rail in range(2,20):
        for Offset in range(0,30):
            if encrypt(m, Rail , Offset)[23:25]=='}l':
                print(Rail,Offset)
    
    
  • 得到(13,5),(13,29)以后,丢到CyberChef里解码即可得到flag。
    在这里插入图片描述

4、Misc:qrimg

  • 给出的是一个gif,可以用potplayer或ffmpeg分解一下,得到单个的图片。
    在这里插入图片描述

    ffmpeg -i qrimg.gif qrimg%d.png
    
  • 将图片放入stegsolve中可以发现每一张图片在b0位都能看到一个二维码,扫码之后得到一个字母。
    在这里插入图片描述

  • 因此猜测是将所有二维码进行扫描后得到一串字符。

    from PIL import Image
    import pyzbar.pyzbar as pyzbar
     
    for count in range(1,313):
        img = Image.open('.//qrimg//'+str(count)+'.png')
        img = img.convert('RGB')
        width,height=img.size
        result = ""
        for i in range(0,height):
            for j in range(0,width):
                tmp = img.getpixel((j,i))
                result += bin(tmp[2])[-1]
        a = 0
        pic = Image.new("RGB",(288,360))
        for y in range(0,360):
            for x in range(0,288):
                if(result[a] == '0'):
                    pic.putpixel([x,y],(0,0,0))
                else:
                    pic.putpixel([x,y],(255,255,255))
                a += 1
        img_size = pic.size
        barcodes = pyzbar.decode(pic)
        for barcode in barcodes:
            barcodeDATA = barcode.data.decode("utf-8")
            print(barcodeDATA,end="")
    
    
    

    Vm0xd1NtUXlWa1pPVldoVFlUSlNjRlJVVGtOalZsSlZWR3RPVlUxWGVIcFdiVFZyWVd4S2MxTnNXbFpOYmxJelZrUkdTMlJIVWtWV2JHUnBWa1ZaZWxaclkzaFdNbEpJVm10c1ZXSkdXbTlVVmxaM1ZWWmtWMVpzV214U2EzQllWMnRhYzFsV1NsVldiazVhWWtkU2RscEhlR0ZTVmtwMFpFWm9hR1ZzV2xoV1IzaHZVakpHUmsxSWJHeFNWR3hZV1ZSS1VtUXhVbFZTYkU1clVsUldTbGRyV2tkV2JGcEZVVlJWUFE9PQ==

  • 最后多次base64解密可以得到flag。
    在这里插入代码片

相关文章:

  • 【MCAL_CANDriver】-1.2-Can Mailbox邮箱,Hardware Object,HOH,HRH,HTH之间的关系
  • 【零基础学QT】第七章 网络通信,TCP、UDP通信实验
  • 一次解释器模式的实际使用
  • C++入门·收尾
  • 25.CF992E Nastya and King-Shamans 转化+线段树二分
  • 快来带您了解中秋节的前世今生
  • 分布式锁之防止超卖 --mysql原子操作,乐观锁,redis事务,乐观锁
  • 【算法刷题】第一篇——哈希
  • 小脚本杂文shell脚本
  • 网络热的查询易语言代码
  • 医美健康这类在医疗行业的推广要怎么做?
  • uni-app开发,防止踩坑
  • mac M1 安装AndroidStudio打开真机调试
  • 备战数学建模40-遗传算法优化bp神经网络(攻坚站4)
  • 解决Java使用response下载文件报错,并总结可能出错的原因: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • conda常用的命令
  • create-react-app做的留言板
  • ES6--对象的扩展
  • JavaScript 基本功--面试宝典
  • Javascript设计模式学习之Observer(观察者)模式
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 给新手的新浪微博 SDK 集成教程【一】
  • 警报:线上事故之CountDownLatch的威力
  • 前嗅ForeSpider中数据浏览界面介绍
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 算法之不定期更新(一)(2018-04-12)
  • 网络应用优化——时延与带宽
  • 我是如何设计 Upload 上传组件的
  • 用Python写一份独特的元宵节祝福
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #ifdef 的技巧用法
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (c语言)strcpy函数用法
  • (待修改)PyG安装步骤
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (推荐)叮当——中文语音对话机器人
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)shell调试方法
  • .FileZilla的使用和主动模式被动模式介绍
  • .jks文件(JAVA KeyStore)
  • .NET CLR Hosting 简介
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net mvc 获取url中controller和action
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 中的轻量级线程安全
  • .net开发引用程序集提示没有强名称的解决办法
  • // an array of int
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [20190401]关于semtimedop函数调用.txt
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [C# WPF] 如何给控件添加边框(Border)?