有编程基础,汇编半桶水,没玩过脱壳,磕磕碰碰完成了除Android之外的题目,也算是一次学习了。
Windows的解题思路大差不差,已经很多分享了,分享下个人Web题的思路。
1. Fiddler加载saz大体看下,是个m3u8视频,答案应该在视频里
2. 先搞个web服务跑起来看看,为了方便直接golang写一个,网页的静态文件从Fiddler中保存下来
[Golang] 纯文本查看 复制代码 package main
import (
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
func main() {
e := echo.New()
// Middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
// Routes
e.Static("/", "web")
e.GET("/api/ping/", HandleApiPing)
e.POST("/api/drm/", HandleApiDrm)
e.Start(":80")
}
func HandleApiPing(c echo.Context) error {
return c.String(200, "success")
}
func HandleApiDrm(c echo.Context) error {
return c.String(200, string([]byte{
0x08, 0xA5, 0xE6, 0xC2, 0xC2, 0x61, 0xA8, 0xAC, 0xB4, 0xD7, 0x9C, 0x49, 0xAF, 0x16, 0x0A, 0x3A,
0xDA, 0x4E, 0x5C, 0xEA, 0xE1, 0x6F, 0xED, 0x46, 0xEB, 0x6F, 0x49, 0x8C, 0x9B, 0x63, 0xD5, 0x3B}))
}
3. 意料之中的无法播放,再次Fiddler抓包,发现/api/drm/请求中h参数变化,去js中寻找来源,是个随机字符串
[JavaScript] 纯文本查看 复制代码 let e = await async
function() {
let t = new Uint8Array(16);
crypto.getRandomValues(t);
let e = n(t.buffer) + Date.now() + Math.random();
return new Uint8Array((await async
function(t) {
const e = (new TextEncoder).encode(t);
return await crypto.subtle.digest("SHA-256", e)
} (e)).slice(0, 16))
} ();
var r = new URLSearchParams;
r.append("h", n(e.buffer)),
r.append("id", t);
猜想把h值固定为fiddler中的缓存值即可,修改js代码为
[JavaScript] 纯文本查看 复制代码 let e = await async
function() {
var hex = '7b10311e6e310f0df068d9ede10475a8';
return new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function(h) {
return parseInt(h, 16)
}))
} ();
var r = new URLSearchParams;
r.append("h", n(e.buffer)),
r.append("id", t);
再次访问,正常播放视频,视频中找到正确flag
解题思路存在运气成分,没有涉及到m3u8的AES加密或ts视频合并等问题,因为本身对这些也不太了解,以上。 |