XYCTF2024 PKyou!战队Writeup

一、队伍信息

队伍名称:PKyou!

队员信息:G3rling,Dreammm,ranfey

二、解题步骤

S Stuck 题目做到一半思路卡壳
F Finished 完成该题
1 First Blood 获得一血
2 Second Blood 获得二血
3 Third Blood 获得三血

Misc

第一周

F | 签到 |

扫描二维码关注公众号,发送“XYCTF2024,启动启动启动!!!”得到flag

Snipaste_2024-04-03_01-10-33

XYCTF{WELCOME_TO_XYCTF}

这题听说当时附件出问题了没有二维码,但是dk盾给我推送信息了,被迫上课打了一题……


F | game |

一张游戏内的截图,Google识图找到Wiki

Snipaste_2024-04-01_14-57-36

Snipaste_2024-04-01_14-58-57

得到flag

XYCTF{Papers Please}

F | zzl的护理小课堂 |

打开靶机是一套问卷,一开始老老实实答题结果100分了给我来了句杂鱼。

F12看源代码

20240408161737

分析发现是从getscore.php文件中获取分数来进行分支,在分支之前打断点更改getscore中的值。

image-20240408162516761

将值改成大于100,得到flag

Snipaste_2024-04-03_01-16-47

XYCTF{2zI_t3LI_y0u_6ff93ca596fe}

F | ez_隐写 |

得到一个带密码的压缩包,用7zip解压成功说明是伪加密。

hint.png

image-20240408163119667

得到压缩包密码

20240401

解压得到WATERMARK.jpg

根据名称可以知道应该是某种盲水印,这里放出效果最好的一张

image-20240408163322941

眼睛不好看的不是很清晰,根据轮廓试出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文件入手。

image-20240408164029366

得到一串掩码,进行掩码爆破得到压缩包密码(这个密码另外题还会用到)

Snipaste_2024-04-02_10-59-51

xyctf20240401ftcyx

解压得到两个压缩包,大部分是相同文件,进行明文爆破

image-20240408164326773

这里要注意的是明文爆破先是找到压缩包的key,再通过key去爆破密码,但是在找到key的时候就已经可以停止了

Snipaste_2024-04-02_11-11-09

得到无加密的flag.zip,解压得到flag.md

image-20240408164511538

得到flag

XYCTF{1A4B8-C9D2F3E-6A4B8C-9D2F3E7F}

F | 彩蛋? |

根据题目hint有三段flag

在比赛须知的第六条我们可以得到第一段flag

image-20240408164734292

image-20240408165129976

XYCTF{this_a_

页尾得到第三段flag

image-20240408165208468

这里有56位,在8进制失败后,尝试7进制解码

image-20240408165246436

find_it}

第二段在近期比赛的图中(这个是晚上做梦的时候梦见在通道里,一看网页只有这里有图片)

image-20240408165320192

将图片下载,一把梭通道得到有用信息

image-20240408165522707

根据提示是某种键盘密码,进行键盘密码解码,最后德沃夏克键盘Dvorak解码得到第二段flag

Snipaste_2024-04-08_10-00-20

bl0ckbuster_for_png_and_i_think_yon_can_

综上所述

XYCTF{this_a_bl0ckbuster_for_png_and_i_think_yon_can_find_it}

F | TCPL |

将附件在010中打开,搜索有用信息发现是缺少相关库

Snipaste_2024-04-03_21-31-19

百度搜索得到解决方案

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)

Snipaste_2024-04-03_21-29-00

FLAG{PLCT_An4_r0SCv_x0huann0}

F | 网络追踪 |

在流量包尾追踪TCP得到一串字符

Snipaste_2024-04-05_01-23-51

解码发现是XXencode。但是一开始在随波逐流一把梭中文解码错误,后面在线解码才得到完整题目表述

image-20240408170528272

开始流量包的分析,首先我们先寻找靶机ip地址,浏览发现192.168.204.131对192.168.204.133存在写入操作,确定靶机为192.168.204.133。并且可以分析出此漏洞与SMB相关

image-20240408170757239

接着我们寻找nmap扫描出的靶机开放的端口

在此之前我们需要了解扫描端口开放以及关闭所返回报文的差异:

若攻击方(192.168.204.131)发起SYN包;目标返回RST ACK结束会话。则代表端口处于关闭状态。

若攻击方发起SYN包;目标返回SYN ACK;攻击方发起ACK并发起RST ACK结束会话。则端口处于开启状态。

将数据包进行过滤

Snipaste_2024-04-07_19-46-09

发现三个端口开启445 139 135

搜索与SMB相关的漏洞,得到漏洞CVE编号为CVE-2008-4250

image-20240408171434882

综上所述

XYCTF{192.168.204.133_445_139_135_CVE-2008-4250}

F4 | 疯狂大杂烩!九转功成 |

根据提示应该对压缩包进行爆破,但这里猜了一下就猜出来了压缩包密码(因为之前用过好几次了)

image-20240416224252705

XYCTF20240401

解压后得到九个压缩包和一个背景故事,大致说是要解开九层(感受到了Musc的威力)

第一层

曰:玉魔命灵天观罗炁观神冥西道地真象茫华茫空吉清荡罗命色玉凶北莽人鬼乐量西北灵色净魂地魂莽玉凶阿人梵莽西量魄周界

初次分析应该是某种曰加密,经测试为天书曰解密。得到压缩包密码

image-20240416224843664

First_layer_simple

解压得到一张png,打开提示CRC有误这里进行宽高爆破,得到flag1

image-20240416225110220

image-20240416225147579

XYCTF{T3e_c0mb1nation_

第二层

xihak-minoh-zusok-humak-zurok-gulyk-somul-nenel-dalek-nusyh-zumek-sysuk-zelil-fepak-tysok-senax

随波逐流一把梭得到压缩包密码

image-20240416225307362

The_second_layer_is_also_simple

解压得到一张png,拖入随波逐流发现RGB通道中有串base

image-20240416225436355

ZmxhZzLvvJowZl9jcnlwdDBfYW5kXw==

再次一把梭得到flag2

image-20240416225553561

flag2:0f_crypt0_and_

第三层

一开始以为是夏多密码,但是缺少方向。根据提示想到了begin的上岸,这里看端点发现只有三种类型,推测是摩斯密码,解码得到压缩包密码

image-20240416225734104

THE_THIRD

解压后得到压缩包但无其他信息,爆破得到压缩包密码

image-20240416225912146

123456

解压后txt中有一串base,一把梭得到flag3

image-20240416230000713

flag3:misc_1s_re6lly_fun!!

第四层

都2024年了不会还有人解不出
U2FsdGVkX1+y2rlJZlJCMnvyDwHwzkgHvNsG2TF6sFlBlxBs0w4EmyXdDe6s7viL吧

分析应该是某种对称加密而key应该是2024,对称解密得到压缩密码

image-20240416230212387

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

image-20240416230604646

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。这里犯了个大错。都是先用的系统自带的记事本再进行处理,所以一直出不来零宽字符,错失三血很可惜……

解密后的数据如下

image-20240416231333796

但需要注意的是需要先下载数据再用文本工具打开,而且不能使用系统自带记事本。

打开后得到文字和零宽字符

image-20240416231532871

根据零宽字符类型进行解码得到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

解压后得到一堆数字名字的文件和图片

image-20240416232238261

初步猜测应该是图片隐写,ppt中的假flag证实了想法。一开始试过文件名,但是是从小到大的顺序,就开始找xls文件,甚至还发现了mu师傅的电话。后面尝试从大到小排steghide解密得到flag6

image-20240416232607421

flag6:In_just_a_few_m1nutes_

第七层

密文:Tig+AF8-viakubq+AF8-vphrz+AF8-xi+AF8-uayzdyrjs

听说维吉尼亚key大残

因为是第七层,这里通过字数可以推测第一个AF8后的应该是seventh,假设在之前密钥未循环,则通过维吉尼亚表格进行推理

image-20240416232932585

发现明文seven对应的key为DEFGHI,为一串连续的英文字符

那么我们可以猜测key为26英文字符,D为第四位,但是密文位数不能对应,在删掉AF8后刚好对应,进行解码得到压缩包密码(这里需要把-改为_)

image-20240416233315393

The_seventh_level_is_difficult

解压后得到一张颜色园,根据颜色对应数字进行解码得到flag7

image-20240416233537790

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)

得到压缩包密码

image-20240416233720341

pruning_algorithm

解压后得到yes和no的txt,进行01替换再进行二进制转图片得到密文

image-20240416233902959

搜索发现这是某地区的提瓦特密码,对应得到全大写的flag8

image-20240416234008006

SM3RTY0UCANDO

后面和出题人交流得知还有flag格式在这层,在压缩包尾部发现信息

image-20240416234124366

解码为得到信息,打开010查看

image-20240416234341411

发现还有信息未提取完全,整段提取解码

image-20240416234444214

波逐流洪流波波洪流波随洪流逐随浪流波波流洪流波流洪流随逐洪逐随随浪波逐波逐浪波逐流随浪波逐随波浪波逐波流洋波逐逐随随流流随洋波波流流随随流流洋波随流流逐随逐流洋波波逐波逐随随逐洋流流流流随波逐逐浪波随随波浪波逐随波洪流随波浪波逐随波浪波逐随波浪波波流流浪波逐随波洪流随波浪波逐随波浪波波流流浪波逐随波浪波逐随波浪波逐随波浪波波流流浪波逐随波浪波逐随波

之前用随波逐流的时候看到过随言随语,但不知道密文具体格式,看到这个就想起来这个解密,解密得到flag8格式

image-20240416234603218

因为宽高用的是爆破,所以第一个提示算是没有用到,得到flag8

flag8:Sm3rt_y0u_can_do

第九层

因为不是密码手,所以就另辟蹊径想碰碰运气,想到第八层密码为全小写带有一个下划线,开始爆破,幸好密码只有八位英文字符,不然工程会很大,得到压缩包密码

game_over

解压得到压缩包和txt,解压得到一张图片

压缩包里的图片真的有东西吗?不如看向外面

也就是说隐写在压缩包上,通过压缩包的名字和压缩包尾部的标志可以确定这是Oursecret隐写,key还是为game_over,得到flag9

image-20240416235222225

_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 | 出题有点烦 |

题目文件是个压缩包,没有什么其他的信息,进行爆破得到压缩包密码

image-20240417000204488

123456

解压两次压缩包后得到五个文件,前四个没有看出什么信息,第五个图片末尾有50 4B开头的压缩包文件

image-20240417000658653

提取压缩包发现压缩包加密,无信息再次爆破得到密码

image-20240417000852966

xyctf

解压得到文件,记事本打开得到真的flag

image-20240417001038986

XYCTF{981e5_f3ca30_c841487_830f84_fb433e}

F | 真>签到 |

010打开压缩包得到flag

image-20240417001233535

XYCTF{59bd0e77d13c_1406b23219e_f91cf3a_153e8ea4_77508ba}

F | EZ_Base1024*2 |

题目提示应该是base2048,搜索进行解密得到flag

image-20240417001401808

XYCTF{84ca3a6e-3508-4e34-a5e0-7d0f03084181}

F | Osint1|

抖音搜题法秒了

image-20240417001728253

xyctf{江苏省|南通市|滨海东路|黄海}

F | Osint2 |

从图片可以得知目的地站名以及时间,查询高铁时刻表得到车次(有两个都要试试)

image-20240417002001806

并对洛阳龙门附近的景点进行爆破,flag有点忘了(应该是这个)

xyctf{G3293|河南省|老君山}

F1 | Ez_osint |

题目是一封信,因为之前写过类似的知道应该是某种时空邮件,搜索刚好第一个网站就对了,在最新评论中找到对应文字得到flag

image-20240417002209270


第四周

F | 美妙的歌声 |

在Audacity中查看获得password

Snipaste_2024-04-22_00-49-43

XYCTF_1s_w3ll

在Deepsound中输入密码

Snipaste_2024-04-22_13-38-20

得到flag

XYCTF{T0uch_y0ur_he3rt_d55ply!!}

F | 我的二维码为啥扫不出来?|

查看代码原理为将flag.png的行或者列进行了七次异或,当我们修复四周的定位点后根据二维码纠错手动纠错得到flag.png

Snipaste_2024-04-22_16-28-09

扫描修复后的二维码,得到flag

Snipaste_2024-04-22_16-30-32

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

Snipaste_2024-04-22_22-00-41

XYCTF{r05k,pApeR,5Ci5SOrs_3cc95de9ee0e}

S | 又是个签到 |

密文末尾有俩==,应该是属于某种对称加密,但是缺少key,当时比较忙就没有去研究了。后面发现是群号,解码得到文字。

image-20240428102248112

根据提示将进行解码

image-20240428103418908

得到flag

XYCTF{It's_Easy!_Special_Signature}

Web

第一周

F | ezmd5 |

将两张md5相同但是图片不一样的图片放入(常见新生赛考题)

image-20240417004126991

image-20240417004133465


F | 牢牢记住,逝者为大 |

image-20240417004151232

之前做过类似的题,记过这个特殊的绕过姿势,用GET[‘cmd’]躲避长度限制。

?cmd=%0d$_GET[c];%23&c=cp /flag mm

将根目录下的flag放到mm里,自动生成mm文件,但是这里flag是被过滤了的,所以要转化成八进制绕过,空格用+表示


F | ez?Make |

image-20240417004340862

image-20240417004357504


F | ezMake |

makefile命令url下直接/flag


F | 我是一个复读机 |

F | warm up |

这一层都是很简单的md5绕过

image-20240417004829221

image-20240417004841823

正则表达式替换有一个/e

把替换后的内容解析成php代码

payload里 abc三个部分

a是替换什么 此处为替换掉.

b是替换成什么 此处为替换成system(ls)

c是被替换的内容 此处传.

这个正则表达式会把c中传的.换成system(ls) 然后解析成php代码

payload:/LLeeevvveeelll222.php?a=/.*/e&b=system(ls)&c=.


F | ezhttp |

image-20240417005131329

没有思路看一下源码寻找提示

密码藏在某个地方。

可以发现/robots.txt 下有提示,这个是网站一般告诉用爬虫的人禁止爬取某些内容的地方

image-20240417005304192

image-20240417005320227

提示了一个路径

image-20240417005331456

获取到用户名和密码

image-20240417005422995

输入密码后显示登录成功,但是需要绕过

image-20240417005442427

需要 yuanshen.com访问,更改Referer

image-20240417005526884

image-20240417005555487

image-20240417005620388

image-20240417005626938

image-20240417005724422

继续下一层。需要伪造自己的 ip 为 127.0.0.1

image-20240417005747286

Client-IP: 127.0.0.1

伪造自己的 ip。注意:和 127 之间有个空格

image-20240417005828998

Via: ymzx.qq.com

用 Via 伪造代理

最后是加一个cookie(饼干就是 cookie)

image-20240417005930968

image-20240417005937266

得到flag

image-20240417005958746


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得到有用信息

Snipaste_2024-04-03_01-05-40

一把梭得到flag

Snipaste_2024-04-03_01-06-05

flag{Y0u_KnOw_Crypt0_14_v3ry_Imp0rt@nt!}

F | 喵喵喵的flag碎了一地 |

得到一个exe文件,IDA打开发现hint,并得到第一段flag(引导题!太爱了!!!)

image-20240408172458135

flag{My_fl@g_h4s_

hint2需要我们查看函数,在函数列表找到第二段flag

image-20240408172545554

br0ken_4parT_

根据hint3我们需要找到交叉引用此函数的部分

image-20240408172743692

进行跳转

image-20240408173216781

image-20240408173226351

得到一串代码,运行

Snipaste_2024-04-03_02-07-17

发现flag并不完整,返回函数查看,得到完整flag

image-20240408173434345

综上所述

flag{My_fl@g_h4s_br0ken_4parT_Bu7_Y0u_c@n_f1x_1t!}

三、总结

Misc打的挺爽的,但是有些题各个方向的交叉性太大了,没法完成有点可惜。最后一周的题有点懈怠了,畏难心理加上事情比较多想偷懒少出了一道题,比较可惜。总的来说,非常好的一次体验!

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇