往届御网杯WP

往届御网杯WP
Linstarsesayweb
题目内容:flag的位置为/flag.txt。
访问靶机
开始构造脚本文件并执行后获取 flag 结果
1 | #!/usr/bin/env python3 |
点击展开详细解析
1. 脚本头
1 | #!/usr/bin/env python3 |
- 作用:告诉系统用Python 3解释器运行此脚本。
- 类比:类似于告诉电脑“用Python 3打开这个文件”。
2. 导入库
1 | import requests |
- 作用:导入
requests
库,用于发送HTTP请求(如POST请求)。 - 类比:相当于准备一个工具箱,里面有一个能发送网络请求的工具。
3. 定义get_flag
函数
1 | def get_flag(addr, result=""): |
- 作用:定义一个名为
get_flag
的函数,接收两个参数:addr
:目标服务器的地址(如"192.168.6.166:46566"
)。result
:存储已破解的flag(默认为空字符串)。
- 类比:相当于创建一个任务,任务是“破解flag”,初始时flag为空。
4. 遍历flag的每个字符位置
1 | for x in range(1, 40): |
- 作用:循环从第1个字符到第39个字符(假设flag长度为39)。
- 类比:像翻书一样,一页一页地检查flag的每个位置。
5. 遍历可打印ASCII字符
1 | for i in range(0x20, 0x7f): |
- 作用:循环遍历ASCII码中可打印字符的范围(32到126,对应空格到
~
)。 - 类比:尝试所有可能的字母、数字和符号。
6. 调用post
函数检查字符
1 | if post(addr, x, chr(i)): |
- 作用:调用
post
函数,检查目标服务器上/flag.txt
的第x
个字符是否是chr(i)
。chr(i)
:将ASCII码转换为字符(如65
→'A'
)。
- 类比:问服务器“flag的第x个字符是
chr(i)
吗?”。
7. 更新flag并打印
1 | result += chr(i) |
- 作用:
- 如果字符匹配,将字符拼接到
result
中。 - 打印当前已破解的flag。
- 跳出内层循环,继续破解下一个字符。
- 如果字符匹配,将字符拼接到
- 类比:如果猜对了,就把字母加到flag上,然后看下一个位置。
8. 打印最终flag
1 | print(f"Final flag: {result}") |
- 作用:破解完成后,打印完整的flag。
- 类比:翻完所有页后,展示完整的flag。
9. 定义post
函数
1 | def post(addr, pos, payload): |
- 作用:定义一个名为
post
的函数,接收三个参数:addr
:目标服务器地址。pos
:当前检查的字符位置。payload
:当前尝试的字符。
- 类比:创建一个任务,任务是“问服务器某个位置的字符是什么”。
10. 构造POST请求数据
1 | data = { |
- 作用:构造一个POST请求的
data
字段,内容是一个Shell命令:cut -c {pos} /flag.txt
:提取/flag.txt
的第pos
个字符。[ ... = '{payload}' ] && sleep 2
:如果字符匹配,则让服务器休眠2秒。
- 类比:问服务器“如果第pos个字符是
payload
,请等2秒再回答”。
11. 发送POST请求
1 | try: |
- 作用:向目标服务器发送POST请求,并设置超时:
- 连接超时3秒,读取超时1秒。
- 类比:打电话给服务器,如果3秒内没接通或1秒内没说话,就挂断。
12. 处理超时异常
1 | except requests.exceptions.ReadTimeout: |
- 作用:
- 如果触发
ReadTimeout
(服务器休眠2秒),返回True
(字符匹配)。 - 其他请求错误(如网络问题)返回
False
,并打印错误信息。
- 如果触发
- 类比:
- 如果服务器等2秒才接电话,说明猜对了。
- 如果电话打不通,可能是网络问题。
13. 主程序入口
1 | if __name__ == '__main__': |
- 作用:当脚本直接运行时,调用
get_flag
函数,传入目标服务器地址。 - 类比:按下“开始”按钮,启动破解任务。
总结
- 目标:通过时间盲注(Time-Based Blind Injection)逐字符破解
/flag.txt
的内容。 - 方法:发送POST请求,利用服务器响应时间判断字符是否匹配。
- 输出:实时显示破解进度,最终打印完整flag。
bluetooth
解压附件得到流量包打开发现不是TCP协议,开始构造脚本文件把压缩包获取出来
1 | import pyshark |
解压出来压缩包发现个txt文件和key文件
编写脚本对这两个字节序列进行按位异或(XOR)操作。
1 | from Crypto.Util.number import long_to_bytes |
脚本功能说明
- 将两个大整数(
flag_txt
和key
)转换为字节形式。 - 对这两个字节序列进行按位异或(XOR)操作。
- 打印异或后的结果(即解密的flag)。
编码转换
题目内容:
1 | 编码1:++++++++[>>++>++++>++++++>++++++++>++++++++++>++++++++++++>++++++++++++++>++++++++++++++++>++++++++++++++++++>++++++++++++++++++++>++++++++++++++++++++++>++++++++++++++++++++++++>++++++++++++++++++++++++++>++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>++++++.>----.<-----.>-----.>-----.<<.+.<<<+++++++.------.>>>+.+.---.<<<. |
依次扔到解码工具解码
BrainFuck解码: flag{ab71cda1
JSFuck解码: b495e13b3f21
BrainFuck解码: f6fd50221978}
input_data
访问
网址输入/.svn
flag就在/.svn/pristine/57/57d4b4b90f7139cf064ee991e8f78bd8fc2a8a6d.svn-base
下
base
题目给了
1 | 👄👋🐹🐸👂👱🐯🐢👚👊🐬👨👌👢👅🐿👊🐩👅👆👈👤🐧🐢👁👡🐯👰👂🐩👛👂👂👋👯🐺👋🐩👄👤👉🐾👄👭👃👋👀🐢👁👠👯🐻👀👌🐽👩👐👍👫🐾👇👥🐼👭👌👌👣🐺👊🐾🐬👘👌👢👁👄👌👍👉👅👄👠👫👦👊👌👅🐺👅👍🐬👙👘🐧👍👞👂🐪👍🐼👉👰👐🐭👏👊👚🐧👏🐨👦🐯👆👋🐰👬👂🐪👍👈👈👢👟👭👃🐩👍👀👁🐼👑👙👋👋👉🐺👅👋🐯🐨👇🐼👁👈👁👠🐬🐼👐👱🐽👁👃👱🐫👤👃👎👅👂👆🐿🐸👧👋🐨👀🐦👅🐧👪👤👍👡👄👢👉🐺🐬🐾👈👢👯👉👍🐼🐧🐪👙👣🐸👟👑🐧👞👡👃👌👀👣👉👎🐸👪👃🐼👟🐿👁👡👦👧👍👡🐼👮👈🐺👪🐦👇👱👛👃👁👣👑🐺👊🐾🐯👭👑👌👁👫👇👠👄🐢👄👠👫👦👎🐼👢🐯👈👢🐯👮👁👢👍👞👃👎👈👰👈👎🐯👭👑👠🐯🐯👁👤👄👮👚👋🐰👊👑👣👣👣👄👰👉🐽👃🐨🐰🐺👋🐽👀🐮👏👱👅🐼👂🐼🐨👑👇🐼👁👅👉👠🐨🐾👀👋👍👢👌👌👚👤👆👣🐧👥👈👎👫👡👇👱🐧👭👄👌🐬👘👀👋👛👨👊🐩🐹🐽👄🐺🐰🐨👅🐻👀🐧👈👡👌🐦👅👌👅👠👊🐿👀🐪👉👠👑🐾👌👋👐🐢👁👠🐨👡👊👡🐼👮👇👥🐽👰👇🐨👁👣👍🐼👛🐺👊🐿🐽🐻👇🐼👁👄👌👍👉👅👉🐨👢👮👄👢👄🐩👚🐼👉👦👛🐼👍👞👂🐪👍🐼👈👎🐯👯👄👍👟🐹👘🐩👄🐦👇👊🐯👯👋👣👦👟👈👢👟👯👈👱👯🐺👙👋🐨🐨👇👋👉🐺👅👋🐯🐨👈🐩👁👀👚👡👛🐾👁👢👚👧👉👊👯🐹👑👍🐨🐹👈👠🐰👅👂👊🐯🐦👌👤👐👭👍🐧👁👀👚🐺👍👱👈👤🐧🐢👀👱🐫👰👂🐩👐👧👍👋🐽🐾👘👣👮👠👉👎🐸👩👎👡👫🐺👄🐩🐯👣👏👡🐼👮👇👥🐽👰👇🐩🐫👩👄🐽👌👱👁🐼👌👭👏🐧👁👫👇👠👄🐢👉🐨👢👱👆👋👛🐻👐👢👢🐰👘🐼👍👞👂🐨🐼🐫👆👤👢👭👘👢👀🐯👁👤👄👮👚👊🐧🐫👁👢👈👠👈👢👟👮👃👱👅🐺👌👠👁👭👇👊👯🐧👏👌👅🐽👅🐽🐫👮👃👍👯🐽👐🐺👮👪👊🐼👚👤👆🐼👮🐦👄👋🐹🐸👂👱🐯🐢👚👊🐬👨👌👡👛👨👊🐩🐹🐽👃🐩👮🐨👐👤👈👰👂🐩👟👐👊👋🐼👩👌👋👛🐿👉👎🐸👩👌👋👞👪👈👎👚👦👘👡👉👝👎👡👮🐬👇🐨👁👤👎👎👌👱👁🐼👁👋👅👌👀👯👅👢👫👄👅🐩🐬👈👀👎👚👱👂👰👅👊👃🐼👍👞👂🐪👍🐼👆👰🐨👩👋👎🐹🐹👘🐩👁👧👘🐻🐯🐪👊👍👫👃👈👢👟👮👈👠👅🐿👎🐽👪👟👙👰🐰👪👐👊👯👑👄👊👫👉👋🐧🐯🐪👑👞🐴🐴 |
是base套娃
先转成base100
1 | MTBAKz8+cS5qUkNHS2NOQm0+Jj8yK2dKKTxCT2MmRGMvLTI+JixDIUFrYVtGPnEvUUlCSG5aUkJMUVRNMitoSUNCNV5ba0VgK3VERyY6XSc0X1o8OT9uK3VQQkhvL2VIJEZbTTRCNT81PEJQJi5EYzFJLz4mLWNKOHApT1I/N0smVjMkRC5GQkxRVE03blAhZ0gjLUIlRWAsLEhHJjopVjEwQCs/PzdLJlZCSG8vZUJtPiM+MitoWEk8Qk8wJkVgLWQyQW8vZi88JmMwcT9SZlllMyRFL19CTFI7XzNEKE1ZPEJNRi1GITVkUUcmOl0nQWtjPz0vMU5aITdqS2BFMC91NDI0QjU/NUNiSHI3RiZGUTY+Ji1jSjEwPnFyP1JlVEdCSHFDPEJMUVRNR1kwMkM2cERodEVgK3VEQW8xMVhBa2M/PS8xTlohQkhxQzxCbT11PTRCNT81Q2JIcjdGJkcpRSxBZV1BQi9NKS8/UmYvV0JIcCVzQm0+Iz4yK2YpVTFGalwiRWArWjtCM28lXjEwPnFyP24rMFUzJEUvX0JtPiM+R1kzOTdDYkk9aEVgK1E4OmkvakI8JmMwcS04JkQiQkhwLzNCUiJvPSx0XUNFNF4wLVxFYCwsSEcmOEw/MTBAKz8+cS5qUjdqS2BFL2w1YmQyK2hYSTErUTdHRWArUTgsQWcoajRfWjw5P1JmWWUzJEJTNUIxNktMN25QIWczKyNSLEVgK3VEOy1rTWBBa2JpaD83SVtLQkhwQiNHWFshby9sYSxZMStRT083Zg== |
再转base64
1 | 10@+?>q.jRCGKcNBm>&?2+gJ)<BOc&Dc/-2>&,C!Aka[F>q/QIBHnZRBLQTM2+hICB5^[kE`+uDG&:]'4_Z<9?n+uPBHo/eH$F[M4B5?5<BP&.Dc1I/>&-cJ8p)OR?7K&V3$D.FBLQTM7nP!gH#-B%E`,,HG&:)V10@+??7K&VBHo/eBm>#>2+hXI<BO0&E`-d2Ao/f/<&c0q?RfYe3$E/_BLR;_3D(MY<BMF-F!5dQG&:]'Akc?=/1NZ!7jK`E0/u424B5?5CbHr7F&FQ6>&-cJ10>qr?ReTGBHqC<BLQTMGY02C6pDhtE`+uDAo11XAkc?=/1NZ!BHqC<Bm=u=4B5?5CbHr7F&G)E,Ae]AB/M)/?Rf/WBHp%sBm>#>2+f)U1Fj\"E`+Z;B3o%^10>qr?n+0U3$E/_Bm>#>GY397CbI=hE`+Q8:i/jB<&c0q-8&D"BHp/3BR"o=,t]CE4^0-\E`,,HG&8L?10@+?>q.jR7jK`E/l5bd2+hXI1+Q7GE`+Q8,Ag(j4_Z<9?RfYe3$BS5B16KL7nP!g3+#R,E`+uD;-kM`Akbih?7I[KBHpB#GX[!o/la,Y1+QOO7f |
再转成ascii85或者base85
1 | 2XIJ]*9pk2n!ix}i5JJ>U<ceoR,xZk$kfM(I]*MSh#!/hEhk5Jf<goRvrR;xvmbj=i(I`*PTh#/4yx{i<UT.U<keoRn3ZkKmJu(I^*XT8!QzhEhkGJ#<ylRvrR?xvmQU2XIJ^*XTh#/4ix|i5Jk=U<RvrRn3fm$kT8%I_*fT8!n!hE|i9J#<U<!Ys!xxvmbjfMWf,*9pG$/4/8@i<UT.l/!YsR,xZkKm2X(I_*HTh#n!hEhkxJ#<D?!YrR;xfmKmfMWf,*9ph#n!ix{i<UT.l/!YsR;x#m$kg5(I_*XTh#H)ix|i5J#<3+#*rR2xg^bj2X(I`*9p8!n!ix|ixJz.l/,*rR/xPmKmT8%I&.XTh#K;hx|i%J#<=[#*rR?xvm$k2XIJ]*9pG$/4.P[i5Jk=2+RvrR/x#mKm=i(I_*fT8!%@gEhkGJ#<8_RvrR;xQ^$kfMIJ^*1ph#QzxE|i.U#<2+ZvG |
最后再转成base91
1 | chgdchg5clctclcxclc5cdc9chcdcdc9chctchglcdc9chclclcdclcpchchchgdchg5clg5chg9clcpchclcdcdchg9chg5chctclc9chghclchchclclcpclchchghchg5clcpcdclchcpchclcdc9clcdcdc9chglchg5chg5chctcdc9clchclcdchclchgdchcpcdclchclcdc9chghclcdchg5chctclcpchctclclchgpclclchgdclcBchgdchcpchgdclclcdc9chglchcdclg5chglchg5clctchctclctclchchgdchglchg9clcpcdchchcpclclclcpcdc9chg9chcxchclcdghcdghcdghcdghcdghcdgh |
然后再转base62,这里可能编码有问题,软件解密解不开,这能用这个网站解base编码解码-base64、base32、base16加密与解密 - 在线工具
1 | 4C4A575851324332474E32455356444C4A5A4B5645334B4A47524D544556544D4A563546453253324E4A4A47325453454C463545324D534A475647554F554C594C464C55324E435A4E4A574757544C4E4B5634465556324B48453D3D3D3D3D3D |
然后直接扔到随波逐流
mp3
参考思路音频隐写 - CTF Wiki
打开题目给的压缩包发现里面有一张图片名称叫做apple.png
我们用QR扫描出来得到一串Unicode编码
我们将Unicode编码扔进解密工具
得到羊由大井夫大人王中工
这是当铺编码
我们将当铺编码转换一下
根据对应的文字进行数字转换
田 | 口 | 由 | 中 | 人 | 工 | 大 | 土 | 士 | 王 | 夫 | 井 | 羊 | 壮 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 2 | 3 | 4 | 5 | 5 | 5 | 6 | 7 | 8 | 9 | 9 |
然后羊由大井夫大人王中工
对应的就是9158753624
我们发现题目名字叫做mp3,但只给了png图片,首先怀疑需要文件剥离。
然后我们用kali的strings
工具进行关键字枚举
发现包含一个mp3文件
接下来尝试用foremost工具进行文件剥离
用foremost剥离出来后会在当前文件生成一个output文件夹这个文件夹内有个rar文件夹,rar文件夹内就是mp3文件了,可以直接解压出来
我们拿到mp3文件后可以进行音频隐写的操作了
先扔到Audacity工具内看是视图内是否有flag或者摩斯电码
发现很正常
那就不是视觉上的波形图和频谱图了,再加上一开始图片内给的神秘字符9158753624
开始怀疑是音频加密。
需要用Mp3Stego
音频隐写工具解密。
把音频文件放在当前工具目录下后调出命令提示符
输入命令开始解密
1 | Decode.exe -X apple.mp3 -P 9158753624 |
随后会生成出来一个.pcm文件和一个.txt文件
我们打开txt文件,发现base64的密文Q1RGe3hpYW9fcGluZ19ndW99
,这应该就是我们要找的东西了
我们解密后得到flag
CTF{xiao_ping_guo}
发现原来flag只是这首的名字而已啊!!!害的那么费劲心思,到头来只是小苹果
QR code
题目给了一张png图片,内容是一张二维码
用QR工具扫码后得到一句话,flag就在这里,盲猜是高宽隐写和文件分离。先扔010试一下,没有找到特殊字符,
应该不是高宽隐写,再拿去kali试试foremost分离,分出来了一个加密的压缩包,压缩包内是一个名字叫做4number.txt
的文件,这应该就是要找的flag
盲猜是伪加密,把zip文件扔到010查看修改后发现不是,那应该就是暴力破解了,然后用ARCHAP尝试1~9数字破解,发现破解成功,密码为7639
打开后得到flag