SICTF-2024

SICTF-2024

MISC

签到

关注 林枫云 微信公众号, 发送 SICTF Round4

派森

下载得到了个文件,然后后缀改成py

然后打开

然后让ai 通过谐音翻译,得到脚本

然后运行py得到

flag = [16, 29, 67, 84, 31, 75, 89, 48, 30, 111, 107, 48, 49, 52, 95, 67, 6, 2, 110, 51, 44, 69, 95, 118, 74, 45, 121, 95, 70, 84, 49, 49, 0, 0, 33, 33, 0, 10, 113, 125]
ink = []

for i in range(0, len(flag), 4):
ink.append(flag[i] ^ flag[i+2])
ink.append(flag[i+1] ^ flag[i+3])
ink.append(flag[i+2])
ink.append(flag[i+3])

print(ink)

然后运行

将这些字符串十进制转ascii得到flag

Picture

打开后给了两张图片和一个py脚本,很明显这两个图片是由一个图片利用这个脚本分解出来的,所以我们现在就是写个脚本将之前的图片还原,

脚本如下:

from PIL import Image

def restore_image(image1_path, image2_path, output_path):
# 打开两张图片
image1 = Image.open(image1_path)
image2 = Image.open(image2_path)

# 获取图片尺寸
width, height = image1.size

# 创建一个新的空白图片,用于存放恢复后的图片
restored_image = Image.new(mode="RGB", size=(width, height))

# 遍历每个像素
for i in range(width):
for j in range(height):
# 获取两张图片对应像素的 RGB 值
r1, g1, b1 = image1.getpixel((i, j))
r2, g2, b2 = image2.getpixel((i, j))

# 将两个像素的 RGB 值相加,得到恢复后的像素值
restored_r = (r1 + r2) % 256
restored_g = (g1 + g2) % 256
restored_b = (b1 + b2) % 256

# 设置恢复后图片的像素值
restored_image.putpixel((i, j), (restored_r, restored_g, restored_b))

# 保存恢复后的图片
restored_image.save(output_path)

# 调用函数恢复图片
restore_image(r'E:\CTF日常做题\flag1.png', r'E:\CTF日常做题\flag2.png', r'E:\CTF日常做题\restored_flag.png')

然后就是得到了一个白色的图片,通过steg改变背景颜色找到flag

模型的秘密(看了wp)

打开后,给了一个字典,然后用这个字典去爆破压缩包

得到密码

然后解压缩得到一个后缀为blend的文件

这里要用到blender进行打开(直接官网下载即可)

打开后就只有一个正方体,然后什么也找不到

之后看了wp,发现需要在010中补一个文件头BLEND

最后保存再用blender打开

得到flag

SICTF{fLAG1nTheM8deL}

Crypto

SignBase

base64解码

next_prime

题目描述:

from Crypto.Util.number import getPrime
from gmpy2 import next_prime
from select import flag

p = getPrime(1024)
q = getPrime(1024)
e = 65537
n = p * q
c = pow(flag, e, n)
gift = n * next_prime(p) * next_prime(q)
print("n =", n)
print("c =", c)
print("gift =", gift)

# n = 11958388191411693159737723233868177200642855312771636589272066925180521736238782088222469544720240237292008558651656242716943228927612911153093905350043065811853776453271082678856297734699816670221066298151571078839575715976634390967727901295936522621706645886864683564184184197808626753747618171580292981571324190267014128877345111473870762554461674841623076501341477084318792110624423283610948627697772395662746329206056210266975821093875870239401934123066690637191790327090291595067248967533200784706397544202070440488806825607916659163953805033205530899551496221506129549542556866837853127119809134360611350153589
# c = 10602368727908312334676265892975307612231309319511015017178654564186172749979627738052483995870388025140270600159107954524376993980949045647370337520644299969292550299798129717198074042121264370311983929042594290226321121639097714569204574387632530578153623781118813035223106106430716561113649761388347227207862016222328885951443891878767280730866193302995220736592745950808566359750940949520997722511969961743175777398751576595421456387998438214806188903746057855596476380404784738717555105866919649086601807350830108805521710188675565963765427930594177874353694184805979235854934856122125278853834603734029710968348
# gift = 143003048136494625720615623612005913472507924053937690079082986485649969355472743235179770036996193641198750946508667945561623931811236977039763581123681134310890547763107653222776992418543178066390387385209825190685606728024120446212807710589806258669458993047631033905702244902809204039169931629358263456702579067559691338668237882496453568585374905432631312417129535623987837367199215661733043851565981435234933986864857569158677737153423060041120732727135186371678287680926662892691327401787213342106281956461499522723795617869239148528294553548775690229067500104867437905746412645684721821428282431567702986879179533855920546700706123995719114359958306882907020982377260255340490340263938995699635287224549324332962230238510191824829224191551900441011605052418697617085549543103391184965537110312684637038510114533398510307173011690076219892318860903556489256383303693074652155424333388152193775840529985682153395008472897617946636734810609200156268438329402662168752285341847607694230848883249991722691539384542468611397615969487669898094687344847452861774236267516878551680397732564006255256825307533960791695267034807439791627895625581061889926276814228469856614838307012696777026973517086921078389474757196549594972814371353

这是利用next_prime脚本去做题

找到脚本:

from Crypto.Util.number import long_to_bytes
from gmpy2 import gmpy2

n = 11958388191411693159737723233868177200642855312771636589272066925180521736238782088222469544720240237292008558651656242716943228927612911153093905350043065811853776453271082678856297734699816670221066298151571078839575715976634390967727901295936522621706645886864683564184184197808626753747618171580292981571324190267014128877345111473870762554461674841623076501341477084318792110624423283610948627697772395662746329206056210266975821093875870239401934123066690637191790327090291595067248967533200784706397544202070440488806825607916659163953805033205530899551496221506129549542556866837853127119809134360611350153589
n1 = 143003048136494625720615623612005913472507924053937690079082986485649969355472743235179770036996193641198750946508667945561623931811236977039763581123681134310890547763107653222776992418543178066390387385209825190685606728024120446212807710589806258669458993047631033905702244902809204039169931629358263456702579067559691338668237882496453568585374905432631312417129535623987837367199215661733043851565981435234933986864857569158677737153423060041120732727135186371678287680926662892691327401787213342106281956461499522723795617869239148528294553548775690229067500104867437905746412645684721821428282431567702986879179533855920546700706123995719114359958306882907020982377260255340490340263938995699635287224549324332962230238510191824829224191551900441011605052418697617085549543103391184965537110312684637038510114533398510307173011690076219892318860903556489256383303693074652155424333388152193775840529985682153395008472897617946636734810609200156268438329402662168752285341847607694230848883249991722691539384542468611397615969487669898094687344847452861774236267516878551680397732564006255256825307533960791695267034807439791627895625581061889926276814228469856614838307012696777026973517086921078389474757196549594972814371353

c1 = 10602368727908312334676265892975307612231309319511015017178654564186172749979627738052483995870388025140270600159107954524376993980949045647370337520644299969292550299798129717198074042121264370311983929042594290226321121639097714569204574387632530578153623781118813035223106106430716561113649761388347227207862016222328885951443891878767280730866193302995220736592745950808566359750940949520997722511969961743175777398751576595421456387998438214806188903746057855596476380404784738717555105866919649086601807350830108805521710188675565963765427930594177874353694184805979235854934856122125278853834603734029710968348

e=65537
def factor(n):
list = []
a = gmpy2.iroot(n, 2)[0]
while 1:
B2 = pow(a, 2) - n
if gmpy2.is_square(B2):
b = gmpy2.iroot(B2, 2)[0]
pq = a - b
p1q1 = a + b
list.append([pq, p1q1])
print(pq)
print(p1q1)
if len(list) == 2:
break
a += 1 # 注意这个a的位置,别放错了,你要放到前面就错了,不信试试
return list


list = factor(n1)

'''两组解'''
X1, Y1 = list[0]
X2, Y2 = list[1]
'''求公约数'''
p = gmpy2.gcd(X1, X2)
q = gmpy2.gcd(Y1, Y2)
'''求另一个数字'''
p1 = X2 // p
q1 = Y2 // q

'''RSA解密'''
f = (p - 1) * (q - 1) * (p1 - 1) * (q1 - 1)
print(long_to_bytes(pow(c1, gmpy2.invert(e, f), n)))

最后得到flag

Math Cocktail

题目描述:

from secret import key
x = key
M = 94665789456132156456789461321289656332321
n = 123456789123456789
k = x + pow(x,-1,M)
result = pow(x,n,M) + pow(x,-n,M)
print("k = " + str(k))
flag = "SICTF{"+str(result)+"}"
#k = 15396893775857205606087136852231851457937

很明显这是一个数学计算的过程

然后就是写出算法

然后我们先用这个脚本跑出两个x

from sympy import mod_inverse, sqrt_mod


def solve_quadratic_mod(k, M):
# 计算判别式
discriminant = (k ** 2 - 4) % M

# 计算判别式的平方根
try:
sqrt_d = sqrt_mod(discriminant, M)
except ValueError:
return None # 如果没有平方根,则无解

# 计算两个可能的解
x1 = (k + sqrt_d) * mod_inverse(2, M) % M
x2 = (k - sqrt_d) * mod_inverse(2, M) % M

return x1, x2


k = 15396893775857205606087136852231851457937
M = 94665789456132156456789461321289656332321

solutions = solve_quadratic_mod(k, M)
if solutions:
x1, x2 = solutions
print("x1 =", x1)
print("x2 =", x2)
else:
print("No solution found")

然后再用这个脚本跑出来flag

import sympy as sp
import math

k = 15396893775857205606087136852231851457937
M = 94665789456132156456789461321289656332321
n = 123456789123456789

# 定义符号变量
x = sp.symbols('x')

# 定义二次方程
equation = x**2 - k*x + 1

# 求解方程
solutions = sp.solve(equation, x)

# 打印所有解
for sol in solutions:
print(f"x = {sol}")

# 存储所有有效解
valid_solutions = []

# 选择所有合理的解
for sol in solutions:
sol_int = int(sol)
if math.gcd(sol_int, M) == 1:
valid_solutions.append(sol_int)

if not valid_solutions:
print("No valid solution found where gcd(x, M) == 1")
else:
# 尝试每个有效解
for x_val in valid_solutions:
try:
# 计算 result
result = pow(x_val, n, M) + pow(x_val, -n, M)
# 构建 flag
flag = f"SICTF{{{result}}}"
print(f"Trying x = {x_val}: flag = {flag}")
except ValueError:
print(f"Base {x_val} is not invertible for the given modulus {M}")
x = 15396328878644889959355013429096204634814
result = pow(x,n,M) + pow(x,-n,M)
flag = f"SICTF{{{result}}}"
print(f"Trying x = {x}: flag = {flag}")

x1 = 15396328878644889959355013429096204634814
x2 = 564897212315646732123423135646823123

两个flag都试一下,第二个是对的

Smooth

题目描述:

from random import choice
from Crypto.Util.number import isPrime, sieve_base
from select import flag

def getT1ngPrime(bits):
while True:
n = 2
while n.bit_length() < bits:
n *= choice(sieve_base)
if isPrime(n + 1):
return n + 1

e = 0x10001
p = getT1ngPrime(2048)
q = getT1ngPrime(2048)
n = p * q
c = pow(flag, e, n)
print("n =",n)
print("c =",c)

# n = 11353462911659482113796537452147300926058319193410149519981293344545095869273822230953023429933867057788424748612924709948861133348747189832397098293375764081790597820832766019459982124608221261607650511397189714784056313299551817534654742174637343804047231232241364089289257964139944018168155573510980260130960125621306919129390727418251555408239157881843225479158237727969284756513805560836003067115936987292751142016846824024901372913577548599978847860303760659677939193351221798796221804998385095596961591093782162020167439948314063423204757741472210008357888290333170757522814768955797167174930629344666183821709125207308525214263797625499327774875517941662523738827284067304929843343871569023248931759251331056863803201916908875256305736551124386988450879913404808869417817363510363373493093139804372817316366990863872781848240937733101758906281563575413208242901819275013539759479445299894840593737457394207415306989963459347994339058584475533786264375696277942369426844216474662828121334192775480587740071776080691560820922589751966526187341539255661442517814436944781114380877453502120302247547983180059537220197840688418898830571100216529994749464486853212098379822895838120836692532849021875818941979891105837972315129986493
# c = 4598142980961588614870523368474306387497434303187254927457676265871592231881441246092917258758503624096206624791819316260705668875764048374035213672138915662719877795747211803584360349151646264274341548770123417923229997374982757324397146348908248704115062655445309042278469908831635522908894918382861563762003781223067210316435231509359575745828484177064520417698784251000631935361105284031848497200100561554984257265297077176545082009710252149167922123535451717313588884862304552508619154651546264753192894485610685402565486840707709012364088270364787452130288293053818329408433642977483320525542674345001200312959241276966417288770125166249156122793451000156544563900072606708005901579238109781720805374132101363788622676000360345128868422751829657184702090198806325558601552728909032627597688702884484377994243047876011323705947461799669488497113582621976154428096812072612119422667669321557427061098391558516935530727451865151957035156100271891977310043273298085691419672779758845492888551759393825925266903887942750052210444677062600227218953570162640164207895883301679126000642791876167281967081725589618329012476305157314322062703122134504285038691938912783524944917966615556902938825590064899700174139252191278691620663355243

很明显的费马攻击:

然后就是利用脚本:

from Crypto.Util.number import isPrime, sieve_base as primes, long_to_bytes
import gmpy2

e = 65537
n = 11353462911659482113796537452147300926058319193410149519981293344545095869273822230953023429933867057788424748612924709948861133348747189832397098293375764081790597820832766019459982124608221261607650511397189714784056313299551817534654742174637343804047231232241364089289257964139944018168155573510980260130960125621306919129390727418251555408239157881843225479158237727969284756513805560836003067115936987292751142016846824024901372913577548599978847860303760659677939193351221798796221804998385095596961591093782162020167439948314063423204757741472210008357888290333170757522814768955797167174930629344666183821709125207308525214263797625499327774875517941662523738827284067304929843343871569023248931759251331056863803201916908875256305736551124386988450879913404808869417817363510363373493093139804372817316366990863872781848240937733101758906281563575413208242901819275013539759479445299894840593737457394207415306989963459347994339058584475533786264375696277942369426844216474662828121334192775480587740071776080691560820922589751966526187341539255661442517814436944781114380877453502120302247547983180059537220197840688418898830571100216529994749464486853212098379822895838120836692532849021875818941979891105837972315129986493
c = 4598142980961588614870523368474306387497434303187254927457676265871592231881441246092917258758503624096206624791819316260705668875764048374035213672138915662719877795747211803584360349151646264274341548770123417923229997374982757324397146348908248704115062655445309042278469908831635522908894918382861563762003781223067210316435231509359575745828484177064520417698784251000631935361105284031848497200100561554984257265297077176545082009710252149167922123535451717313588884862304552508619154651546264753192894485610685402565486840707709012364088270364787452130288293053818329408433642977483320525542674345001200312959241276966417288770125166249156122793451000156544563900072606708005901579238109781720805374132101363788622676000360345128868422751829657184702090198806325558601552728909032627597688702884484377994243047876011323705947461799669488497113582621976154428096812072612119422667669321557427061098391558516935530727451865151957035156100271891977310043273298085691419672779758845492888551759393825925266903887942750052210444677062600227218953570162640164207895883301679126000642791876167281967081725589618329012476305157314322062703122134504285038691938912783524944917966615556902938825590064899700174139252191278691620663355243
num = 1
for i in primes:
num *= i
p = gmpy2.gcd(gmpy2.powmod(2, num, n) - 1, n)
q = n // p
d = gmpy2.invert(e, (p - 1) * (q - 1))
m = gmpy2.powmod(c, d, n)

print(long_to_bytes(m))


得到flag

Web

Upload

只能上传图片的文件上传,然后就是上传一个图片马,

然后抓包,修改后缀,发送

蚁剑连接即可找到flag(懒得搞图片了)

posted @   m0yu  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示