Misc

模型的秘密

使用字典爆破压缩包密码

搜索blend找到与3D文件格式有关的blender

发现题目附件中文件头被更改,修改之后使用blender打开查看flag

image.png

派森

根据音译,文件为py文件,修改后缀后发现代码也被音译,还原大致代码

1
2
3
4
5
6
from  import xor
from import *
flag = "************"
int = []
for i in range(0,len(),4):
int.append(xor(ord(flag[i]),ord(flag[i+2])))

差不多就是将flag每四个分为一组,第一位与第三位进行异或,第二位和第四位异或,密文中含有第三位和第四位。异或即可得到flag的原文。

签到

关注公众号即可

Crypto

SignBase

base64即可

Smooth

根据代码,n首先是小素数的乘积,之后+1,所以p-1是光滑的,使用smooth攻击

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from  Crypto.Util.number import *
N = 11353462911659482113796537452147300926058319193410149519981293344545095869273822230953023429933867057788424748612924709948861133348747189832397098293375764081790597820832766019459982124608221261607650511397189714784056313299551817534654742174637343804047231232241364089289257964139944018168155573510980260130960125621306919129390727418251555408239157881843225479158237727969284756513805560836003067115936987292751142016846824024901372913577548599978847860303760659677939193351221798796221804998385095596961591093782162020167439948314063423204757741472210008357888290333170757522814768955797167174930629344666183821709125207308525214263797625499327774875517941662523738827284067304929843343871569023248931759251331056863803201916908875256305736551124386988450879913404808869417817363510363373493093139804372817316366990863872781848240937733101758906281563575413208242901819275013539759479445299894840593737457394207415306989963459347994339058584475533786264375696277942369426844216474662828121334192775480587740071776080691560820922589751966526187341539255661442517814436944781114380877453502120302247547983180059537220197840688418898830571100216529994749464486853212098379822895838120836692532849021875818941979891105837972315129986493
c = 4598142980961588614870523368474306387497434303187254927457676265871592231881441246092917258758503624096206624791819316260705668875764048374035213672138915662719877795747211803584360349151646264274341548770123417923229997374982757324397146348908248704115062655445309042278469908831635522908894918382861563762003781223067210316435231509359575745828484177064520417698784251000631935361105284031848497200100561554984257265297077176545082009710252149167922123535451717313588884862304552508619154651546264753192894485610685402565486840707709012364088270364787452130288293053818329408433642977483320525542674345001200312959241276966417288770125166249156122793451000156544563900072606708005901579238109781720805374132101363788622676000360345128868422751829657184702090198806325558601552728909032627597688702884484377994243047876011323705947461799669488497113582621976154428096812072612119422667669321557427061098391558516935530727451865151957035156100271891977310043273298085691419672779758845492888551759393825925266903887942750052210444677062600227218953570162640164207895883301679126000642791876167281967081725589618329012476305157314322062703122134504285038691938912783524944917966615556902938825590064899700174139252191278691620663355243
e = 65537
import gmpy2
a = 2
n = 2
while True:
a = pow(a, n, N)
res = gmpy2.gcd(a-1, N)
if res != 1 and res != N:
q = N // res
print("n=",n)
print("p=",res)
print("q=",q)
break
n += 1

d=gmpy2.invert(e,(res-1)*(q-1))
m=pow(c,d,N)
print(long_to_bytes(m))

next_prime

给了next_prime,直接使用费马分解拿到p,q

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import math
from Crypto.Util.number import *
import gmpy2
from Cryptodome.Util.number import *
from gmpy2 import *
n = 11958388191411693159737723233868177200642855312771636589272066925180521736238782088222469544720240237292008558651656242716943228927612911153093905350043065811853776453271082678856297734699816670221066298151571078839575715976634390967727901295936522621706645886864683564184184197808626753747618171580292981571324190267014128877345111473870762554461674841623076501341477084318792110624423283610948627697772395662746329206056210266975821093875870239401934123066690637191790327090291595067248967533200784706397544202070440488806825607916659163953805033205530899551496221506129549542556866837853127119809134360611350153589
c = 10602368727908312334676265892975307612231309319511015017178654564186172749979627738052483995870388025140270600159107954524376993980949045647370337520644299969292550299798129717198074042121264370311983929042594290226321121639097714569204574387632530578153623781118813035223106106430716561113649761388347227207862016222328885951443891878767280730866193302995220736592745950808566359750940949520997722511969961743175777398751576595421456387998438214806188903746057855596476380404784738717555105866919649086601807350830108805521710188675565963765427930594177874353694184805979235854934856122125278853834603734029710968348
gift = 143003048136494625720615623612005913472507924053937690079082986485649969355472743235179770036996193641198750946508667945561623931811236977039763581123681134310890547763107653222776992418543178066390387385209825190685606728024120446212807710589806258669458993047631033905702244902809204039169931629358263456702579067559691338668237882496453568585374905432631312417129535623987837367199215661733043851565981435234933986864857569158677737153423060041120732727135186371678287680926662892691327401787213342106281956461499522723795617869239148528294553548775690229067500104867437905746412645684721821428282431567702986879179533855920546700706123995719114359958306882907020982377260255340490340263938995699635287224549324332962230238510191824829224191551900441011605052418697617085549543103391184965537110312684637038510114533398510307173011690076219892318860903556489256383303693074652155424333388152193775840529985682153395008472897617946636734810609200156268438329402662168752285341847607694230848883249991722691539384542468611397615969487669898094687344847452861774236267516878551680397732564006255256825307533960791695267034807439791627895625581061889926276814228469856614838307012696777026973517086921078389474757196549594972814371353
e = 65537

def fermat_factorization(n):
factor_list = []
get_context().precision = 2048
x = int(math.isqrt(n))

while True:
x += 1
y2 = x ** 2 - n
if is_square(y2):
y2 = mpz(y2)
get_context().precision = 2048
y = int(sqrt(y2))
factor_list.append([x+y, x-y])
if len(factor_list) == 2:
break
return factor_list

def main():
factor_list = fermat_factorization(gift)
#print(factor_list)
[X1, Y1] = factor_list[0]
[X2, Y2] = factor_list[1]
p1 = gcd(X1, X2)
q1 = X1 // p1
p2 = gcd(Y1, Y2)
q2 = Y1 // p2
print('p1 =',p1)
print('p2 =',p2)
print('q1 =',q1)
print('q2 =',q2)

phi = (p1 - 1) * (q1 - 1) * (p2 - 1) * (q2 - 1)
d = inverse(e, phi)
flag = long_to_bytes(pow(c, d, n))
print(flag)

if __name__ == "__main__":
main()

Web

Sighin

进入靶机后查看robots.txt文件,提示访问/wh3re_1s_thi5_fl4g.php,访问后发现对php代码进行了混淆,

恢复原始代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
s = "wKq=1MDcLg6yYsrnRYivbO7JoWQ9rBhCZuo4DlZOS7_I5+t=UKzp0hdV1FNL2EFd/nxam3cTbPARsw+8Eky5XUpfH0MeTQ3JXtkGf9qj_4NmlHi/SeIVaCAgxGj26vW8PBzu"

a = s[72]+s[116]+s[76]+s[113]+s[124]+s[35]+s[104]+s[63]+s[91]+s[70]+s[24]+s[63]+s[113]
b = s[38]+s[123]+s[115]+s[89]+s[96]+s[60]+s[75]+s[108]+s[32]+s[107]+s[37]+s[131]+s[38]+s[25]+s[75]+s[100]+s[63]+s[68]+s[57]+s[11]+s[70]+s[77]+s[3]+s[3]
c = s[96]+s[89]+s[63]+s[62]+s[115]+s[74]+s[47]+s[47]
e = payload = s[115]+s[65]+s[86]+s[39]+s[70]+s[4]+s[108]+s[124]+s[26]+s[65]+s[16]+s[116]+s[115]+s[103]+s[98]+s[77]+s[92]+s[48]+s[12]+s[44]+s[115]+s[62]+s[58]+s[55]+s[92]+s[37]+s[55]+s[40]+s[116]+s[71]+s[16]+s[83]+s[92]+s[48]+s[75]+s[23]+s[5]+s[74]+s[47]+s[47]
h = s[17]+s[130]+s[106]+s[76]+s[113]+s[68]+s[75]+s[109]+s[55]+s[65]+s[26]+s[47]

print(a,b,c,e,h)
"""
$f = base64_decode("Z2V0X2RlZmluZWRfdmFycw==") = get_defined_vars();
$g = W3lc0me_t0_SICTF.2024
$i = system
system( get_defined_vars()[_GET][W3lc0me_t0_SICTF.2024])
"""

可见关键代码为system( get_defined_vars()[_GET][W3lc0me_t0_SICTF.2024])也就是get传参执行命令

但是get传进去的变量名中包含非法字符,根据搜索,可以通过转化错误,当参数中有中括号时,[被转化成_,且之后的非法字符不会被不会被转化为下划线,所以构建payload:[http://27.25.151.29:34141//wh3re_1s_thi5_fl4g.php?W3lc0me[t0_SICTF.2024=cat%20/flag]

image.png

Upl0ad

文件上传题目,ctrl u 查看源代码后发现对于文件类型的转换在前端,只有要禁用js后即可上传木马文件

Reverse

Exc??

查看表格后发现需要将flag的ascii码套入公式后等于所给的值,直接爆破即可

1
2
3
4
5
6
7
8
9
a = [3976,5728,5640,4232,5272,3776,6464	,6136,5408]
b = [876,1147,1182,824,1082,866,1361,1278,1087]
c = [16511,24822,26991,11999,21215,16374,37800,32739,21505]
for index in range(9):
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
if (i << 3) + (j << 4) + (k << 5) == a[index] and i*3+j*4+k*5 == b[index] and i*j+j*k+k*i == c[index]:
print(chr(i)+chr(j)+chr(k),end="")