banner
lca

lca

真正的不自由,是在自己的心中设下牢笼。

某网杯比赛writeup

比赛实操只有 6 道题,涉及 web、misc、crypto 题,这比赛帮客户打的,但这题目不难,也是,不然怎么是小比赛呢?

第一题:1-1#

查找 js,搜索关键字 flag

dasctf{d6e9c56d7f078d298ed4695d899effbe}

image

第二题:2-1#

pdf 打开

图片上有文本框

image

第三题:3-1#

题目源码如下,这题朋友解的:

import libnum
import gmpy2
from Crypto.Util.number import *
import flag,e1,e2
#生成素数
p=libnum.generate_prime(1024)
q=libnum.generate_prime(1024)
ec1=pow(bytes_to_long(str(e1).ljust(20,"D").encode()),3,p*q)
ec2=pow(bytes_to_long(str(e2).ljust(20,"A").encode()),5,p*q)
m=libnum.s2n(flag)
n=p*q
c1=pow(m,e1,n)
c2=pow(m,e2,n)

print("n1=",n)
print("ec1=",ec1)
print("c1=",c1)
print("n2=",n)
print("ec2=",ec2)
print("c2=",c2)

# n1= 27929259512873502442719286790227037320417984116570178470037376373267390909685621247157535458203218619293705428397911754453556082799420494496904478215709219317542924547049229150153308059698341011305505985823374280465467094476511869541135508518055946815227085548571701115773386101962695795789178321155174729047033298389886321980592410739667139376075568555729949442873964097042006391886635957242436522435588904492484342259494858627609438654632887244523845583473711604632109405043439047289868784236481926074763997559971182741918345193506253460323445846136663027639802131457594564405906763806426256107923417802076262573737
# ec1= 24979839185643431898760549059477070141596292955202172081572583839065034831779499992829742773873064296311713734486020739853343887094398935731264
# c1= 17695186679431856780362905635257355413310120106982055323913669124182832151093921194946365178919380690844190324897933591567360925332869903671651849060145290581360223200011298757871213149464298017718829480721410479504940393501845624196721013966839230696831321482946841011452400364600924503121451272593970649100410603943321149604376033957124800064565646929720179239631538966228020882733213221035707244692798307971636126058586394357032072695921642665492919186476321028415907982915011972040971875733852055633796811898421692604356476773910338982400925245494707729878821466569634334862311750349321720627252469986162120031838
# n2= 27929259512873502442719286790227037320417984116570178470037376373267390909685621247157535458203218619293705428397911754453556082799420494496904478215709219317542924547049229150153308059698341011305505985823374280465467094476511869541135508518055946815227085548571701115773386101962695795789178321155174729047033298389886321980592410739667139376075568555729949442873964097042006391886635957242436522435588904492484342259494858627609438654632887244523845583473711604632109405043439047289868784236481926074763997559971182741918345193506253460323445846136663027639802131457594564405906763806426256107923417802076262573737
# ec2= 2838620519239658396968146844964839207179863729944843241951228382052657801460586137213053314019699976475855578055607417923815486109050614096157077528657405905877896929808094661904905136761365045387901486261011216958309860644255996588189249
# c2= 10770781309274554738409447671578241895686779262243081931452089039730277591151694112684863740412412713684216227740930573490322958500198235497947657939304932868457999239593145330718657422535271157683896034543125292529800047408131765376686654378173684648427311300423776510153307756388404568013401217965931456538849277670384454454507752525534110389604969437991055504757081225690155489265359117617764571537216746554060783131168749700810806387918510612057149583061938836035963175555630655718716139689761210220525955656039741684390906935720406757364893793459339618913268943282961044530062475057887777134887741597041684698119

已知值,公钥

image

在脚本中给定了如下参数,n1、n2、ec1、ec2、c1、c2,ec1 和 ec2 都是小指数加密得到的,所以直接 iroot 开方即可得到加密指数 e1 和 e2。

使用变量 k 来寻找一个有效的 k 值,使得表达式ec2 + k * n是一个完全的五次方数。

while 1:
	res=iroot(ec2+k*n,5) #print(res)

在上述循环中,脚本计算表达式ec2 + k * n的五次方根,并检查这个五次方根是否为整数。如果是整数,就将其对应的字符串打印出来,然后跳出循环。否则,递增 k 值,继续循环。

while True: 
	res = gmpy2.iroot(ec2 + k * n, 5) if res[1] == True: print(long_to_bytes(int(res[0])))

接下来,脚本使用扩展的欧几里得算法计算了公钥 e1 和 e2 的乘法逆元,得到 s1 和 s2,最后,脚本分别计算了 c1 的 s1 次方和 c2 的 s2 次方,将这两个结果相乘,并对 n 取模,以获得明文 m。这两个指数分别用于解密密文 c1 和 c2,从而得到原始的消息 m。

s, s1, s2 = gmpy2.gcdext(e1, e2)
m = (pow(c1, s1, n) * pow(c2, s2, n)) % n  # m = (c1^s1) * (c2^s2)

解密脚本如下:

import gmpy2
from Crypto.Util.number import *

n = 27929259512873502442719286790227037320417984116570178470037376373267390909685621247157535458203218619293705428397911754453556082799420494496904478215709219317542924547049229150153308059698341011305505985823374280465467094476511869541135508518055946815227085548571701115773386101962695795789178321155174729047033298389886321980592410739667139376075568555729949442873964097042006391886635957242436522435588904492484342259494858627609438654632887244523845583473711604632109405043439047289868784236481926074763997559971182741918345193506253460323445846136663027639802131457594564405906763806426256107923417802076262573737

ec2 = 2838620519239658396968146844964839207179863729944843241951228382052657801460586137213053314019699976475855578055607417923815486109050614096157077528657405905877896929808094661904905136761365045387901486261011216958309860644255996588189249

c1 = 17695186679431856780362905635257355413310120106982055323913669124182832151093921194946365178919380690844190324897933591567360925332869903671651849060145290581360223200011298757871213149464298017718829480721410479504940393501845624196721013966839230696831321482946841011452400364600924503121451272593970649100410603943321149604376033957124800064565646929720179239631538966228020882733213221035707244692798307971636126058586394357032072695921642665492919186476321028415907982915011972040971875733852055633796811898421692604356476773910338982400925245494707729878821466569634334862311750349321720627252469986162120031838

c2 = 10770781309274554738409447671578241895686779262243081931452089039730277591151694112684863740412412713684216227740930573490322958500198235497947657939304932868457999239593145330718657422535271157683896034543125292529800047408131765376686654378173684648427311300423776510153307756388404568013401217965931456538849277670384454454507752525534110389604969437991055504757081225690155489265359117617764571537216746554060783131168749700810806387918510612057149583061938836035963175555630655718716139689761210220525955656039741684390906935720406757364893793459339618913268943282961044530062475057887777134887741597041684698119

e1 = 34967
e2 = 65535

# 寻找有效的 k 值
k = 0

while True:
    res = gmpy2.iroot(ec2 + k * n, 5)
    if res[1] == True:
        print(long_to_bytes(int(res[0])))  # 转为字符串
        break
    k = k + 1

# 解密
s, s1, s2 = gmpy2.gcdext(e1, e2)
m = (pow(c1, s1, n) * pow(c2, s2, n)) % n  # m = (c1^s1) * (c2^s2)

# 打印解密结果
print(long_to_bytes(m))

第四题:4-1#

原题代码如下:

from uuid import *

from caser import something
from secret import flag
base_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
result =""

for i in range(len(flag)):
    if flag[i] in base_table:
        result +=base_table[(base_table.index(flag[i])+33)%64]
    else:
        result +=flag[i]
print(result)

#khzj0m{9caZ87VV-8X77-WW/+-78Wa-eZVdaYYe9/dZ}

根据给出的代码编写解密脚本

encrypted_flag = "khzj0m{9caZ87VV-8X77-WW/+-78Wa-eZVdaYYe9/dZ}"
base_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
flag = ""

for char in encrypted_flag:
    if char in base_table:
        index = (base_table.index(char) - 33) % 64
        flag += base_table[index]
    else:
        flag += char
print(flag)

crypto 类型的题直接用 chatgpt 来解

第五题:5-1#

分析给定的附件 pcap.pcap

image

存在 rar 压缩包的文件头格式,提取出上述 16 进制内容,将其以 16 进制方式写入 010editor

image

写入后具体内容如下:

image

得到 rar 文件,解压后给了一个 flag.rar 文件,但需要解压密码

猜测 ntfs 流隐写,使用 ntfs 数据流处理工具处理

image

得到一串 base64

image

密码就是这串 base64 值,解压压缩包

image

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.