一、队伍信息
队伍名称:PKyou!
队员信息:G3rling,Dreammm,ranfey
二、解题步骤
S | Stuck | 题目做到一半思路卡壳 |
---|---|---|
F | Finished | 完成该题 |
1 | First Blood | 获得一血 |
2 | Second Blood | 获得二血 |
3 | Third Blood | 获得三血 |
Misc
第一周
F | 签到 |
扫描二维码关注公众号,发送“XYCTF2024,启动启动启动!!!”得到flag
XYCTF{WELCOME_TO_XYCTF}
这题听说当时附件出问题了没有二维码,但是dk盾给我推送信息了,被迫上课打了一题……
F | game |
一张游戏内的截图,Google识图找到Wiki
得到flag
XYCTF{Papers Please}
F | zzl的护理小课堂 |
打开靶机是一套问卷,一开始老老实实答题结果100分了给我来了句杂鱼。
F12看源代码
分析发现是从getscore.php文件中获取分数来进行分支,在分支之前打断点更改getscore中的值。
将值改成大于100,得到flag
XYCTF{2zI_t3LI_y0u_6ff93ca596fe}
F | ez_隐写 |
得到一个带密码的压缩包,用7zip解压成功说明是伪加密。
hint.png
得到压缩包密码
20240401
解压得到WATERMARK.jpg
根据名称可以知道应该是某种盲水印,这里放出效果最好的一张
眼睛不好看的不是很清晰,根据轮廓试出flag
XYCTF{159-WSX-IJN-852}
F | 熊博士 |
图片是没有用的,小纸条.txt得到密文
CBXGU{ORF_BV_NVR_BLF_CRZL_QQ}
根据flag头为XYCTF我们可以推测,发现这是一个24英文字母的倒序,手搓一个对照表
A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z
Z、Y、X、W、V、U、T、S、R、Q、P、O、N、M、L、K、J、I、H、G、F、E、D、C、B、A
得到flag(看了liu✌那个九转大肠,觉得这句话说的真好!)
XYCTF{liu_ye_mei_you_xiao_jj}
F | ZIP神之套 |
解压得到一个加密的压缩包和exe文件,先从exe文件入手。
得到一串掩码,进行掩码爆破得到压缩包密码(这个密码另外题还会用到)
xyctf20240401ftcyx
解压得到两个压缩包,大部分是相同文件,进行明文爆破
这里要注意的是明文爆破先是找到压缩包的key,再通过key去爆破密码,但是在找到key的时候就已经可以停止了
得到无加密的flag.zip,解压得到flag.md
得到flag
XYCTF{1A4B8-C9D2F3E-6A4B8C-9D2F3E7F}
F | 彩蛋? |
根据题目hint有三段flag
在比赛须知的第六条我们可以得到第一段flag
XYCTF{this_a_
页尾得到第三段flag
这里有56位,在8进制失败后,尝试7进制解码
find_it}
第二段在近期比赛的图中(这个是晚上做梦的时候梦见在通道里,一看网页只有这里有图片)
将图片下载,一把梭通道得到有用信息
根据提示是某种键盘密码,进行键盘密码解码,最后德沃夏克键盘Dvorak解码得到第二段flag
bl0ckbuster_for_png_and_i_think_yon_can_
综上所述
XYCTF{this_a_bl0ckbuster_for_png_and_i_think_yon_can_find_it}
F | TCPL |
将附件在010中打开,搜索有用信息发现是缺少相关库
百度搜索得到解决方案
sudo apt install libc6-riscv64-cross
sudo apt install binutils-riscv64-linux-gnu
sudo apt install gcc-riscv64-linux-gnu
sudo apt install binutils-riscv64-unknown-elf
sudo apt install gcc-riscv64-unknown-elf
sudo apt install qemu-system-misc
sudo apt install qemu-user
sudo cp /usr/riscv64-linux-gnu/lib/* /lib/
运行得到flag(将1替换成0)
FLAG{PLCT_An4_r0SCv_x0huann0}
F | 网络追踪 |
在流量包尾追踪TCP得到一串字符
解码发现是XXencode。但是一开始在随波逐流一把梭中文解码错误,后面在线解码才得到完整题目表述
开始流量包的分析,首先我们先寻找靶机ip地址,浏览发现192.168.204.131对192.168.204.133存在写入操作,确定靶机为192.168.204.133。并且可以分析出此漏洞与SMB相关
接着我们寻找nmap扫描出的靶机开放的端口
在此之前我们需要了解扫描端口开放以及关闭所返回报文的差异:
若攻击方(192.168.204.131)发起SYN
包;目标返回RST ACK
结束会话。则代表端口处于关闭状态。
若攻击方发起SYN
包;目标返回SYN ACK
;攻击方发起ACK
并发起RST ACK
结束会话。则端口处于开启状态。
将数据包进行过滤
发现三个端口开启445 139 135
搜索与SMB相关的漏洞,得到漏洞CVE编号为CVE-2008-4250
综上所述
XYCTF{192.168.204.133_445_139_135_CVE-2008-4250}
F4 | 疯狂大杂烩!九转功成 |
根据提示应该对压缩包进行爆破,但这里猜了一下就猜出来了压缩包密码(因为之前用过好几次了)
XYCTF20240401
解压后得到九个压缩包和一个背景故事,大致说是要解开九层(感受到了Musc的威力)
第一层
曰:玉魔命灵天观罗炁观神冥西道地真象茫华茫空吉清荡罗命色玉凶北莽人鬼乐量西北灵色净魂地魂莽玉凶阿人梵莽西量魄周界
初次分析应该是某种曰加密,经测试为天书曰解密。得到压缩包密码
First_layer_simple
解压得到一张png,打开提示CRC有误这里进行宽高爆破,得到flag1
XYCTF{T3e_c0mb1nation_
第二层
xihak-minoh-zusok-humak-zurok-gulyk-somul-nenel-dalek-nusyh-zumek-sysuk-zelil-fepak-tysok-senax
随波逐流一把梭得到压缩包密码
The_second_layer_is_also_simple
解压得到一张png,拖入随波逐流发现RGB通道中有串base
ZmxhZzLvvJowZl9jcnlwdDBfYW5kXw==
再次一把梭得到flag2
flag2:0f_crypt0_and_
第三层
一开始以为是夏多密码,但是缺少方向。根据提示想到了begin的上岸,这里看端点发现只有三种类型,推测是摩斯密码,解码得到压缩包密码
THE_THIRD
解压后得到压缩包但无其他信息,爆破得到压缩包密码
123456
解压后txt中有一串base,一把梭得到flag3
flag3:misc_1s_re6lly_fun!!
第四层
都2024年了不会还有人解不出
U2FsdGVkX1+y2rlJZlJCMnvyDwHwzkgHvNsG2TF6sFlBlxBs0w4EmyXdDe6s7viL吧
分析应该是某种对称加密而key应该是2024,对称解密得到压缩密码
The_fourth_floor_is_okay
解压后得到一个txt和MSG0.db文件,先看txt文件。
wqk:1m813onn17o040358p772q37rm137qpnqppqpn38nr704m56n2m9q22po7r05r77
凯撒解密得到key
key:1a813cbb17c040358d772e37fa137edbeddedb38bf704a56b2a9e22dc7f05f77
经过搜索得知MSG0.db是微信数据库文件,但是加密文件无法用数据库工具查看,先进行解密
input_pass = '1a813cbb17c040358d772e37fa137edbeddedb38bf704a56b2a9e22dc7f05f77'
input_dir = r'C:/Users/Xia/Desktop'
import ctypes
import hashlib
import hmac
from pathlib import Path
from Crypto.Cipher import AES
SQLITE_FILE_HEADER = bytes('SQLite format 3', encoding='ASCII') + bytes(1)
IV_SIZE = 16
HMAC_SHA1_SIZE = 20
KEY_SIZE = 32
DEFAULT_PAGESIZE = 4096
DEFAULT_ITER = 64000
password = bytes.fromhex(input_pass.replace(' ',''))
def decode_one(input_file):
input_file = Path(input_file)
with open(input_file, 'rb') as (f):
blist = f.read()
print(len(blist))
salt = blist[:16]
key = hashlib.pbkdf2_hmac('sha1', password, salt, DEFAULT_ITER, KEY_SIZE)
first = blist[16:DEFAULT_PAGESIZE]
mac_salt = bytes([x ^ 58 for x in salt])
mac_key = hashlib.pbkdf2_hmac('sha1', key, mac_salt, 2, KEY_SIZE)
hash_mac = hmac.new(mac_key, digestmod='sha1')
hash_mac.update(first[:-32])
hash_mac.update(bytes(ctypes.c_int(1)))
if hash_mac.digest() == first[-32:-12]:
print('Decryption Success')
else:
print('Password Error')
blist = [
blist[i:i + DEFAULT_PAGESIZE]
for i in range(DEFAULT_PAGESIZE, len(blist), DEFAULT_PAGESIZE)
]
with open(input_file.parent / f'decoded_{input_file.name}', 'wb') as (f):
f.write(SQLITE_FILE_HEADER)
t = AES.new(key, AES.MODE_CBC, first[-48:-32])
f.write(t.decrypt(first[:-48]))
f.write(first[-48:])
for i in blist:
t = AES.new(key, AES.MODE_CBC, i[-48:-32])
f.write(t.decrypt(i[:-48]))
f.write(i[-48:])
if __name__ == '__main__':
input_dir = Path(input_dir)
for f in input_dir.glob('*.db'):
decode_one(f)
得到解密后的数据库文件,在查看工具中得到flag4
flag4:L1u_and_K1cky_Mu
第五层
enc = 'key{liu*****'
md5 = '87145027d8664fca1413e6a24ae2fbe7'
hash爆破得到压缩包密码
import hashlib
for a in range(32, 127): # 使用for循环逐个尝试所有的字母,chr(i)返回值是当前整数对应的 ASCII 字符。
for b in range(32, 127):
for c in range(32, 127):
for d in range(32, 127):
m = hashlib.md5() # 获取一个md5加密算法对象
m.update(str('key{liu' + chr(a) + chr(b) +chr(c) +chr(d) +'}').encode('utf-8')) # 指定需要加密的字符串
des = m.hexdigest() # 进行md5加密
if des == '87145027d8664fca1413e6a24ae2fbe7': # 如果得到的密文和我们预期的密文相同,输出
print('key{liu' + chr(a) + chr(b) +chr(c) +chr(d) +'}')
liuyyds
解压得到没有什么用的flag.txt和serpent.txt。serpent是某种加密,密钥是liuyyds。这里犯了个大错。都是先用的系统自带的记事本再进行处理,所以一直出不来零宽字符,错失三血很可惜……
解密后的数据如下
但需要注意的是需要先下载数据再用文本工具打开,而且不能使用系统自带记事本。
打开后得到文字和零宽字符
根据零宽字符类型进行解码得到flag5
flag5:_3re_so_sm4rt!
第六层
wszrdc 5 k
fgtrfvb 6 e
ghytgbn 6 e
rfctg 4 p
yhju 1 o
frtg 2 n
uyhbghj 7 f
6yhn 3 i
uyhjujmn 9 g
tgvvghb 8 h
yhnmghj 7 t
4rfv 3 i
derf 2 n
iujkikmn 9 g
这个有点抽象,通过整理字符走向可以知道部分位置的字符是一样的,一开始第一个以为是x后面发现前四个是keep,得到压缩包密码
keeponfighting
解压后得到一堆数字名字的文件和图片
初步猜测应该是图片隐写,ppt中的假flag证实了想法。一开始试过文件名,但是是从小到大的顺序,就开始找xls文件,甚至还发现了mu师傅的电话。后面尝试从大到小排steghide解密得到flag6
flag6:In_just_a_few_m1nutes_
第七层
密文:Tig+AF8-viakubq+AF8-vphrz+AF8-xi+AF8-uayzdyrjs
听说维吉尼亚key大残
因为是第七层,这里通过字数可以推测第一个AF8后的应该是seventh,假设在之前密钥未循环,则通过维吉尼亚表格进行推理
发现明文seven对应的key为DEFGHI,为一串连续的英文字符
那么我们可以猜测key为26英文字符,D为第四位,但是密文位数不能对应,在删掉AF8后刚好对应,进行解码得到压缩包密码(这里需要把-改为_)
The_seventh_level_is_difficult
解压后得到一张颜色园,根据颜色对应数字进行解码得到flag7
flag7:they_were_thr0ugh!
第八层
题目
from Crypto.Util.number import bytes_to_long, getPrime
flag=b"flag{xxxxx}"
p,q= getPrime(1024),getPrime(1024)
n = p * q
e = 65537
m = bytes_to_long(flag)
c = pow(m,e,n)
print("n=",n)
print("c=",c)
print("p^q=",p^q)
'''
n= 22424440693845876425615937206198156323192795003070970628372481545586519202571910046980039629473774728476050491743579624370862986329470409383215065075468386728605063051384392059021805296376762048386684738577913496611584935475550170449080780985441748228151762285167935803792462411864086270975057853459586240221348062704390114311522517740143545536818552136953678289681001385078524272694492488102171313792451138757064749512439313085491407348218882642272660890999334401392575446781843989380319126813905093532399127420355004498205266928383926087604741654126388033455359539622294050073378816939934733818043482668348065680837
c= 1400352566791488780854702404852039753325619504473339742914805493533574607301173055448281490457563376553281260278100479121782031070315232001332230779334468566201536035181472803067591454149095220119515161298278124497692743905005479573688449824603383089039072209462765482969641079166139699160100136497464058040846052349544891194379290091798130028083276644655547583102199460785652743545251337786190066747533476942276409135056971294148569617631848420232571946187374514662386697268226357583074917784091311138900598559834589862248068547368710833454912188762107418000225680256109921244000920682515199518256094121217521229357
p^q= 14488395911544314494659792279988617621083872597458677678553917360723653686158125387612368501147137292689124338045780574752580504090309537035378931155582239359121394194060934595413606438219407712650089234943575201545638736710994468670843068909623985863559465903999731253771522724352015712347585155359405585892
'''
exp
from Crypto.Util.number import *
import gmpy2
import sys
sys.setrecursionlimit(10000)
n= 22424440693845876425615937206198156323192795003070970628372481545586519202571910046980039629473774728476050491743579624370862986329470409383215065075468386728605063051384392059021805296376762048386684738577913496611584935475550170449080780985441748228151762285167935803792462411864086270975057853459586240221348062704390114311522517740143545536818552136953678289681001385078524272694492488102171313792451138757064749512439313085491407348218882642272660890999334401392575446781843989380319126813905093532399127420355004498205266928383926087604741654126388033455359539622294050073378816939934733818043482668348065680837
c= 1400352566791488780854702404852039753325619504473339742914805493533574607301173055448281490457563376553281260278100479121782031070315232001332230779334468566201536035181472803067591454149095220119515161298278124497692743905005479573688449824603383089039072209462765482969641079166139699160100136497464058040846052349544891194379290091798130028083276644655547583102199460785652743545251337786190066747533476942276409135056971294148569617631848420232571946187374514662386697268226357583074917784091311138900598559834589862248068547368710833454912188762107418000225680256109921244000920682515199518256094121217521229357
leak= 14488395911544314494659792279988617621083872597458677678553917360723653686158125387612368501147137292689124338045780574752580504090309537035378931155582239359121394194060934595413606438219407712650089234943575201545638736710994468670843068909623985863559465903999731253771522724352015712347585155359405585892
def findp(p, rp):
l = len(p)
if l == 1024:
rp.append(int(p, 2))
else:
pp = int(p, 2)
qq = (leak ^ pp) % 2 ** l
if pp * qq % 2 ** l == n % 2 ** l:
findp('1' + p, rp)
findp('0' + p, rp)
rp = []
findp('1', rp)
for i in rp:
if isPrime(int(i)) and n % int(i) == 0:
print(i)
得到压缩包密码
pruning_algorithm
解压后得到yes和no的txt,进行01替换再进行二进制转图片得到密文
搜索发现这是某地区的提瓦特密码,对应得到全大写的flag8
SM3RTY0UCANDO
后面和出题人交流得知还有flag格式在这层,在压缩包尾部发现信息
解码为得到信息,打开010查看
发现还有信息未提取完全,整段提取解码
波逐流洪流波波洪流波随洪流逐随浪流波波流洪流波流洪流随逐洪逐随随浪波逐波逐浪波逐流随浪波逐随波浪波逐波流洋波逐逐随随流流随洋波波流流随随流流洋波随流流逐随逐流洋波波逐波逐随随逐洋流流流流随波逐逐浪波随随波浪波逐随波洪流随波浪波逐随波浪波逐随波浪波波流流浪波逐随波洪流随波浪波逐随波浪波波流流浪波逐随波浪波逐随波浪波逐随波浪波波流流浪波逐随波浪波逐随波
之前用随波逐流的时候看到过随言随语,但不知道密文具体格式,看到这个就想起来这个解密,解密得到flag8格式
因为宽高用的是爆破,所以第一个提示算是没有用到,得到flag8
flag8:Sm3rt_y0u_can_do
第九层
因为不是密码手,所以就另辟蹊径想碰碰运气,想到第八层密码为全小写带有一个下划线,开始爆破,幸好密码只有八位英文字符,不然工程会很大,得到压缩包密码
game_over
解压得到压缩包和txt,解压得到一张图片
压缩包里的图片真的有东西吗?不如看向外面
也就是说隐写在压缩包上,通过压缩包的名字和压缩包尾部的标志可以确定这是Oursecret隐写,key还是为game_over,得到flag9
_nine_turns??}
综上所示
flag1:XYCTF{T3e_c0mb1nation_
flag2:0f_crypt0_and_
flag3:misc_1s_re6lly_fun!!
flag4:L1u_and_K1cky_Mu
flag5:_3re_so_sm4rt!
flag6:In_just_a_few_m1nutes_
flag7:they_were_thr0ugh!
flag8:Sm3rt_y0u_can_do
flag9:_nine_turns?}
flag:XYCTF{T3e_c0mb1nation_0f_crypt0_and_misc_1s_re6lly_fun!!L1u_and_K1cky_Mu_3re_so_sm4rt!In_just_a_few_m1nutes_they_were_thr0ugh!Sm3rt_y0u_can_do_nine_turns?}
根据题目要求md5一下得到最终的flag
第三周
F | 出题有点烦 |
题目文件是个压缩包,没有什么其他的信息,进行爆破得到压缩包密码
123456
解压两次压缩包后得到五个文件,前四个没有看出什么信息,第五个图片末尾有50 4B开头的压缩包文件
提取压缩包发现压缩包加密,无信息再次爆破得到密码
xyctf
解压得到文件,记事本打开得到真的flag
XYCTF{981e5_f3ca30_c841487_830f84_fb433e}
F | 真>签到 |
010打开压缩包得到flag
XYCTF{59bd0e77d13c_1406b23219e_f91cf3a_153e8ea4_77508ba}
F | EZ_Base1024*2 |
题目提示应该是base2048,搜索进行解密得到flag
XYCTF{84ca3a6e-3508-4e34-a5e0-7d0f03084181}
F | Osint1|
抖音搜题法秒了
xyctf{江苏省|南通市|滨海东路|黄海}
F | Osint2 |
从图片可以得知目的地站名以及时间,查询高铁时刻表得到车次(有两个都要试试)
并对洛阳龙门附近的景点进行爆破,flag有点忘了(应该是这个)
xyctf{G3293|河南省|老君山}
F1 | Ez_osint |
题目是一封信,因为之前写过类似的知道应该是某种时空邮件,搜索刚好第一个网站就对了,在最新评论中找到对应文字得到flag
第四周
F | 美妙的歌声 |
在Audacity中查看获得password
XYCTF_1s_w3ll
在Deepsound中输入密码
得到flag
XYCTF{T0uch_y0ur_he3rt_d55ply!!}
F | 我的二维码为啥扫不出来?|
查看代码原理为将flag.png的行或者列进行了七次异或,当我们修复四周的定位点后根据二维码纠错手动纠错得到flag.png
扫描修复后的二维码,得到flag
flag{qR_c0d3_1s_s0_fun}
F | Rosk,Paper,Scissors! |
代码原理为ai会根据做出选择的频率来进行选择,当选择频率相同时,先做出的选择将会输出。也就是说,当我们第一次选择1(Rosk)后,顺序就会按照Rosk,Paper,Scissors!运行
exp:
import pwn
io = pwn.remote("127.0.0.1", 61908) #连接服务器
Rock=0
Paper=0
Scissors=0
for i in range(100):
if (i==0):
choice=b"Rock"
io.sendline(choice)
Rock+=1
elif (Rock>=Paper and Rock>=Scissors):
choice=b"Paper"
io.sendline(choice)
Paper+=1
elif (Paper>=Rock and Paper>=Scissors):
choice=b"Scissors"
io.sendline(choice)
Scissors+=1
elif (Scissors>=Rock and Scissors>=Paper):
choice=b"Rock"
io.sendline(choice)
Rock+=1
io.interactive()
io.context.log_level()
运行得到flag
XYCTF{r05k,pApeR,5Ci5SOrs_3cc95de9ee0e}
S | 又是个签到 |
密文末尾有俩==,应该是属于某种对称加密,但是缺少key,当时比较忙就没有去研究了。后面发现是群号,解码得到文字。
根据提示将进行解码
得到flag
XYCTF{It's_Easy!_Special_Signature}
Web
第一周
F | ezmd5 |
将两张md5相同但是图片不一样的图片放入(常见新生赛考题)
F | 牢牢记住,逝者为大 |
之前做过类似的题,记过这个特殊的绕过姿势,用GET[‘cmd’]躲避长度限制。
?cmd=%0d$_GET[c]
;%23&c=cp /flag mm
将根目录下的flag放到mm里,自动生成mm文件,但是这里flag是被过滤了的,所以要转化成八进制绕过,空格用+表示
F | ez?Make |
F | ezMake |
makefile命令url下直接/flag
F | 我是一个复读机 |
F | warm up |
这一层都是很简单的md5绕过
正则表达式替换有一个/e
把替换后的内容解析成php代码
payload里 abc三个部分
a是替换什么 此处为替换掉.
b是替换成什么 此处为替换成system(ls)
c是被替换的内容 此处传.
这个正则表达式会把c中传的.换成system(ls) 然后解析成php代码
payload:/LLeeevvveeelll222.php?a=/.*/e&b=system(ls)&c=.
F | ezhttp |
没有思路看一下源码寻找提示
密码藏在某个地方。
可以发现/robots.txt 下有提示,这个是网站一般告诉用爬虫的人禁止爬取某些内容的地方
提示了一个路径
获取到用户名和密码
输入密码后显示登录成功,但是需要绕过
需要 yuanshen.com访问,更改Referer
继续下一层。需要伪造自己的 ip 为 127.0.0.1
Client-IP: 127.0.0.1
伪造自己的 ip。注意:和 127 之间有个空格
Via: ymzx.qq.com
用 Via 伪造代理
最后是加一个cookie(饼干就是 cookie)
得到flag
Crypto
第一周
F | Sign1n[签到] |
from Crypto.Util.number import long_to_bytes
def inverse_custom_add(bbb):
bbb = list(bbb)
length = len(bbb)
for i in range(length):
# 这里需要找到一个数,加上i+1后对10取模等于bbb[i]的原始值
original_num = (int(bbb[i]) - (i + 1) + 10) % 10
bbb[i] = str(original_num)
result = ''.join(bbb)
return result
def swap_bits(bbb):
bbb = list(bbb[2:])
length = len(bbb)
for i in range(length // 2):
temp = bbb[i]
bbb[i] = bbb[length - 1 - i]
bbb[length - 1 - i] = temp
return ''.join(bbb)
def inverse_swap_bits(bbb):
# 逆序实际上是自己的逆操作,所以直接调用swap_bits即可
return swap_bits('0b'+bbb)
def reverse_process(c):
# Step 1: 逆转自定义加法操作
step1 = inverse_custom_add(c)
# Step 2: 逆转位的逆序操作
step2 = inverse_swap_bits(step1)
# Step 3: 移除末尾添加的"0"
step3 = step2.rstrip('0')
# Step 4: 将二进制字符串转换回长整数
step4 = int(step3, 2)
# Step 5: 将长整数转换回字节串
flag = long_to_bytes(step4)
return flag
print(reverse_process ("12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567891134567799013445678912234568900133557889112456678011245567990233556790013355689901235667990124557799023355788001344568991124566790113445678012235578800124456899123356678901344567991223557880013346788901334677991124556899122355788001344568991124566790113445778012235667801124556899013356678001344578801233467789112355779912234577990233556780113"))
b'XYCTF{24fc979c-6ed9-407b-879c-ea0e1df95801}'
F | Sign1n_Revenge |
from Crypto.Util.number import*
from tqdm import tqdm
import gmpy2
# 你的代码片段
b="12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456799123455678012235568900124556899112356678902344568991223566790012455689902234677990134456799023356678011335668891133566790012455779902335567801133566889013356679901344578890233457790013356688912234677900124556799023345778011335668891123467799112455688902334667900134456899012356678001344568991223566890113455689911234677891224556899023"
# 定义 custom_sub 函数,反向执行 custom_add 操作
def custom_sub(input_str):
input_list = list(input_str)
length = len(input_list)
for i in range(length):
input_list[i] = str((int(input_list[i]) - (i + 1)) % 10)
result = ''.join(input_list)
return result
# 定义 reverse_swap_bits 函数,反向执行 swap_bits 操作
def reverse_swap_bits(input_str):
input_list = list(input_str)
length = len(input_list)
mid = length // 2
for i in range(mid):
temp = input_list[i]
input_list[i] = input_list[length - 1 - i]
input_list[length - 1 - i] = temp
return ''.join(input_list)
# 反向执行 custom_add 操作
input_str = b
result = custom_sub(input_str)
# 反向执行 swap_bits 操作
input_str = result
result = reverse_swap_bits(input_str)
# 将结果转换为字节字符串
result = result.rstrip('0') # 移除末尾多余的零
flag = long_to_bytes(int(result, 2))
print(flag)
b'flag{620c2bea-ddcc-4c14-aec5-cd1bf3681f98}'
F | happy_to_solve1 |
(1 << 512) - 1后将会获得512位的1,再与p进行异或得到q。n位数与全1按位异或等于取反,原码 + 反码 = 2 n - 1。因为q是p的取反后取比其值大的最近的一个素数,所以p + q = 2512 - 1 + t。
exp:
import gmpy2
from Crypto.Util.number import *
n = 24852206647750545040640868093921252282805229864862413863025873203291042799096787789288461426555716785288286492530194901130042940279109598071958012303179823645151637759103558737126271435636657767272703908384802528366090871653024192321398785017073393201385586868836278447340624427705360349350604325533927890879
c = 14767985399473111932544176852718061186100743117407141435994374261886396781040934632110608219482140465671269958180849886097491653105939368395716596413352563005027867546585191103214650790884720729601171517615620202183534021987618146862260558624458833387692782722514796407503120297235224234298891794056695442287
e = 65537
t = 1
for i in range(200):
phi = n - (2**512 - 1 + t) + 1
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
t += 2
b'XYCTF{3f22f4efe3bbbc71bbcc999a0a622a1a23303cdc}'
Reverse
第一周
F | 聪明的信使 |
放入010得到有用信息
一把梭得到flag
flag{Y0u_KnOw_Crypt0_14_v3ry_Imp0rt@nt!}
F | 喵喵喵的flag碎了一地 |
得到一个exe文件,IDA打开发现hint,并得到第一段flag(引导题!太爱了!!!)
flag{My_fl@g_h4s_
hint2需要我们查看函数,在函数列表找到第二段flag
br0ken_4parT_
根据hint3我们需要找到交叉引用此函数的部分
进行跳转
得到一串代码,运行
发现flag并不完整,返回函数查看,得到完整flag
综上所述
flag{My_fl@g_h4s_br0ken_4parT_Bu7_Y0u_c@n_f1x_1t!}
三、总结
Misc打的挺爽的,但是有些题各个方向的交叉性太大了,没法完成有点可惜。最后一周的题有点懈怠了,畏难心理加上事情比较多想偷懒少出了一道题,比较可惜。总的来说,非常好的一次体验!