SICTF-2024

m0yu發表於2024-11-03

SICTF-2024

MISC

簽到

關注 林楓雲 微信公眾號, 傳送 SICTF Round4

SICTF-2024

派森

下載得到了個檔案,然後字尾改成py

然後開啟

SICTF-2024

然後讓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)

然後執行

SICTF-2024

將這些字串十進位制轉ascii得到flag

SICTF-2024

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

SICTF-2024

模型的秘密(看了wp)

開啟後,給了一個字典,然後用這個字典去爆破壓縮包

SICTF-2024

得到密碼

然後解壓縮得到一個字尾為blend的檔案

這裡要用到blender進行開啟(直接官網下載即可)

開啟後就只有一個正方體,然後什麼也找不到

之後看了wp,發現需要在010中補一個檔案頭BLEND

SICTF-2024

最後儲存再用blender開啟

SICTF-2024

得到flag

SICTF{fLAG1nTheM8deL}

Crypto

SignBase

base64解碼

SICTF-2024

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

SICTF-2024

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

很明顯這是一個數學計算的過程

SICTF-2024

然後就是寫出演算法

然後我們先用這個指令碼跑出兩個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都試一下,第二個是對的

SICTF-2024

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

SICTF-2024

Web

Upload

只能上傳圖片的檔案上傳,然後就是上傳一個圖片馬,

然後抓包,修改字尾,傳送

蟻劍連線即可找到flag(懶得搞圖片了)