標題:2022年川渝網絡與信息安全職業技能競賽-個人初賽writeup

taibeihacker

Moderator

1.Web​

1-1:题目名称:目录扫描​

1049983-20220914153423513-1246802504.jpg

1049983-20220914153424208-1898347562.jpg

1049983-20220914153424981-1905335670.jpg

Flag:
DASCTF{84a70245035ca88088a2ba6ae2378021}

1-3:题目名称:MissingData​

主要就是開頭ob_start();所以所有輸出都會存到緩衝區,用戶手動取輸出
所以文件名$this-LOG_NAME由hello獲得:
$hello=$_GET['hello'];
echo $hello;
$this-LOG_NAME=base64_decode(ob_get_contents());//就把hello傳過來的值存到LOG_NAME了
ob_clean();
文件內容就是REMOTE_ADDR連接UA:
$getlog-setIp($_SERVER['REMOTE_ADDR']);
$getlog-setUserAgent($_SERVER['HTTP_USER_AGENT']);
$getlog-echoLog();
$log_info=date('Y-m-d H:i:s ').ob_get_contents();
最末尾析構函數會寫日誌
public $LOG_PATH='/log/';
file_put_contents(dirname(__FILE__).$this-LOG_PATH.$this-LOG_NAME,$log_info);
//路徑也就是./log/$_GET['hello']
//文件內容用UA寫個一句話就OK
把輸出都先丟緩衝區然後存文件裡了,文件名由hello控制,文件內容ua寫個一句話就行了
1049983-20220914153425682-940110017.jpg

1049983-20220914153426252-71252019.jpg

1049983-20220914153426932-450723456.jpg

2.MISC​

2-3-题目名称:0101​

1049983-20220914153427482-1717660526.jpg

1049983-20220914153428263-700708093.jpg

發現是pk開頭,是zip壓縮包,改成a.zip
使用以下腳本進行得到flag:
importzipfilez=zipfile.ZipFile('./a.zip')foriinz.filelist:print(i)s=''foriinrange(304):x=z.getinfo(f'file/{i}.png')ifx.file_size500:s +='0'else:s +='1'# print(s)print(int.to_bytes(int(s, 2), 304//8, 'big'))
flag: DASCTF{Jo2YAKT_IcRgmzZ3GWe_Swt8vqadQO}

3.CRYPTO​

3-1题目名称:soeasy_rsa​

from gmpy2 import *
from Crypto.Util.number import *
a=23804021940078676408342301332036892900004728136480076479530219752065125327318821647722459216095770264965388973551323635311313178838670860487788476788686 75605015726472177258684459630640657685787850703752943907052651392339497467843371766418025796562413303338351121513907686789154886620715851548718281365666809 18705880026385182452525907860039143933728304943908336579405685696188421049700292603636950535727494958939999452204939356373348680294604482825148431031457951 02173534495304156971490358608124680851055950154432367509652612855903019752959349069234185596982394068554146096092741880878895682860091022727772496856721290
p=iroot(a,2)
print(p)
p=154285520837435281376516898144008792793020984180192603663692347665042795645086703863131549256869630446819852185017005249707039620525550780754809067914632 509810226131750340822324265288338519653179637243674514007442185191001273565127093303845334544550007384054303733880561987508919843229875482519439615469904551
print(is_prime(p))
c1=
7594921197064526047784080923079517059827539466365558544650204974415163497780626659206443793638988828064232907316737135802139126460602808272827494458434164732495785719505318822019624456 1623697425292916511744852569537275299008074069250282222480373555169325242455879869868679935977005580843853804599341730525546675515324718058489296906319060874296111833437083796029771812
c2=
7790794115537684904681802058459484694238629357195344841076036402396281850683883752141225275364793691306498214165236283168007755426855217606310895436062009501916078505874057507774454461 6439692739387312706279917959252426192939648962492950940347253817951644007140862267776520611944302335981903665518644840891111449931544355548130487697653008605945892957382219567188182572
q=iroot(a-(p**2),2)
print(q)
q=888347358062191513488156436138991579826598872460149267394117
n=p*q
for e in range(2**16):
try:
d=invert(e,(p-1)*(q-1))
m=pow(c1,d,n)
m=long_to_bytes(m)
if b'DASCTF' in m:
print(e)
print(m)
except:pass
1049983-20220914153428930-1347021789.jpg

3-2题目名称:middlersa1​

dp低位洩露,直接sagemath還原dp
fromtqdmimport*secret=1642122247947767590084047512154856959705749371720710428047250478126321193705946117104552307567185209952017e=0x10001n=53290208062987048378703574235428685467319210471478014757229530639473548433668122104609082311237893278140109351209752453324855439700478949142631006593125874 482133364050198292529339327668306943207846561273907830779959709641714284066463679953568692820076085446240980505949826504849495848235048490118010959579651F.x=PolynomialRing(Zmod(n))d=inverse_mod(e, n)forkintrange(1, e):
f=(2^350*x+secret ) + (k-1) *d
f=f.monic()
x0=f.small_roots(X=2** (160+1), beta=0.44, epsilon=1/32)
iflen(x0) !=0:
dp=x0[0]*2^350+secret
foriinrange(2, e):
p=(e*Integer(dp) -1+i) //i
ifn%p==0:
break
ifp0:
continue
else:
print('p=',p)
print('dp=',dp)
break
charon@root:~/Desktop$sage3.sage
3%|█▏ |2131/65536 [04:202:15:43, 7.79it/s]('p=', 7285247160124204278422137084033487832078298767596529079060207472774245581946206647731149570480079821873425695996881346401317790559430521087133338233749429)
('dp=', 236998137622790233327677438136615897248743961007000625548260712756987527361785137753678241058692497066300617725336085425448365495410315866728234083256081)
3%|█▏ |2131/65536 [04:202:09:08, 8.18it/s]
fromCrypto.Util.numberimport*fromgmpy2import*p=7285247160124204278422137084033487832078298767596529079060207472774245581946206647731149570480079821873425695996881346401317790559430521087133338233749429n=532902080629 87048378703574235428685467319210471478014757229530639473548433668122104609082311237893278140109351209752453324855439700478949142631006593125874482133364050198292529339327668306943207846561273907830779959709641714284 066463679953568692820076085446240980505949826504849495848235048490118010959579651c=121645839012282267235698318035557474254197947143312075093479977955202068661738134785587472593190243766519680088385628562659669034718 03669392265118265704723742518812401306445616633449971845569756343283456918105040589961351125414282181230864299705837250020888494290318050869813023592249838047791552928679622761print(is_prime(p))print(gcd(n,p))q=n//pe=0x10001d=invert(e,(p-1)*(q-1))m=pow(c,d,n)print(long_to_bytes(m))
1049983-20220914153429667-1675732465.jpg

DASCTF{6f05154b11bdf950cd2444176618139a}

3-3 题目名称:middlersa3​

白給,直接源碼中給了flag
fromCrypto.Util.numberimport*FLAG=b'DASCTF{ed3256281d277e12d926b0e8b49f6d78}'p=getPrime(512)q=getPrime(512)e=0x10001d=inverse(e, (p-1)*(q-1))dp=d% (p-1)print('dp:', (dp(2**(512-50)-1))50)print('N:', p*q)print('c:', pow(bytes_to_long(FLAG), e, p*q))'''dp: 2128058695275696512876004752540135766587344290422001997701794179770820634047195468195463118189149674857434252592319139131895N: 6275040413237878235178265456354374763019744989404177645139779005037415862760250961966644447467228603553808644751425715077392985705893045517319192895945366689 5924318267595065857666587937426343157432947610821599765514871454429345275531144349280502167596016574278216643741963132363234498658461551550399794413383c: 55337446119274361069965649785140747071935055092480249085789478526259932536136231609682528797724708750732847686561672780887952659134484499521434824018747099 238582445758002389884725560169750050917959735297922450030075064765749276015138482194721673506034988635977907296576683118011031333035476989567847885710256'''
DASCTF{ed3256281d277e12d926b0e8b49f6d78}

4.RE​

4-1题目名称:simpleDispy​

pydis閱讀題, 手動還原pydis驗證算法.
arr=[47378,
29475,
46200,
39869,
67243,
68695,
73129,
27171,
53832,
30653,
60541,
67276,
58816,
63571,
50131,
34471,
67922,
82293,
33259,
67538,
57810,
50339,
34632,
68754,
83192,
36077,
60424,
54547,
56308,
33565,
69425,
84024]# 驗證
k=22643
flag='t'*32
for i in range(32):
num=(ord(flag)*255)+k
if arr !=num:
print('Error')
break
k=(k+num)0xFFFF# 還原flag
k=22643
flag=''
for i in range(32):
flag +=chr(((arr - k)//255))
k=(k+arr)0xFFFF
print(flag)
1049983-20220914153430356-820348971.jpg

flag:
ab0c216ec63a9f984cbf8975ad63e09c

4-2题目名称:stripgo​

v1=encoding_base64_NewEncoding((__int64)'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbn/+m1234567890', 64LL);if ( v4==32runtime_memequal(v3, (__int64)'K/WyqBFyrUisB1Pse2KyDVYxM2CfMJ==', 32LL) )
變表base64
 
返回
上方