JS逆向之wasm逆向(二)

news2024/11/15 21:21:14

本文仅供技术交流和技术学习 不做其他用途
接着上一篇继续讲:

上篇地址:
JS逆向之wasm逆向(二进制)
网址:
aHR0cHM6Ly93d3cuN3E2Y3lqLmNvbTo5MDAxL3JlZ2lzdGVyNDY5Njg/aV9jb2RlPTQ0Mjc5OTU1

这个网站我们后面可以继续讲他的debugger 和滑块和登录加密
上一篇我们把定位和原理讲得差不多了 现在讲这个我们怎么去调用他;
请添加图片描述
两种方法调用:
我们这里只讲一种 node调用 因为c调用的话估计很多人听不懂了 比较麻烦。
node里面有WebAssembly这个api 比较坑就是必须版本16以上的node才能调用的
cmd查看node的版本 自己查看一下版本

node --version

请添加图片描述在这里插入
后面我们来分析代码

    function() {
        var e, c, t, f, n = {};
        var d = {
            38464: function() {
                return {
                    "./wasm_api_sign_bg.js": {
                        __wbg_now_513c8208bd94c09b: function() {
                            return void 0 === e && (e = a.c[88867].exports),
                            e.ei()
                        },
                        __wbg_random_9f33d5bdc74069f8: function() {
                            return void 0 === c && (c = a.c[88867].exports),
                            c.Aw()
                        },
                        __wbg_floor_a68aa7c1b572044e: function(e) {
                            return void 0 === t && (t = a.c[88867].exports),
                            t.OS(e)
                        },
                        __wbindgen_throw: function(e, c) {
                            return void 0 === f && (f = a.c[88867].exports),
                            f.Or(e, c)
                        }
                    }
                }
            }
        }
          , r = {
            2284: [38464]
        };
        a.w = {},
        a.f.wasm = function(e, c) {
            (r[e] || []).forEach((function(t, f) {
                var r = n[t];
                if (r)
                    c.push(r);
                else {
                    var b, o = d[t](), i = fetch(a.p + "static/wasm/" + {
                        2284: {
                            38464: "63d1a0a2a2e13f93b6f2"
                        }
                    }[e][t] + ".wasm");
                    if (o && "function" === typeof o.then && "function" === typeof WebAssembly.compileStreaming)
                        b = Promise.all([WebAssembly.compileStreaming(i), o]).then((function(e) {
                            return WebAssembly.instantiate(e[0], e[1])
                        }
                        ));
                    else if ("function" === typeof WebAssembly.instantiateStreaming)
                        b = WebAssembly.instantiateStreaming(i, o);
                    else {
                        b = i.then((function(e) {
                            return e.arrayBuffer()
                        }
                        )).then((function(e) {
                            return WebAssembly.instantiate(e, o)
                        }
                        ))
                    }
                    c.push(n[t] = b.then((function(e) {
                        return a.w[t] = (e.instance || e).exports
                    }
                    )))
                }
            }
            ))
        }
    }()

他用fetch去加载了wasm的代码 (相对网络请求去获取二进制文件)

下面是我们改写的代码

var o = function () {
    return {
        "./wasm_api_sign_bg.js": {
            __wbg_now_513c8208bd94c09b: function () {
                return  Date.now()
            },
            __wbg_random_9f33d5bdc74069f8: function () {
                return Math.random()
            },
            __wbg_floor_a68aa7c1b572044e: function (e) {
                return Math.floor(e)
            },
            __wbindgen_throw: function (e, c) {
                return void 0 === f && (f = a.c[88867].exports),
                    f.Or(e, c)
            }
        }
    }
};
let i = fetch("https://www.7q6cyj.com:9001/_next/static/wasm/63d1a0a2a2e13f93b6f2.wasm");let b = WebAssembly.instantiateStreaming(i, o())
b.then(function(e) {
 let s=e.instance.exports;
 console.log(s)
}
)
​
​
​
​
​

写完之后执行就拿到了sign方法 和其他几个我们需要执行的方法 o方法非常的简单 我这里怎么还原的 你们随便调试一下就知道了
请添加图片描述
WebAssembly.instantiateStreaming这个方法的讲解可以去官网看一下https://developer.mozilla.org/zh-CN/docs/WebAssembly/JavaScript_interface/instantiateStreaming_static

这里下面就继续跟着我们咋天调试的步伐继续还原 还原b方法 b方法里面取值的一些方法就不一一调试了 里面的方法非常的简单
请添加图片描述

var o = function () {
    return {
        "./wasm_api_sign_bg.js": {
            __wbg_now_513c8208bd94c09b: function () {
                return Date.now()
            },
            __wbg_random_9f33d5bdc74069f8: function () {
                return Math.random()
            },
            __wbg_floor_a68aa7c1b572044e: function (e) {
                return Math.floor(e)
            },
            __wbindgen_throw: function (e, c) {
                return void 0 === f && (f = a.c[88867].exports),
                    f.Or(e, c)
            }
        }
    }
};
let i = fetch("https://www.7q6cyj.com:9001/_next/static/wasm/63d1a0a2a2e13f93b6f2.wasm");
let f=0;
function a(n, e, t,rs) {
    let r = n.length
        , o = e(r);
    const u = c(rs);
    let i = 0;
    for (; i < r; i++) {
        const e = n.charCodeAt(i);
        if (e > 127)
            break;
        u[o + i] = e
    }
    if (i !== r) {
        0 !== i && (n = n.slice(i)),
            o = t(o, r, r = i + 3 * n.length);
        const e = c().subarray(o + i, o + r);
        i += _(n, e).written
    }
    return f = i,
        o
​
}
function w(r) {
    let l = new Int32Array(r.memory.buffer);
    return l;
}
function c(r) {
    return new Uint8Array(r.memory.buffer);
}
let u = new ("undefined" === typeof TextDecoder ? (0,
    n.require)("util").TextDecoder : TextDecoder)("utf-8", {
        ignoreBOM: !0,
        fatal: !0
    });
function is(n, e, r) {
    return u.decode(c(r).subarray(n, n + e));
}
let b = WebAssembly.instantiateStreaming(i, o())
b.then(function (e) {
    let r = e.instance.exports;
    const u = r.__wbindgen_add_to_stack_pointer(-16)
        , c = a("/act/api", r.__wbindgen_malloc, r.__wbindgen_realloc,r)
        , d = f
        , _ = a("prod", r.__wbindgen_malloc, r.__wbindgen_realloc,r)
        , l = f
    r.sign(u, c, d, _, l);
    var t = w(r)[u / 4 + 0]
        , o = w(r)[u / 4 + 1];
    console.log(is(t, o, r))
}
)
​
​
​
​
​

执行结果输出
请添加图片描述

感兴趣的朋友去可以看看这个网站 里面有滑块 debugger 还有wasm 这些都值得去练习和玩玩的

感谢大家观看 拜拜
欢迎大家关注我的公众号 后面会持续输出更多的好文章

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1243223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 整合MyBatis-Plus 详解

MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 全新的 MyBatis-Plus 3.0 版本基于 JDK8&#xff0c;提供了 lambda 形…

【数据结构】树和二叉树详解

目录 1. 前言2. 树概念及结构2.1. 树的概念2.2. 与树有关的一些概念2.3. 树与非树2.4. 树的表示 3. 二叉树概念及结构3.1. 二叉树概念3.2. 特殊的二叉树3.3. 二叉树的性质3.4 二叉树的存储结构3.4.1 顺序存储3.4.2 链式存储 3.5 堆 1. 前言 在前面我们一起了解的数据结构有顺序…

振南技术干货集:制冷设备大型IoT监测项目研发纪实(6)

注解目录 1.制冷设备的监测迫在眉睫 1.1 冷食的利润贡献 1.2 冷设监测系统的困难 &#xff08;制冷设备对于便利店为何如何重要&#xff1f;了解一下你所不知道的便利店和新零售行业。关于电力线载波通信的论战。&#xff09; 2、电路设计 2.1 防护电路 2.1.1 强电防护 …

初识JVM(简单易懂),解开JVM神秘的面纱

目录 一、什么是JVM&#xff08;Java虚拟机&#xff09;&#xff1f; 二、JVM的功能 三、JVM的功能-即时编译 四、常见的JVM 五、JVM的组成 五、JVM的工作流程 参考资料 一、什么是JVM&#xff08;Java虚拟机&#xff09;&#xff1f; 在Java的世界里&#xff0c;Java虚…

【实验】配置用户自动获取IPv6地址的案例

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等​编辑https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【…

云贝教育 |【技术文章】PG的缓存管理器原理

PG的缓存管理器原理 缓冲区管理器管理共享内存和持久存储之间的数据传输 &#xff0c; 它会对 DBMS 的性能产生重大影响。 PostgreSQL 缓冲区管理器工作非常高效。 本章介绍 PostgreSQL 缓冲区管理器。第一部分提供概述 &#xff0c;后续部分描述以下主题&#xff1a; 缓冲…

OSG动画与声音-路径动画之导出与导入(2)

路径的导出示例 路径的导出示例的代码如程序清单10-2所示。 1. // 创建路径 2. osg::ref_ptr<osg::AnimationPath> createAnimationPath(osg::Vec3 ¢er, 3. float radius, float looptime) 4. { 5. // 创建一个Path对象 6. osg::ref_ptr<…

【史上最细教程】服务器MySQL数据库完成主从复制

文章目录 MySQL完成主从复制教程准备&#xff1a;原理&#xff1a;步骤&#xff1a; 推荐文章 MySQL完成主从复制教程 主从复制&#xff08;也称 AB 复制&#xff09;就是将一个服务器&#xff08;主服务器&#xff09;的数据复制到一个或多个MySQL数据库服务器&#xff08;从…

云安全之盾:ZStack 云主机安全防护解决方案全方位保护云环境

随着云计算的蓬勃发展&#xff0c;网络威胁愈发复杂&#xff0c;涵盖了从勒索病毒到APT攻击的各种威胁类型。在这一风云变幻的网络安全环境下&#xff0c;云主机安全不再仅仅是一个选项&#xff0c;它是信息系统安全的核心要素。云轴科技ZStack 云主机安全防护解决方案是为了满…

java项目之品牌银饰售卖平台(ssm+vue)

项目简介 主要功能包括首页、个人中心、用户管理、促销活动管理、饰品管理、我的收藏管理、系统管理、订单管理等。管理员模块: 管理员可以查询、编辑、管理每个用户的信息和系统管理员自己的信息&#xff0c;同时还可以编辑、修改、查询用户账户和密码&#xff0c;以及对系统…

项目管理套路:看这一篇绝对够用❤️

写论文必不可少的&#xff0c;就是创建代码并进行实验。好的项目管理可以让实验进行得更加顺利。本篇博客以一次项目实践为例&#xff0c;介绍项目管理的方法&#xff0c;以及可能遇到的问题&#xff0c;并提供一些可行的解决方案。 目录 项目管理工具开始第一步版本管理十分关…

微信小程序:This Mini Program cannot be opened as your Weixin version is out-of-date.

项目场景&#xff1a; 问题描述 升级基础库3.2.0&#xff0c;然后PC端整个小程序都打不开了&#xff0c;点击小程序提示”This Mini Program cannot be opened as your Weixin version is out-of-date. Update Weixin to the latest version.“&#xff0c;并且点击Update Wei…

成为AI产品经理——模型构建流程(下)

目录 1.模型训练 2.模型验证 3.模型融合 4.模型部署 上节课我们讲了模型设计、特征工程&#xff0c;这节课我们来讲模型构建剩下的三个部分&#xff1a;模型训练、模型验证和模型融合。 1.模型训练 模型训练就是要不断地训练、验证、调优直至让模型达到最优。 那么怎么达…

Linux系统装宝塔面板提示磁盘空间不足如何清理,检测到当前磁盘超过80%,空间不足如何清理

Linux系统装宝塔面板提示磁盘空间不足如何清理&#xff0c;检测到当前磁盘超过80%&#xff0c;空间不足如何清理 今天登陆服务器查看到磁盘空间满&#xff0c;如题这部分属于运维问题&#xff0c;如果直接点击 如何直接点立即清理会跳转企业版购买&#xff0c;1599CNY对普通用…

如何做一个简单的深度集成学习框架

使用同一个框架&#xff0c;独立在一个数据集上面&#xff0c;分别训练多次&#xff0c;每个单独模型训练超参数可以一样&#xff0c;也可以不一样&#xff0c;最后若干个训练好的独立模型在测试集数据上面做最后集中决策。 实例代码如下&#xff1a; class MyEnsemble(nn.Modu…

CVE-2023-6099:优卡特脸爱云一脸通智慧管理平台SystemMng.ashx接口未授权漏洞复现

文章目录 优卡特脸爱云一脸通智慧管理平台未授权SystemMng.ashx接口漏洞复现&#xff08;CVE-2023-6099&#xff09; [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 优卡特脸爱云一脸通智慧管理平台未授权…

eNSP-远程登陆实验

实验拓扑&#xff1a; 实验需求&#xff1a; 1. 如图所示&#xff0c;配置设备名称和IP地址 2. 配置R2的远程登录vty接口0-4&#xff0c;完成以下需求&#xff1a; 1&#xff09;采用接口password的验证方式&#xff0c;口令为"spoto"&#xff08;不含引号&#xf…

为何越来越多的程序员纷纷转行网络安全?

目前&#xff0c;我国IT行业的人才结构不断升级&#xff0c;公司对程序员的要求越来越高&#xff0c;出现了大量的裁员现象&#xff0c;导致很多的程序员纷纷想转行的想法。 可能对于早期的程序员而言&#xff0c;学好编程语言就能找到比较好的工作。而现在伴随着互联网的不断发…

美国大学陪读签证申请条件是什么?

美国大学陪读签证是留学生的家庭成员在美国陪同留学生就读期间的签证类型。申请该签证需要满足一定的条件&#xff0c;这些条件通常包括&#xff1a; 1.申请人身份关系证明&#xff1a;申请人必须是留学生的家庭成员&#xff0c;如配偶或子女&#xff0c;需要提供证明文件&…

Lua脚本解决redis实现的分布式锁多条命令原子性问题

线程1现在持有锁之后&#xff0c;在执行业务逻辑过程中&#xff0c;他正准备删除锁&#xff0c;而且已经走到了条件判断的过程中&#xff0c;比如他已经拿到了当前这把锁确实是属于他自己的&#xff0c;正准备删除锁&#xff0c;但是此时他的锁到期了&#xff0c;那么此时线程2…