有编程基础,汇编半桶水,没玩过脱壳,磕磕碰碰完成了除Android之外的题目,也算是一次学习了。
Windows的解题思路大差不差,已经很多分享了,分享下个人Web题的思路。
1. Fiddler加载saz大体看下,是个m3u8视频,答案应该在视频里
2. 先搞个web服务跑起来看看,为了方便直接golang写一个,网页的静态文件从Fiddler中保存下来
[Golang] 纯文本查看 复制代码
package mainimport ( "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视频合并等问题,因为本身对这些也不太了解,以上。