【ISCC2023线下】MISC1-帮帮小明writeup

这篇具有很好参考价值的文章主要介绍了【ISCC2023线下】MISC1-帮帮小明writeup。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

考点

流量分析,TLS,二维码修复

解题步骤

首先速览一遍帮帮小明.pcapng,发现里面的协议有IMAP和TLS,这部分可能有线索
打开统计->会话,TCP栏有两个终点为25端口的地址,追踪流量,是两次对话
【ISCC2023线下】MISC1-帮帮小明writeup
发现一个压缩包
【ISCC2023线下】MISC1-帮帮小明writeup
保存,发现有密码,里面是一个加密后的文件mosaic.bmp,用zipcenop排除了伪加密的可能性,所以密码应该在另一个tcp流中
【ISCC2023线下】MISC1-帮帮小明writeup
发现一段明文,用的gb2312编码,用vscode打开:
【ISCC2023线下】MISC1-帮帮小明writeup
害,怎么密码忘了呢,只能往后面慢慢找了
这里附件还给了tls-log.txt,猜测需要解密tls密文,在编辑——>首选项——>Protocols——>TLS——>(Pre)-Master-Secret log filename这里加入即可
最后在某个TLS流找到了密码cAn_yOU_hElp_mE
【ISCC2023线下】MISC1-帮帮小明writeup
解压压缩包,得到图片mosaic.bmp
【ISCC2023线下】MISC1-帮帮小明writeup
还好队友见过原题,直接把脚本放了上来,参数甚至一点没变就可以用

import math
import numpy as np
from PIL import Image
from numpy.lib import ndindex

X, Y = 103, 137
N = 20
BOX_SIZE = 23
PIXEL_SIZE = 11

def set_pix(array, x, y, val):
    '''将图片数组 array 中第 (x, y) 个二维码格设为 val
    '''
    x1 = x * PIXEL_SIZE
    x2 = (x+1) * PIXEL_SIZE
    y1 = y * PIXEL_SIZE
    y2 = (y+1) * PIXEL_SIZE
    array[x1:x2, y1:y2] = val

# check box[i, j]
def check(ar, i, j):
    '''判断图片数组 ar 生成的马赛克的第 (i, j) 个块是否要求的相符
    即比较数组 ar 对应位置的平均值和马赛克数组的对应格
    '''
    x1 = X + i*BOX_SIZE
    x2 = X + (i+1)*BOX_SIZE
    y1 = Y + j*BOX_SIZE
    y2 = Y + (j+1)*BOX_SIZE
    # print('box:\n', ar[x1:x2, y1:y2])
    mean = ar[x1:x2, y1:y2].mean()
    return math.floor(mean) == mosaic[i, j]

def set_pixels(ar, uncertains, t):
    for k, pos in enumerate(uncertains):
        color = ((t >> k) & 1) * 255
        set_pix(ar, pos[0], pos[1], color)

def solve():
    error = False
    # for every box in pixelated area.
    for (i, j) in np.ndindex(mosaic.shape):
        # 考虑马赛克的每个格子 (i, j),在 ar 中起始坐标是 (x, y)
        x = X + i*BOX_SIZE
        y = Y + j*BOX_SIZE

        # 只有从 (px, py) 开始的 3x3 个二维码格子会影响这个马赛克格子
        px = x // PIXEL_SIZE
        py = y // PIXEL_SIZE

        # 3x3 个格子中还不确定的位置
        uncertains = []
        for tx, ty in np.ndindex(3, 3):
            if not flags[px+tx, py+ty]:
                uncertains.append((px+tx, py+ty))
        if len(uncertains) == 0:
            continue

        possibles = []
        print(f'Try mosaic{(i, j)}, from pixel{(x, y)}, uncertains: {uncertains}')
        for t in range(2**len(uncertains)):
            '''遍历2^k种可能性'''
            # print('Try: {0:0{1}b}'.format(t, len(uncertains)))
            set_pixels(ar, uncertains, t)   # 将 ar 对应位置按 t 的每一位设置为对应颜色
            if check(ar, i, j):     # 判断马赛克颜色是否正确,正确则加入可能性列表
                possibles.append(t)

        if len(possibles) == 1:     # 只有一种可能性,那么是正确答案
            set_pixels(ar, uncertains, possibles[0])
            for x, y in uncertains:
                flags[x, y] = True
        elif len(possibles) > 1:
            # 多个可能就随便设一个,但是不标记为已经确定
            set_pixels(ar, uncertains, possibles[0])
            # 也可以用下面的方法,将所有可能性中颜色都相同的格子找出来,设置为确定的
            # 这样可以大大增加能解出的格子数(从 81% 提升到 88%)
            # print(possibles)
            # a = np.bitwise_and.reduce(np.asarray(possibles))
            # b = np.bitwise_or.reduce(np.asarray(possibles))
            # c = np.bitwise_xor(a, b)
            # print(f'{c:0{len(uncertains)}b}')
            # for k, pos in enumerate(uncertains):
            #     color = ((possibles[0] >> k) & 1) * 255
            #     set_pix(ar, pos[0], pos[1], color)
            #     if (c >> k) & 1 == 0:
            #         flags[pos[0], pos[1]] = True
        elif len(possibles) == 0 and len(uncertains) != 0:
            # 出现不明原因的错误
            print(f'Error: [{i}, {j}]')
            error = True
            break
        if error:
            break
        print(f'Solved: [{i}, {j}]')
    return flags.sum()  # 返回目前确定的格子数

im = Image.open('pixelated_qrcode.bmp')
ar = np.asarray(im, dtype='uint8')  # 在该数组上逐步恢复和试算二维码
mosaic = ar[X::BOX_SIZE, Y::BOX_SIZE][:N, :N].copy()    # 马赛克每格的数据
solved = ar[::PIXEL_SIZE, ::PIXEL_SIZE]     # 用于存放答案,开始取二维码每格左上角值
                                            # 注意 solved 是个引用,所以修改 ar 会跟着变
flags = (solved == 0) | (solved == 255)     # 如果某格是 0 或 255,已经能确定颜色

rd_corner = ar[PIXEL_SIZE-1::PIXEL_SIZE, PIXEL_SIZE-1::PIXEL_SIZE]  # 二维码每格右下角
rd_flags = (rd_corner == 0) | (rd_corner == 255)  # 按右下角能确定颜色的二维码格

for i, j in np.ndindex(flags.shape):
    # 按左上角和右下角边缘,将能够确定的格补全
    if flags[i, j]:
        set_pix(ar, i, j, solved[i, j])
    if rd_flags[i, j]:
        set_pix(ar, i, j, rd_corner[i, j])
flags = (solved == 0) | (solved == 255)  # 更新已确定的位置

while True:
    # 如果有新的格子被推算出来,那么继续算,否则已经没得算了
    num_ok = flags.sum()
    if solve() == num_ok:
        break

solved_im = Image.fromarray(ar)
solved_im.save('solved.bmp')
print('CertainRate:', flags.sum() / flags.size)

解密后读取二维码即可拿flag

后话

这次iscc线下真的有点抽象,关卡题打到12点还只有我们队解出来了这一题,其他队伍都是爆零,后来主办方只能延时到18点,结果还是没人解出来…awd也很难搞,开始3h的pwn和web私地都只有寥寥几队打进来,主办方看不下去了就开放了pwn私地,可惜咱也不会打其他队伍,就放了个waf上去,不过虽然没拿分但也没被打,还是保住了排名(x)
总的来说是难度偏大但也很有挑战性的一次比赛。文章来源地址https://www.toymoban.com/news/detail-711408.html

到了这里,关于【ISCC2023线下】MISC1-帮帮小明writeup的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HDCTF2023 Writeup

    pwn 做完了,别的方向的也有打一点。 伪随机数,种子也给出来了。先写个生成对应随机数的 c 程序。 基础栈溢出 + 给了后门函数 exp 如下: 给了个 shell,不过是假的。 利用格式化字符串漏洞劫持 printf_got 为 system_plt(经过调试得到 printf 的偏移是6 ) 下面存在 0x10 字节的溢

    2024年02月06日
    浏览(96)
  • SYCTF2023 WEB writeup

    一进来就是个任意文件下载功能,不过做了些限制,这题从头到尾都在骂杂鱼。。。(虽然我确实是(bushi) 查看页面源代码,给了个 /eval /login 两个路由,/eval是个目录遍历,/login尝试登录无果,有session,应该需要伪造session,利用/eval查看app下的pyc文件,然后down下载 在线找个

    2024年02月08日
    浏览(35)
  • 2023机器人操作系统(ROS)暑期学校预热-线下时间/地点-(转发)

    原文地址: 中国机器人操作系统(ROS)暑期学校自2015年举办以来,被中国机器人业界和学界,以及ROS开源基金会誉为除了ROSCon之外规模最大、参与人数最多、最成功的ROS线下活动。过去8年,中国机器人操作系统(ROS)暑期学校共吸引了全国500多所高校(包括台湾,香港,澳

    2024年02月16日
    浏览(41)
  • HGame 2023 Week2 部分Writeup

    文章将第二周比赛结束后发布于我的博客:https://blog.vvbbnn00.cn/archives/hgame2023week2-bu-fen-writeup 第二周的解题过程中,遇到的不少有意思的题目,同时,也学习到了不少的知识,故书写此题解,作为记录。 Week2 比赛地址:https://hgame.vidar.club/contest/3 顾名思义,是一道Git泄露题,使

    2023年04月19日
    浏览(53)
  • HGame 2023 Week4 部分Writeup

    文章同时发布于我的博客:https://blog.vvbbnn00.cn/archives/hgame2023week4-bu-fen-writeup 第四周的比赛难度较高,同时也出现了不少颇为有趣的题目。可惜笔者比较菜,做出来的题目数量并不是很多,不过里面确实有几道题值得好好讲讲。不多废话了,抓紧端上来吧(喜)。 注:本周C

    2024年02月03日
    浏览(50)
  • 2023 广东海洋大学 GDOUCTF Writeup By AheadSec

    感谢战队的每位同学,辛苦了~ Web: Nacl 、 monkey777 、 peakaboo Pwn: zsNick Crypto: Nacl Reverse: kcldah Misc: mochu7 、 Nacl 最终成绩第17名: 打开界面看到是个贪吃蛇游戏,拿flag的条件是坚持60秒,玩了一下可以发现蛇会越来越快,那么肯定有个参数控制蛇的速度 然后打开右键检查查看源代

    2024年02月02日
    浏览(57)
  • 2023NKCTF Writeup——W4ntY0u.

     简介 NKCTF2023是由N0wayBack战队举办。本次比赛采用线上网络安全技能大赛实践赛的形式,覆盖Web、Reverse、Pwn、Misc、Crypto、SocialEngineering等主流赛题方向,面向国内所有个体及团队 除了梦想外我们一无所有,将会和蔑视与困境做最后的斗争,这是最后一舞! 最终结果 经过三天

    2024年02月11日
    浏览(40)
  • GDOUCTF2023-misc方向WP

    bmp里面是RSA的私钥和加密密文,在线直接解一下 图片数据里提示了exiftool,看一下前两个图片exif信息,很明显AttributionName拼接是flag值 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mk03O1kH-1682052296988)(https://c.img.dasctf.com/images/2023421/1682051520212-782d

    2024年02月12日
    浏览(43)
  • 2023陕西省大学生信息安全竞赛web writeup

    早写好了,忘发了,题目质量还行,够我坐大牢 简单的反序列化,exp如下 传参这有个坑,用了Unicode编码,得copy下来进行url编码才能传参,不知道这么干有什么意义,还得绕过Exception,把变量数改一下就能绕过了,跟绕wakeup一样 preg_replace采用了/e的模式,很明显有rce漏洞,简

    2024年02月07日
    浏览(50)
  • 2023红明谷杯misc方向wp

    Q:2282679004 流量包其实完全非预期了后面 要是有师傅会的话求求教我一下 导出http对象 发现有shell.php,分析后大概了解其是一个带加密的shell。 一个简单的异或加密,但是不知道admin的key。继续追踪http流 在这里找到admin的password,现在有了key,之后过滤dns请求 现在明文密文都

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包