Shopee算法分析 - 算法分析二(与URL有关的Key)

news2025/2/26 9:25:07

http://blog.androidcrack.com/index.php/archives/39/

在Unidbg文章中, 我们尝试过多次主动调用, 文中可以发现, 只有253b8c85 这个的key是不变的.

image-20241217140300974

Unidbg运行一遍,搜索运行下这个Key, 我们在下面的堆栈中, 可以看到memcpy的调用地址为0x0498ec

image-20241217140524043

Unidbg trace整个流程, 在010editor中搜索253b8c85

可以发现,我们这个数据首次发现的位置位于0x1bfb54偏移处.

image-20241217145718955

可以知道我们的结果是由 0xa53b8c85 & 0x7fffffff得到的.

[14:54:36 435][libshpssdk.so 0x1bfb54] [ab010b0a] 0x401bfb54: "and w11, w13, w11" w13=0x7fffffff w11=0xa53b8c85 => w11=0x253b8c85 // w11 = w13 & w11

w13又是固定的. 所以我们需要找到0xa53b8c85是如何生成的

image-20241217155446249

💡分析trace, 我们应该以结果为导向. 只关注于我们需要的数据. 一些其他无用的运算我们应该选择性跳过. 一行行分析下去十分的疲惫.

搜索0xa53b8c85, 找到第一次出现的地方.

image-20241217155623792

w14 = w1 + w14 , w1 比较简单, 我们先分析复杂的.

[14:54:36 426][libshpssdk.so 0x1bfe28] [2e000e0b] 0x401bfe28: "add w14, w1, w14" w1=0x65 w14=0xa53b8c20 => w14=0xa53b8c85

搜索0xa53b8c20, 找到第一次出现的地方

w11 = w11 * w13

[14:54:36 423][libshpssdk.so 0x1bfcb0] [6b7d0d1b] 0x401bfcb0: "mul w11, w11, w13" w11=0x334b w13=0xa1f6f060 => w11=0xa53b8c20

搜索0xa1f6f060, 找到第一次出现的地方

w14 = w1 + w14

[14:54:36 416][libshpssdk.so 0x1bfe28] [2e000e0b] 0x401bfe28: "add w14, w1, w14" w1=0x75 w14=0xa1f6efeb => w14=0xa1f6f060

搜索0xa1f6efeb, 找到第一次出现的地方

w11 = w11 * 13

[14:54:36 413][libshpssdk.so 0x1bfcb0] [6b7d0d1b] 0x401bfcb0: "mul w11, w11, w13" w11=0x334b w13=0xf419b1e1 => w11=0xa1f6efeb

搜索0xf419b1e1, 找到第一次出现的地方

w14 = w1 + w14

[14:54:36 406][libshpssdk.so 0x1bfe28] [2e000e0b] 0x401bfe28: "add w14, w1, w14" w1=0x72 w14=0xf419b16f => w14=0xf419b1e1

搜索0xf419b16f,找到第一次出现的地方

w11 = w11 * w13

[14:54:36 403][libshpssdk.so 0x1bfcb0] [6b7d0d1b] 0x401bfcb0: "mul w11, w11, w13" w11=0x334b w13=0x8c687fed => w11=0xf419b16f

有兴趣的继续找下去. 我是比较累了. 我们再来看看规律.

[14:54:36 403][libshpssdk.so 0x1bfcb0] [6b7d0d1b] 0x401bfcb0: "mul w11, w11, w13" w11=0x334b w13=0x8c687fed => w11=0xf419b16f
[14:54:36 406][libshpssdk.so 0x1bfe28] [2e000e0b] 0x401bfe28: "add w14, w1, w14" w1=0x72 w14=0xf419b16f => w14=0xf419b1e1
[14:54:36 413][libshpssdk.so 0x1bfcb0] [6b7d0d1b] 0x401bfcb0: "mul w11, w11, w13" w11=0x334b w13=0xf419b1e1 => w11=0xa1f6efeb
[14:54:36 416][libshpssdk.so 0x1bfe28] [2e000e0b] 0x401bfe28: "add w14, w1, w14" w1=0x75 w14=0xa1f6efeb => w14=0xa1f6f060
[14:54:36 423][libshpssdk.so 0x1bfcb0] [6b7d0d1b] 0x401bfcb0: "mul w11, w11, w13" w11=0x334b w13=0xa1f6f060 => w11=0xa53b8c20
[14:54:36 426][libshpssdk.so 0x1bfe28] [2e000e0b] 0x401bfe28: "add w14, w1, w14" w1=0x65 w14=0xa53b8c20 => w14=0xa53b8c85
[14:54:36 435][libshpssdk.so 0x1bfb54] [ab010b0a] 0x401bfb54: "and w11, w13, w11" w13=0x7fffffff w11=0xa53b8c85 => w11=0x253b8c85 // w11 = w13 & w11

通过上面的跟值找值, 可以发现我们最终的结果. 可以大致的翻译成如下大白话:

循环(条件未知){
    结果 =  (上一次运算的结果 * 0x334b + 未知的字节)
}
结果 = 结果 & 0x7fffffff

因为可以猜测到循环, 并且, 我们目前需要知道,这个未知的字节是什么?

所以我再次搜索0x401bfe28: "add w14, w1, w14" w1=

我们只需要,这个框框选择出来的长的指令. 所以我们匹配到的结果

image-20241217161242097

手动处理了一点数据, 把选择的字节提取出来.

image-20241217161816066

惊奇的发现.这数据有点好看.

image-20241217161906791

没错,这就是我们的URL

image-20241217162008817

并且开头是以0x00开始的

image-20241217162133515

所以, 我们就可以写一个算法进行验证了


url = "/api/v4/search/search_page_common?by=relevancy&extra_param=%7B%22global_search_session_id%22%3A%22NqAYm66NYy45DbQoklaKEBuaQD%2BQgayKLEeqNuK3MhM%3D-1734075545797-global%22%2C%22search_session_id%22%3A%22NqAYm66NYy45DbQoklaKEBuaQD%2BQgayKLEeqNuK3MhM%3D-1734075560832-search%22%7D&keyword=ab&newest=0&order=desc&page=1&page_type=search&scenario=PAGE_GLOBAL_SEARCH&version=2&view_session_id=NqAYm66NYy45DbQoklaKEBuaQD%2BQgayKLEeqNuK3MhM%3D-1734075560832&with_filter_config=true"
result = 0
for i in url:
    b = i.encode('utf-8')
    # 使用 & 0xffffffff 可以模拟 C/C++ 等语言中 uint32_t 的行为
    # 保证结果始终在 0 到 4294967295 之间"
    b = ord(b) & 0xffffffff
    result = (result * 0x334b + b) & 0xffffffff
    # toHex
    print(hex(result))
result = result & 0x7fffffff
print(f"{result:04x}")

运算结果正确.

image-20241217164932715

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

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

相关文章

ChatGPT重大更新:新增实时搜索和高级语音

12月17日消息,据报道,OpenAI开启了第八天技术分享直播,对ChatGPT搜索功能进行了大量更新。 此次ChatGPT新增的功能亮点纷呈。其中,实时搜索功能尤为引人注目。OpenAI对搜索算法进行了深度优化,使得用户提出问题后&…

Day9 神经网络的偏导数基础

多变量函数与神经网络 在神经网络中,我们经常遇到多变量函数。这些函数通常描述了网络的输入、权重、偏置与输出之间的关系。例如,一个简单的神经元输出可以表示为: z f ( w 1 x 1 w 2 x 2 … w n x n b ) z f(w_1x_1 w_2x_2 \ldots…

windows和LINUX下校验文件的哈希值(MD5、SHA256)

可以通过两个文件的哈希值来对比两个文件是不是一模一样,有没有缺失 1、windows CertUtil -hashfile 文件路径 MD5 CertUtil -hashfile 文件路径 SHA256 2、Liunx 校验当前目录下所有文件 sha256sum . 校验指定文件名 sha256sum 文件名

使用beego操作数据库的简单web项目

1、beego介绍 Beego 是一个开源的、高性能的Go语言框架,用于快速开发RESTful API、Web应用、后端服务等各种类型的软件。它由国人Asta Xie创建,并得到了广泛的社区支持。Beego的设计理念是让开发者能够以最少的时间和代码量来完成Web应用的开发。 以下是…

IS-IS协议

IS-IS协议介绍 IS-IS(Intermediate System to Intermediate System)协议是一种链路状态的内部网关协议(IGP),用于在同一个自治系统(Autonomous System, AS)内部的路由器之间交换路由信息。IS-I…

不良人系列-复兴数据结构(栈和队列)

个人主页:爱编程的小新☆ 不良人经典语录:“相呴相济 玉汝于成 勿念 心安” 目录 一. 栈(stack) 1. 栈的概念 2. 栈的常见方法 3.栈的模拟实现 ​编辑 二. 队列 1. 队列的概念 2. 队列的使用 2.1 队列的常见方法 2.2 队列的模拟实现 2.3 队列…

机器学习04-为什么Relu函数

机器学习0-为什么Relu函数 文章目录 机器学习0-为什么Relu函数 [toc]1-手搓神经网络步骤总结2-为什么要用Relu函数3-进行L1正则化修改后的代码解释 4-进行L2正则化解释注意事项 5-Relu激活函数多有夸张1-细数Relu函数的5宗罪2-Relu函数5宗罪详述 6-那为什么要用这个Relu函数7-文…

win服务器的架设、windows server 2012 R2 系统的下载与安装使用

文章目录 windows server 2012 R2 系统的下载与安装使用1 windows server 2012 的下载2 打开 VMware 虚拟机软件(1)新建虚拟机(2)设置虚拟机(3)打开虚拟机 windows server 2012(4)进…

241217-解决Ollama无法通过配置文件修改模型下载路径的方法

A. 常规修改下载模型路径的方法 Linux怎样设置ollama保存模型的路径? - 南门子的回答 - 知乎 B. 上述方法失效时的解决方案 Is there a way to change the download/run directory? Issue #680 ollama/ollama 具体来说也就是在ollama serve 启动之前&#xff…

戴森球计划新玩法!利用MOD和cpolar实现公网环境多人游戏

文章目录 前言1. 下载MOD2.配置cpolar内网穿透3. 主机开启联机3.1 玩家加入游戏 4. 配置固定的TCP端口5. 游玩体验 前言 《戴森球计划》不仅是一款融合了科幻冒险与经营管理元素的游戏,更是一个让玩家在浩瀚宇宙中尽情探索和创造的平台。在这个游戏中,你…

农田“智能管家”:道品科技农业移动式水肥一体机

一、农业移动式水肥一体机的兴起背景 (一)现代农业面临的挑战 在全球人口持续增长的大背景下,如今的粮食需求较以往有了大幅度增加。据相关统计数据显示,预计到 2030 年,全世界仍有近 6 亿人口长期食物不足。为了保障…

计算机进制的介绍

一.进制介绍 对于整数,有四种表示方式: 1)二进制:0,1,满2进1。 在golang中,不能直接使用二进制来表示一个整数,它沿用了c的特点。 参考:Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 //赋值…

3D Gaussian Splatting for Real-Time Radiance Field Rendering-简洁版

1. 研究背景与问题 传统的3D场景表示方法,如网格和点云,适合GPU加速的光栅化操作,但缺乏灵活性。而基于神经辐射场(NeRF)的表示方式,尽管质量高,但需要高成本的训练和渲染时间。此外&#xff0…

用ue5打开网址链接

需要用到 Launch URL 这个函数 字面意思就是打开填写的链接网页 这里填写的是百度,按下Tab键后就会打开百度的网页

电脑为什么会提示“msvcr120.dll缺失”?“找不到msvcr120.dll文件”要怎么解决?

电脑故障排查指南:揭秘“msvcr120.dll缺失”的真相与解决方案 在软件开发与日常维护的广阔天地里,遇到系统报错或文件缺失的情况可谓家常便饭。今天,我将带领大家深入探讨一个常见的系统提示——“msvcr120.dll缺失”,并揭秘其背…

Java:集合(List、Map、Set)

文章目录 1. Collection集合1-1. 迭代器遍历方式1-2. 通过for循环进行遍历1-3. forEach遍历 2. List集合2-1. ArrayList底层实现原理2-2. LinkedList底层实现原理 3. Set集合3-1. HashSet 底层实现3-2. LinkedHashSet 底层实现3-3. TreeSet 4. Collection集合->总结5. Map集…

4_使用 HTML5 Canvas API (3) --[HTML5 API 学习之旅]

4_使用 HTML5 Canvas API (3) --[HTML5 API 学习之旅] 1.缩放 canvas 对象 在 <canvas> 中缩放对象可以通过 scale 方法来实现。这个方法会根据提供的参数对之后绘制的所有内容进行缩放。下面是两个具体的示例&#xff0c;展示如何使用 scale 方法来缩放 canvas 上的对…

嵌入式驱动开发详解18(USB驱动开发)

文章目录 前言USBUSB简介USB信号线USB控制规格 USB—HUBUSB—HUB原理USB—HUB电路 USB—OTGUSB—OTG原理USB—OTG电路 USB协议后续参考文献 前言 该专栏主要是讲解嵌入式相关的驱动开发&#xff0c;但是由于部分模块的驱动框架过于复杂&#xff0c;其内容量不是一个人能完成的…

ubuntu监测硬盘状态

安装smartmontools smartctl -l error /dev/sdk smartctl -i /dev/sda lshw -class disk smartctl -H /dev/sd 结果1&#xff1a; 结果2&#xff1a;PASSED&#xff0c;这表示硬盘健康状态良好 smartctl -a /dev/sdb sdk lsblk blkid 测试写入速度 time dd if/dev/zero of…

华为云联合中国信通院发布首个云计算智能化可观测性能力成熟度模型标准

2024年12月3日&#xff0c;由全球数字经济大会组委会主办&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;、中国通信企业协会承办的2024全球数字经济大会云AI计算国际合作论坛在北京成功召开。本次会议中&#xff0c;华为云联合中国信通院等单位…