NewStarCTF2024 第一周个人Writeup
MISC
WhereIsFlag
才。。。才不会告诉你我把flag藏在哪里了!
【难度:简单】
不告诉我们就自己找呗,尝试用find / -iname "flag"
,但是说无法识别,同时在开始告诉我们了只能用ls
、cd
、cat
寻找/tmp
、/home/teriri
、/home/guest
均发现假的flag
然后把目标转向proc
,可以从/proc/self/environ
找到flag
Labyrinth
听好了:9月23日,NewStar2024就此陷落。每抹陷落的色彩都将迎来一场漩涡,为题目带来全新的蜕变。
你所熟知的一切都将改变,你所熟悉的flag都将加诸隐写的历练。
至此,一锤定音。
尘埃,已然落定。
#newstar# #LSB# #听好了#
【难度:简单】
这题已经告诉我们是LSB隐写了,直接拿脚本过来用,但是发现解压不出来有意义的东西
丢进StegSolve里面,逐个层看,发现在Red Plane 0有个二维码
扫出来得到flag:flag{e33bb7a1-ac94-4d15-8ff7-fd8c88547b43}
decompress
正在失传的技艺之压缩包解压
注:由于平台对flag的长度限制,请把解压的结果再计算32位小写md5后包上flag{}提交
【难度:签到】
附件下载下来是分卷压缩文件,解压就行了,然后按照题目要求md5计算一下
pleasingMusic
一首歌可以好听到正反都好听(以flag{}形式提交,所有英文字母均为小写)
【难度:签到】
用Audacity打开可以看到很明显的摩斯电码特征,给弄出来,结果为. ..- --- .-.- -.--.. . ... .-. --- -- -.--.. ..-- .
,翻译出来是EUOESROME
,交上去不对
按照题目的意思,我们还可以反着来,反着来结果为. --.. ..--.- -- --- .-. ... . ..--.- -.-. --- -.. .
,结果为EZ_MORSE_CODE
,改成全小写并包裹flag,得到flag{ez_morse_code}
,交上去就得分了
兑换码
领取newstar前瞻兑换码,明天中午12点就失效喽!就在图片下面。什么,你没有看到?原来是png的下面啊,那没事了。
【难度:简单】
原神,启动!
一开始这个题目写在png的下面,想的是长宽修改,而且把文件用pngcheck
一下发现CRC不对
然后写个脚本去爆破宽高
1 | import zlib |
跑出来结果是2560*1267
,换成十六进制是0xA00 * 0x4E9
,去010Editor里面改一下图片的宽高(图示黄色的那个E9
)
就可以得到flag了,为flag{La_vaguelette}
WEB
headach3
头疼,帮我治治
【难度:签到】
提示很明显,让我们看相应标头(HEAD),就能够找到了
会赢吗
什么是控制台?js又是什么
本题下发后,请通过http访问相应的ip和port,例如 nc ip port ,改为http://ip:port/)
【难度:简单】
入学啦!
你考入了咒术高专
但是出门前你因为太兴奋而忘记了带录取通知书
你能找到录取通知书吗?
在开发者工具里面就能在注释里面找到入口了
掌握术式
开学第一课
五条老师传授给你们一种名为javascript的术式,这种术式可以在控制台进行一系列的应用
你能掌握js的用法吗?
在控制台可以发现js代码
1 | async function revealFlag(className) { |
用Hackbar来发起POST请求,就可以得到我们的这部分flag了
第二种做法
在html中修改按钮的属性,加上一个onclick="revealFlag('4cqu1siti0n')"
再点一下就行了
被封印了
走不出的三年,走不出的苦夏
被羂索控制的夏油杰使用狱门疆封印了五条悟
你能救出五条老师吗?
打开控制台,还是能看到js代码
1 | document.addEventListener('DOMContentLoaded', function () { |
这个csrf_token
在上面一点点可以找到
1 | <form id="seal_him" method="post"> |
还是用Hackbar来POST就行了
会赢吗?
会赢吗?
现代最强的归来,五条悟的复活宣言!
绝对的强者,由此而生的孤独,教会你爱的是….
还是可以找到相应的代码
1 | <form id="winForm" action="/api/flag/Ap3x" method="post"> |
但是在下面的js代码中禁用了submit操作
1 | document.querySelector('form').addEventListener('submit', function (event) { |
所以还是掏出Hackbar
最后得到flag为ZmxhZ3tXQTB3IV95NF9yM2FsMXlfR3I0c1BfSkpKcyF9
,显然编码过,base64解码出来是flag{WA0w!_y4_r3al1y_Gr4sP_JJJs!}
智械危机
我家看门的robots有点铸币,怎么会告诉别人后门没有锁呢
【难度:中等】
这道题,robots
提示robots.txt
,所以先进robots.txt看看
可以看到有个backd0or.php
,访问一下,得到源码
1 |
|
这里要成功执行命令有两个点
- 需要执行的命令放在
cmd
中,且需要用base64编码一次 - 需要执行的命令的base64反向(即
ls
的bHM=
变成=MHb
)的md5哈希值再base64编码后放在key
里面
这里先尝试跑一个ls
,ls
经过b64编码为bHM=
,然后再跑一个ls
的b64逆向后md5再b64编码,结果为N2FiZThiMjRiZDAxMzc0NDZmZDMzNmMyMjk4ZmNjYTA=
,发现ls
命令可以正常执行
所以我们现在要开始找flag的位置,先构建shell命令find / -iname "flag"
,所以cmd
传入为ZmluZCAvIC1pbmFtZSAiZmxhZyI=
再把上面这个b64编码结果反向一下后md5再b64,得到MWQ4M2Y1MmNhMDk1ZjYwNGVhY2IwOGNjZDRmZWRhOTM=
运行后可以发现flag在/flag
再用同样的方式,执行的命令为cat /flag
,b64编码后为Y2F0IC9mbGFn
,key编码后为ODc5YTU5MWM2Nzg1YTRlMTM5OGI5NmE5YTFiYzY3ZWI=
附上POC构造脚本
1 | import hashlib |
得到flag
谢谢皮蛋
让我皮蛋看看Flag都藏哪了
【难度:困难】
这题谁出的呀太搞了hhhhhhhhh
Cypher: Where is everyone hiding???
Wingman: Pew pew~
在控制台中可以看到注释给了提示
提示里面告诉我们了解一下联合注入,我尝试了一下id=base64(1 UNION SELECT TABLE_NAME, TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA = database(); --)
(注:本文中base64()
指用base64方式编码内部字符)
然后会发现返回了保安的位置,但是我要查询的数据库内的表格没出来
所以我估计是虽然我注释掉了LIMIT
,但是PHP里面只接受一组结果,所以得让前面的查询无返回
经过我测试得知,id=1可以得到保安的位置,id=4可以得到奶妈的位置,所以避开这两个数字就行了
然后传入id=base64(10 UNION SELECT TABLE_NAME, TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA = database(); --)
,可以得到结果
Name: “Fl4g”
Position: “Fl4g”
接着就是查询这个表中的列,传入id=base64(10 UNION SELECT GROUP_CONCAT(COLUMN_NAME SEPARATOR ", "), GROUP_CONCAT(COLUMN_NAME SEPARATOR ", ") AS combined_info FROM information_schema.columns WHERE TABLE_SCHEMA = database() AND TABLE_NAME = "Fl4g" --)
后,可以得到Fl4g
表格中拥有id
、des
、value
列
Name: “id, des, value”
Position: “id, des, value”
然后我们再去查询des
和value
,传入id=base64(10 UNION SELECT des, value FROM Fl4g --)
,得到最终的结果
Name: “C0ngratu1ati0ns!”
Position: “flag{36218e97-ec08-4b21-80c8-50ddfca4f026}”
PangBai 过家家(1)
今天我去孤儿院接走了 PangBai,孤儿院的老板连手续都没让我办,可是我一抱起 PangBai,她就嚎啕大哭起来,我陷入了信任危机,于是我打开了婴幼儿护理专业必读书目《图解 HTTP》。
(本题下发后,请通过http访问相应的ip和port,例如 nc ip port ,改为http://ip:port/)
【难度:中等】
这题的截图中的IP地址和端口会不一样,因为我后面重开容器了,主要是因为UA那一关没过,当时没搞出来是什么问题,后来发现是我在学校多设备上网在Openwrt里面改了UA,所以会一直导致不过
Level 1: 初出茅庐
教育孩子的第一步,就是学会如何倾听他们的声音。
PangBai 的头部(Header)里便隐藏着一些秘密,需要你主动去发现。
按下F12可以看到响应头里面有个location,就可以进入Level2了
Level 2: 云程发轫
有时主动的沟通,胜如缜密的推理。
正确的沟通会使事物朝着顺心的方向发展。向 PangBai 询问(Query)一下(ask=miao)吧 ~
这里要我们传入query值,我们在网址后面加上?ask=miao
Level 3: 探赜索隐
理解是深入的途径,将心比心是有效沟通的方法论。
与孩子沟通的方式并不唯一,先入后导,顺其者自然。用另一种方法(Method)打声招呼(say=hello)吧 ~
意思是用POST方法传入say=hello
,用Hackbar就能搞定
Level 4: 不悱不发
不愤不启,不悱不发。因势利导,顺势而为。
你需要使用正确的方法(Method)来与 PangBai 沟通。
这里说我们要用正确的方法沟通,尝试最常用的GET
和POST
,发现POST
是对的
然后告诉我们User-Agent
要是Papa/1.1
,所以我们改下UA。
Level 5: 渐入佳境
发现症结,直面矛盾。实事求是,平心相待。
PangBai 依然对你比较警惕,因此「玛卡巴卡阿卡哇卡米卡玛卡呣」或许是不可省略的。
这里以为有个302设置cookie的过程,所以会弹回去GET请求,我们用工具再改成POST请求
然后告诉我们要用PATCH方法提交一个补丁包,因为在yakit和burpsuite我没找到怎么发送patch请求,然后我用了Python
1 | import requests |
这里的empty.zip
是我随便新建的一个空的压缩文件,上传上去就有了,然后可以得到token
Level 6: 一方通行
「君子素其位而行,不愿乎其外。」
——《中庸·第十四章》还在等什么?距离成为 PangBai 的亲人(localhost)只有一步之遥了呢!
这里的前方是一方通行啊!Level 6 可不是容易的!
提示我们要来自localhost,所以改X-Forwarded-For,可以通过
你似乎无法抵御这种感觉的萦绕,像是一瞬间被推入到无法言喻的深渊。尽管你尽力摆脱,但即便今后夜间偶见酣眠,这一瞬间塑成的梦魇也成为了美梦的常客。
「像■■■■验体■■不可能■■■■ JWT 这种■■ Kjbikdq4AKSIwzT4 ■■■密钥,除非■■■■■走,难道■■■■■■吗?!」
「……」
我们得到了个密钥为Kjbikdq4AKSIwzT4
,也提示我们是JWT了,我们拿去验证一下,发现可以通过
然后我就修改了level
后面的值为7
,得到eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsZXZlbCI6N30.NrNzsxizJ8-EX3YYl93lJWWZ_8YvxBHGH17J4QC3Cd4
,放进cookie里发现没有第七关
然后改了个0,出来了……
Level 0: 此心安处是吾乡
平凡的普通人,是世界的基调。无数平凡的人们,书写了波澜壮阔的历史。
「我将无我,不负人民。」
「PangBai!危险!PangBai!!PangBai!!!」从梦中醒来
在浏览器打开的时候,从梦中醒来
这几个字可以点,然后就进入了剧情……
REVERSE
base64
仍然是base64
【难度:简单】
通过xdbg动态调试可以发现里面的一些字符串
上面的应该是提示,下面的这部分是在输入flag后进行比较的部分,但是经过动态调试,它用于比较的值并不是我们输入的flag经过b64编码,而是固定为j4AvAcBkn6LduUAkhDBd5YBDI2ATc=
经过字符串查找我们现在有两段可能有用的内容
- WHydo3sThiS7ABLElO0k5trange+CZfVIGRvup81NKQbjmPzU4MDc9Y6q2XwFxJ/
- g84Gg6m2ATtVeYqUZ9xRnaBpBvOVZYtj+Tc=
还有一段固定比较的内容
- j4AvAcBkn6LduUAkhDBd5YBDI2ATc=
其中,第一段内容前面应该是Why do this table look strange
,应该是提示我们换表了
我在这里先尝试把表弄出来,进行了几个字符串的编码,在汇编中还可以看到对flag进行b64编码后换表的操作前要求我们输入的长度为26
所以我分别用abcdefghijklmnopqrstuvwxyz
、12345678901234567890123456
、qwertyuiopasdfghjklzxcvbnm
、!@#$%^&*()!@#$%^&*()!@#$%^
、1/2*3-4+5/6*7-8+9-/0/00000
进行base64编码和丢进这个程序里进行编码,得到了下面的几个字符串
1 | original_strings = [ |
然后通过Python算一下映射关系,得到映射关系如下
1 | Y: n |
然后就可以通过Python写代码映射并解码了
1 | import base64 |
然后跑出来结果是flag{y0uUkn0w\base64Uwell}
,很奇怪,CTF题目分割字符的时候用的是下划线,这里有U
和\
,我想到应该是我的映射关系建立得不完全,手动把U
和\
改为下划线变成flag{y0u_kn0w_base64_well}
后提交,成功!
begin
什么是IDA?
【难度:签到】
描述提示我们用IDA打开,按下F5后会看到这个main函数里给了很多提示
第一部分
在Hex-view视图中,我们可以看到第一部分flag的内容为flag{Mak3_aN_
按照题目给的提示,我们在IDA-View里面按下A也能够直接转换出来
第二部分
按照题目提示,我们按下Shift+F12转换到Strings视图就可以看到了,为3Ff0rt_tO_5eArcH_
第三部分
题目说按下X键,但其实我是在IDA-View里面找到的,直接双击题目给我们提示第三部分的那一行,然后就能看到了,为F0r_th3_f14g_C0Rpse
所有最后结果为flag{Mak3_aN_3Ff0rt_tO_5eArcH_F0r_th3_f14g_C0Rpse}
ezAndroidStudy
这是什么?猫猫虫?
【难度:简单】
在resources.arsc
可以查到flag2和flag4的属性
1 | <public type="string" name="flag2" id="0x7f12003a" /> |
第二段flag
找到/res/values/strings.xml
搜索flag2
可以得到flag2
为_@r4
第四段flag
找到res/raw
下发现flag4.txt
,得到flag4
为_andr01d
提示
然后在res/values/strings.xml
里面发现提示
1 | <string name="fab_transformation_sheet_behavior">com.google.android.material.transformation.FabTransformationSheetBehavior</string> |
第一段flag
在AndroidManifest.xml
里面,我们可以看到第一个定义的activity
1 | <activity android:theme="@style/Theme.EzAndroidStudy" android:icon="@drawable/ic" android:name="work.pangbai.ezandroidstudy.MainActivity" android:exported="true"> |
通过翻Activity清单,可以看到在Homo
这个Activity下面有个flag1,可以得到第一段flag为flag{Y0u
第三段flag
在strings.xml
的底部发现第三段flag的提示
1 | <string name="third">layout 就是布局的意思呢,/res/layout 里的带 Activity 字样的 xml 文件通常是用来描述一个 Activity 的大体布局,你能找到布局里藏起来的 flag 吗喵?</string> |
让我们去翻layout,然后在/res/layout/activity_main.xml
找到第三段flag为_900d
第五段flag
第五段flag告诉我们要去逆向.so
文件,apk里面有两个.so
文件,想着先从小的那个开始,代码量没那么大
在libezandroidstudy.so
里面,可以找到函数Java_work_pangbai_ezandroidstudy_MainActivity_getflag5
,在底下能够看到flag5为_r4V4rs4r}
合并flag
flag合起来就变成了flag{Y0u_@r4_900d_andr01d_r4V4rs4r}
Simple_encryption
一眼秒的算法
【难度:简单】
透过IDA我们可以看到算法具体如下
则有输入字符 input[j]
的计算方式为:
- 如果
j % 3 == 0
:input[j] = buffer[k] + 31
- 如果
j % 3 == 1
:input[j] = buffer[k] - 41
- 如果
j % 3 == 2
:input[j] = buffer[k] ^ 0x55
双击伪代码里的buffer,可以得到它的值
于是可以写出解密代码
1 | buffer = [ |
运行得到flag
ez_debug
动态调试(可能xdbg会更简单哦)
【难度:简单】
题目告诉我们用xdbg调试,就试试呗(反正没用过)
我先 右键->搜索->所有模块->字符串 看看能不能找到什么东西,但是找不到,只能看到一些可阅读的有意义的东西,所以我咋这些地方按下了F2设置了一下breakpoint
然后不断步进,在输入了flag后,可以看到调用了0x401D2A的Decrypted flag
,在这个周围可以看到flag为flag{y0u_ar3_g0od_@_Debu9}
PWN
Real login
通过IDA查看附件的文件,在func
函数里面可以直接看到密码
所以nc一下容器,直接输入密码就可以得到shell了
Game
不会连最简单的加法都不会吧
【难度:签到】
使用IDA反编译可以看到返回shell的条件是v1的值大于999,而我们每次输入的值要在0-10之间才能继续输入
所以写一个Python脚本
1 | from pwn import * |
然后ls一下发现flag就在当前目录,给cat出来就有了
CRYPTO
Base
This is a base question!
4C4A575851324332474E324547554B494A5A4446513653434E564D444154545A4B354D45454D434E4959345536544B474D5134513D3D3D3D
【难度:签到】
都说了是Base,但是没有Base的特征,看到尾巴3D连续,应该是十六进制码,先16进制转出来,发现是四个等号,猜Base32,还没出结果,再试试Base64,结束战斗,flag为flag{B@sE_0f_CrYpt0_N0W}
xor
如果再来一次的话,就能回到从前,一切都会好起来的
【难度:签到】
xor就是异或嘛,异或的性质就是a^b=c, a^c=b, b^c=a这样的,所以可以逆着回去,这里题目如下
1 | #As a freshman starting in 2024, you should know something about XOR, so this task is for you to sign in. |
可以得知c1异或的对象为New_Star_CTF
编码后转成long数,且m1包含flag的前半部分,m2包含flag的后半部分
所以写一个解密脚本
1 | from pwn import xor |
就能够得到flag了
一眼秒了
n小小的也很可爱
【难度:简单】
提示我们n的值很小了,题目代码如下
1 | from Crypto.Util.number import * |
所以可以直接用计算机暴力破解,写出解密脚本
1 | from sympy import factorint |
然后就能得到flag:flag{9cd4b35a-affc-422a-9862-58e1cc3ff8d2}