攻防世界-mobile-easy-app详解

2024-05-25 02:20

本文主要是介绍攻防世界-mobile-easy-app详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

序言

这道题网上很多分析,但是分析的都是arm版本的,我选了arm64的来分析,arm64相比arm难度高一些,因为arm64编译器搞了inline优化,看起来略抽象

分析

这道题逻辑很简单,输入flag然后一个check函数验证,check函数是c层的,但是arm32和arm64差别很大,给大家瞄一眼,先32后64

可以看到,32位的逻辑非常清晰,拿到char*之后,弄成std::string,之后sub_9670函数对比是否是flag{开头,往后CheckM函数把flag{xxx}中的xxx的左16和右16组合在一起,形成一个32字节的字符串,之后check1进行一些简单的逻辑运算,再往后的encry是一个tea,之后是一个魔改的base64,就完事,逻辑很简单,但是到了arm64,就很难看了 

说说主要的区别吧,首先是内联了很多函数,可以看到sub_9670已经没了,encry函数也没了,代码的复杂度提高了很多,还有就是,函数的返回值不按套路出牌,不放在x0寄存器中,不知道放在哪里,得去动态看才知道,比如check1之后的返回值,arm32中一看就知道是指针接受了返回值,但在arm64中莫名其妙放在了一个其他地方。

string内存结构问题问题

接下来说说,是怎么分析解决arm64的,首先,经过看这个so的代码以及一些搜索,发现string的内存结构为,string的大小为3个dq(8个字节),24字节,如果字符串小于0x17,那么首字节存放字符串长度乘以2,第二个字节开始放字符串内容;如果是长字符串,那么第一个dq放的是容量,并且这个容量会是奇数,也就是&&1会=1;编译器也是通过这个标志位判断是长字符串还是短字符串,第二个dq放的是字符串的真实长度,第三个dq放的是一个char*,指向真实的字符串;另外一个关于string的问题是,string的很多内部细节也被inline出来了,比如动态扩容,这部分的特征是,会出现一个grow_by_函数,这个函数执行扩容的细节,细节不说了,紧跟这个grow_by_函数后,会看到设置字符串长度的代码,根据这两个特征就能知道实在动态扩容了;

参数乱放问题

函数返回值不是放在x0,会放在莫名奇妙的地方,栈上的某个地方,这一块我采用的解决办法是用frida的stalker trace来分析,非常爽,文末会附上trace脚本

题目其他的一些细节

tea的秘钥是so中的init_array的一个函数设置的,base64的表是在jni_onload中设置的
其余并没有什么特别之处了,这里着重想推荐两个好用的技巧

两个技巧
stalker trace

根据yang神首创,经过奋飞小改,之后我在改一点,已经能用了,脚本主要功能是从给定的地址开始trace,trace从这个地址开始后的size长度的代码,会把执行完每一条汇编之后的影响打印出来,寄存器变化,内存的变化,以及内存中的字符串或者u64打印出来,文末也会附上trace check函数后的效果,大体是这样

 

z3

z3是一个强大的约束求解器,一些琐碎的逻辑用z3比较好求出来,不然的话得人工取反推实现,这里用来解决check1中的逻辑,我们只需要按照正向逻辑按照z3的api写出约束条件,在调用求解器求解,即可得出输入

这篇关于攻防世界-mobile-easy-app详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1000213

相关文章

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con