第三届江西省高校网络安全技能大赛 部分wp&Crypto的疑惑

前言

我们命中注定要失去所爱之人,不然我们怎么知道,他们在我们的生命中有多重要。

本来实在是不想写这个比赛的wp,最后因为我们队伍解题分配以及战术的问题无缘决赛,赛后我们(也就两个人)也进行了积极的总结和反思,复盘以后发现其实还有好几个题目都能写,最后还是很遗憾的错失进入决赛的机会,准备明年再来吧。

Misc1-Hello

直接把题目拿去base64,得flag

Base64: Q01JU0NDVEZ7V2VsY29tZV9DVEZlciF9

Flag: CMISCCTF{Welcome_CTFer!}

Misc2-encrypt

本来是想考zip伪加密,通过winhex修改加密标志位解除伪加密,奈何我的360压缩无视了它的伪加密,直接打开了压缩包,把题目拿去解base64两次,得flag

Base64两次: UTAxSlUwTkRWRVo3Um1GclpWOWxibU55ZVhCMGFXOXVmUT09

Flag: CMISCCTF{Fake_encryption}

Misc3-jump

题目图片叫jump.png,通过winhex发现gif文件头
在这里插入图片描述
直接修改后缀为gif,通过Stegsolve按帧查看,最后得到flag
在这里插入图片描述

Misc4-Brups

在这里插入图片描述
通过四字节得crc爆破
在这里插入图片描述
另附爆破脚本:

import binascii
import string
import os,sys
dic=string.printable
crc5=[0x6083A1C8,0xCE70D424,0xC3F17511,0x526FD582,0x30E25038,0xAA3E6AEA]
password=''
for crc in crc5:
 for i in dic:
  for j in dic:
   for k in dic:
    for l in dic:
     s=i+j+k+l
     if crc==((binascii.crc32(s.encode()))&0xffffffff):
        password+=s
      	print(password)
print(password)

得到password:the_password_here_cipher

拿去解压打开flag.txt即可得flag:

CMISCCTF{how_to_burp_by_coding}

Misc5-Trees

用Stegsolve查看颜色通道时发现部分文字,CMISCCTF{co******t_tree}
上网查单词,得到coconut(椰树)(又暴露英语水平了),猜测flag为CMISCCTF{coconut_tree},提交,正确。

赛后群里大佬给出了正解

from PIL import Image

img = Image.open('enc.png')
w = img.width
h = img.height
img_obj = Image.new("RGB",(w//16,h//16))

for x in range(w//16):
    for y in range(h//16):
        (r,g,b)=img.getpixel((x*16,y*16))
        img_obj.putpixel((x,y),(r,g,b))

img_obj.save('ok.png')

在这里插入图片描述

Misc6-qrcode

直接上工具补全二维码
在这里插入图片描述
在这里插入图片描述

Flag: CMISCCTF{qr_c0de_r3c0very}

Misc7-blind

考查图片盲水印隐写以及PNG文件修复

扔进kali中去binwalk,发现两张图片,foremost分离
在这里插入图片描述

使用decode.py版盲水印脚本
在这里插入图片描述

查看得到压缩密码Q@CTF@NX,解压图片:

在这里插入图片描述

Winhex查看并修复文件头,

补齐文件头,得到flag
在这里插入图片描述

Misc8-music

这题是最伤心的,也是我们这次比赛最大的败笔
用audactity分析,发现了音频中有很多高低频
在这里插入图片描述
猜测为二进制,用高频表示1,低频表示0,8位位一组,可以发现前面的数据转出来是Rar!,奈何不清楚如何提取其中的二进制数据,手撕三个半小时未果,赛后复现看到大佬用python脚本提出了压缩包数据,后面是NTFS文件流隐写以及PNG图片改高得二维码,这里不再详细叙述了,需要请大佬队伍的wp
web,pwn和reverse可以参考大佬队伍的wp写的也很详细
引用的wp如下:

import numpy as np
import struct
import wave
import re


def write_records(records, format, f):
    #Write a sequence of tuples to a binary file of structures.
    record_struct = Struct(format)
    for r in records:
        f.write(record_struct.pack(*r))

path = "./music.wav"
f = wave.open(path, "rb")
# 读取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
# 读取波形数据
str_data = f.readframes(nframes)
f.close()
#将波形数据转换为数组
wave_data = np.fromstring(str_data, dtype=np.short)
b = ''
# arr = [elem for elem in wave_data if elem >0]
max = 0
d = ''
for i in wave_data:
    if i <0:
        if max !=0:
            if max<25000:
                d +='0'
            else:
                d += '1'
                pass
        max = 0
    if max < i:
        max = i

print(d)
print("\n\n\n\n")
a = re.findall(r'.{8}',d)
hex_list=[]
for i in a:
    res = hex(int(i,2))
    hex_list.append(res)
print(hex_list)

with open("result.txt","wb") as f:
    for x in hex_list:
        s = struct.pack('B',int(x,16))
        f.write(s)

Crypto的疑惑

这里只想再提一下密码学,同时也以虚心学习的态度请教大佬
Crypto-Factor题目
n = 3454083680130687060405946528826790951695785465926614724373
e = 3
c = 1347530713288996422676156069761604101177635382955634367208
gcd(m, n) = 1
n可以由yafu或在线分解得

p=11761833764528579549
q=17100682436035561357
r=17172929050033177661
使用多因子RSA脚本以及小指数爆破攻击均未果,没有思路了,求教

Crypto-Change题目

from flag import FLAG
from Crypto.Util.number import *
import gmpy2
import random
while True:
    p = int(gmpy2.next_prime(random.randint(10**399, 10**400-1)))
    q = int(str(p)[200:]+str(p)[:200])
    if gmpy2.is_prime(q):
        break
m = bytes_to_long(FLAG)
n = p*q
e = 65537
c = pow(m,e,n)
with open("enc","wb") as f:
    f.write(str(c))
    f.write("\n")
    f.write(str(n))

赛后发现是2019高校运维赛的题目使用该脚本的时候发现,那个题目的n恰好为800位,所以在计算的时候可以直接取n的前两百位和后两百位,这个题目的话由于q,p可能是400位出头的质数,相乘以后的n为798位,在提取n的位数的时候就有些犹豫,目前还没有复现解出这个题目,求大佬帮我答疑解惑。
我又回来了,赛后找大佬积极复现了题目,发现这个RSA真是有意思(头秃,再也不写RSA了),得到的解释是这样的,由于p是生成的四百位质数,q为p的前后两百位交换,所以有可能p的第201位刚好为0,导致q为399位的质数,最后导致n为798位(太强了吧),大佬的wp如下:

c='182812482972168423884795132699225934365072979206288632257180603530046820174392675977209758378734399146216742345585898385168866887000708558119959898992294085847474548306743585711154035585848291290988967352517174312220756638881837930962458861193652684492265539096477345065113556380573776423787885892688197584678128636231428194711357642971544417113415626331810909274966752557628893585198569815939514862013512237657828262360291726912615575646318630641527418369988268899879152029186728850816178597399494254385226049249357897840618728804680238123954207656671747782543031545429711152272581734051959578453680011676521727918037340906791388178004979453256050227967701258768070039292546964652071924183467364467145178290753361477912582242961929982420950384199259355122986865808523351306098081481072454093823090'
n=438980397031315392229453908048509540832246041631432878509579665664182747463100230160823865621798053164989325086085003940181731721089701380743698761443812523024144817205902380903062054138730658451286904347536210833160924917347633148983052015550354913154312162901555870494273903714349869746793861874257201085777893961715468950661641778512110325457371446203379767458862059193946434683324578530163650541637261158037041205642428802942295011562277084687025213626698849526240663754073508102229066475773893638716845176469070938803298515155140240970836387785401085919369741520890271902332951669953411373633688944162470994856654604872287103746922041844065053274059990595496159866206551119361036237431289830985174384522423364811997241255005514248198447925396378192915553898993758660041223393168707380580012437
s=str(n)[:198]+str(n)[-200:]
print(len(str(n)))
xy=int(s)
t=n-xy*(10**400)-xy
print(t)
xy2=(t)//(10**200)
import gmpy2
x_y=gmpy2.iroot(xy2-2*xy,2)[0]
x__y=gmpy2.iroot(xy2+2*xy,2)[0]
x=(x__y+x_y)//2
y=x__y-x
p=x*10**200+y
q=n//p
e=65537
d=gmpy2.invert(e,(p-1)*(q-1))
from Crypto.Util import number
print(number.long_to_bytes(gmpy2.powmod(int(c),d,n)))

运行即可得到flag

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

monster663

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值