吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1729|回复: 4
收起左侧

[CTF] 【2022春节】解题领红包之番外篇 {Web 中级题}

[复制链接]
QAQ~QL 发表于 2022-2-16 00:19
本帖最后由 QAQ~QL 于 2022-2-18 19:14 编辑

思路
  • 中级题,Web题,先搭起来看看
图片-1.png
解压,文件为52tube.saz和52tube.wacz,saz为Fiddler文件,导入查看
图片-2.png
发现为ts视频,查找key和iv在所有链接中/api/drm较为符合32位字串08A5E6C2C261A8ACB4D79C49AF160A3ADA4E5CEAE16FED46EB6F498C9B63D53B
图片-3.png
但m3u8中为AES-128-CBC无iv加密,秘钥长度应为16位,遂排除直接解密,虚拟机模拟环境直接搭建
图片-4.png
搭建完毕,打开页面,发现29秒视频,但加载失败
图片-5.png
参考官网示例MEDIA_ERR_ABORTED - 取回过程被用户中止无法找到原因
遂下断点查看
图片-6.png
[PHP] 纯文本查看 复制代码
//Uint8Array转字符串
const Uint8ArrayToString=function(fileData) {
        var dataString = "";
        for (var i = 0; i < fileData.length; i++) {
                dataString += String.fromCharCode(fileData[i]);
        }
        return dataString
}

//字符串转Uint8Array
const stringToUint8Array=function(str) {
        var arr = [];
        for (var i = 0, j = str.length; i < j; ++i) {
                arr.push(str.charCodeAt(i));
        }
        var tmpUint8Array = new Uint8Array(arr);
        return tmpUint8Array
}

//Uint8Array转Hex
const U8A2Hex=function(uint8Array) {
        return Array.prototype.map.call(uint8Array, (x) => ('00' + x.toString(16)).slice(-2)).join('');
}

//Hex转Uint8Array
const Hex2Uint8Array=function(hex){
        var typedArray = new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function (h) {
                return parseInt(h, 16)
        }))
        return typedArray
}

//ArrayBuffer转Hex
const B2hex=function(buffer) {
        //return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
        return Array.prototype.map.call(new Uint8Array(buffer), x => (x.toString(16)).slice(-2)).join('');
}

//Hex转ArrayBuffer
const Hex2ArrayBuffer=function(hex){
        var typedArray = new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function (h) {
                return parseInt(h, 16)
        }))
        return typedArray.buffer
}

图片-7.png
iv    : 000000000000000[0-7]key : ef8d9c7c7b31b626ab204804ae5852d3发现key值飘忽不定,否决前面的观点再次查看drm,发现为post方法,遂逐一检查method
图片-8.png
除了该接口,其他都为get,此处的不小心下次一定改详查可知,ping通后继续访问drm,在此期间生成h和id
[PHP] 纯文本查看 复制代码
o.onSuccess = function(t, e, a) {
        (async function(t) {
                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);
                var a = {
                        method: "POST",
                        headers: {
                                "Content-Type": "application/x-www-form-urlencoded"
                        },
                        body: r
                };
                let o = await fetch(i, a),
                        l = await o.arrayBuffer();
                if (32 !== l.byteLength)
                        throw new Error("Invalid response");
                let u = new Uint8Array(l.slice(0, 16)),
                        c = new Uint8Array(l.slice(16, 32));
                return s(s(u, e), c)
        })(r).then((t => {
                l({
                        data: t.buffer
                }, e, a)
        }))
}
由代码可知h由e算出,e是根据随机数和时间戳而定的即 逆向出e的值即可赋值hook

[PHP] 纯文本查看 复制代码
//t=e.buffer
function n(t) {
        return [...new Uint8Array(t)].map((t => t.toString(16).padStart(2, "0"))).join("")
}

由函数n(t)可知,此过程为buffer转hex,所以目标h=7b10311e6e310f0df068d9ede10475a8的对应t->即e为
[PHP] 纯文本查看 复制代码
e=Hex2Uint8Array("7b10311e6e310f0df068d9ede10475a8")

crypto.getRandomValues(t);
let e = new Uint8Array("7b10311e6e310f0df068d9ede10475a8".match(/[\da-f]{2}/gi).map(function (h) {
        return parseInt(h, 16)
}))

修改js,F5,结果如下
图片-9.png
得到正确视频,注意s小写
图片-10.png
视频提取工具感谢github作者 Momo707577045
https://github.com/Momo707577045/media-source-extract
视频过大,不进行上传

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

菠萝蜜 发表于 2022-2-16 11:34
前排来学习了
じ☆ve不哭 发表于 2022-2-16 12:04
Meiosis 发表于 2022-2-16 12:39
Hmily 发表于 2022-2-17 16:12
@QAQ~QL 这个也需要处理。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-16 12:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表