第二题 Windows初级题
初级题是一年一度的送分题,直接拖入OD
在输入口令的入口F12暂停程序,输入口令后F8单步执行,查看代码逻辑得到口令长度是0x24=36字符,替换36字符口令后重新执行,分支再往下F8执行明文口令就会出现了
第三题 Android 初级题
之前一直没做过安卓题的,今年尝试挑战一下
用到的工具 apktool, zipalign, keytool, apksigner, jadx-gui
打开app是一个抓猫游戏,解压看源码是内嵌的H5页面,看逻辑是游戏成功后回调安卓的方法AndroidInterface.onSolverReturnValue(-1);
思路一:修改游戏获胜条件,index文件的游戏初始化中把initialWallCount参数改为 100,会生成一个全是墙的地图
把apk重新打包、签名,随便点两下游戏就胜利了,播放完视频获得flag
思路二:使用jadx-gui查看安卓的源码,游戏成功后播放视频,播放完成后执行数据提取方法 YSQDActivity.extractDataFromFile
代码比较简单,在ys.mp4中找flag字符
用文本编辑器打开ys.mp4搜索flag即可,口令在文件最末尾
第四题 Android 初级题
思路一
抽奖游戏,游戏?
用游戏修改器,搜索纠缠之缘个数,10个然后减少会定位到内存,固话成100个然后抽奖就会出来了
思路二
看代码,发现有两个Activity,FlagActivity就是flag了
可以用adb直接执行FlagActivity
adb shell am start -n "com.kbtx.redpack_simple/.FlagActivity"
思路三
修改代码,比较麻烦的是有签名校验,需要先动态调试吧原签名拿到,写回到修改后的apk里,动态调试环境没有装,就没有尝试了
至此是三道初级题的思路过程,下面是对Web题的分享,今年的Web题做的还是很过瘾的,有遇到障碍也通过各种途径得到了解决
Web题全部
按解题顺序
静态FLAG
flag3:
视频开头的马赛克里,需要用高清模式,动态播放就能看到,最开始用的低清晰度只看到一团糊,可以从github上把原视频下载了用播放器播放
flag1:
视频第二秒的白点,原视频逐帧播放背影里隐藏的flag1
被切割的二维码,拼接后得到题目的网址
https://2024challenge.52pojie.cn/
flag2:
登录网址的http请求头中直接给出了
flag2
flag4:
请求中的图片
https://2024challenge.52pojie.cn/flag4_flag10.png
flag4可以直接看到flag4{YvJZNS}
flag10应该是隐写的,后面再说
flag5:
查看网页的源码发现上方一段隐藏的代码,包含flag5和flag9
把代码中字母单独提出来就是
flag5{P3prqF}
flag9:
开始以为又是代码混淆后面发现不是的,把源码pre中的style部分都去掉,然后调整浏览器窗口大小让flag5在第一列,后面就可以看出flag9了
flag9{KHTALK}
flag6:
这个flag拿的最轻松,打开网页后去做别的事了,回来时候就自己出来了,后面看了一下源码是计算的md5,结果是1c450bbafad15ad87c32831fa1a616fc,找一个工具分析一下就能得到
flag6{20240217}
flag7:
github的commit
flag8:
到flag8难度就有点大了,2048的游戏,先前在测试登陆时候要求是整型数,就试了一下用99999999999999999999登陆得到过数字18446744073709551615,应该就是一个溢出数了
经过计算得到每个商品的溢出购买数量
100:184467440737095517
50:368934881474191033
10000:193690812773950292
999063388:18464037713
这里10000这个计算时最麻烦的了,按这个数量购买后使用道具得到flag8{OaOjIK}和flagB
flag10:
按顺序做的题,开始没管这个,后面做的时候也没什么思路,偶然用2345浏览器的图片查看器打开,识别的界面直接显示出来了,后面尝试用微信的问题提取功能也能获取flag10
flag11:
查看源码分析是将一张图通过打乱顺序重新显示,图片是52PoJie网站中的图,去爱盘里找到图片,然后找了两个临近的图块
div的id是a058和a168
两个色块经过计算坐标应该是临近的,二元一次方程
x1+30=x1,y1==y2,在css中找到四个参数带入
a058 x1 226.60096310062204px + 2.622668193459319px * var(--var1) + 10.859479758188318px * var(--var2)
y1 188.16846716024213px + 1.7206512016517566px * var(--var1) + 0.9832648761241585px * var(--var2)
a168 x2 601.6223595107299px + 0.5707338244233702px * var(--var1) + 0.8927769477605401px * var(--var2)
y2 76.53409640067281px + 3.5080465123001012px * var(--var1) + 0.21973006130100003px * var(--var2)
计算得到var1 = 71, var2 = 20
修改css参数得到原图,flag11{HPQfVF}
flag12:
wasm代码,直接输入是没用的,经过查询各指令的功能,分析出是一个三元组操作,输入是什么其实不重要,要计算也比较麻烦,对结果的处理是做字符串拼接,那直接用明文给出的 1213159497 拼接就好了,得到flag12{HOXI}
动态FLAG
接下来是三个动态Flag
FlagA:
这个花费了最多时间,其实一点也不难
开始还想着破解Cookie后面发现纯属想多了,A开始一直没有思路后面做2048时候发现游戏存档的加密规则和登陆时候的Cookie是相同的,拿游戏存放放进uid的cookie里还返回了存档数据,这不就是A的接口嘛,把FlagA的Cookie值放到uid里访问uid接口,得到明文FlagA
FlagB:
FlagB拿的其实很简单,在拿flag8时候已经计算了溢出边界,计算一下就拿到了边界购买对应数量道具即可,flagB数量18464037713
使用道具得到FlagB
FlagC:
前端的图像识别,挺有意思的,查看源码发现识别部分应该没有坑,问题点在物体位置,位置正确通过/flagC/verify
接口做校验
第一步 构造labels0-100,获取正确label 3,5,8,修改数量确定结果数量为4个
第二经过分析得出结果只检测图的位置,划分成九宫格,对每个类别进行测试
九宫格坐标:
"boxes": [
0, 0, 0.2, 0.2,
0, 0.5, 0.2, 0.2,
0, 1, 0.2, 0.2,
0.5, 0, 0.2, 0.2,
0.5, 0.5, 0.2, 0.2,
0.5, 1, 0.2, 0.2,
1, 0, 0.2, 0.2,
1, 0.5, 0.2, 0.2,
1, 1, 0.2, 0.2
]
每个类别测试即可得到对应的坐标位置,没人结果应该也是有所区别的,下面是我的摆放物体和位置
3 motorcycle 0, 0, 0.2, 0.2
5 bus 0, 1, 0.2, 0.2
8 boat 1, 0, 0.2, 0.2
8 boat 1, 1, 0.2, 0.2
得到flagC{d17c9ff7}
完结撒花