攻防世界-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写出约束条件,在调用求解器求解,即可得出输入

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【传知代码】Modnet 人像抠图-论文复现

文章目录 概述原理介绍核心逻辑ModNet 的结构 环境配置WebUI 小结 论文地址 论文GitHub 本文涉及的源码可从Modnet 人像抠图该文章下方附件获取 概述 人像抠图技术在多个领域有着广泛的应用场景,包括但不限于: 展馆互动拍照:展馆中使用的抠…

KMP算法【C++】

KMP算法测试 KMP 算法详解 根据解释写出对应的C代码进行测试&#xff0c;也可以再整理成一个函数 #include <iostream> #include <vector>class KMP { private:std::string m_pat;//被匹配的字符串std::vector<std::vector<int>> m_dp;//状态二维数组…

线程---多线程--互斥--条件变量--生产消费模型

概念 线程是进程内部的执行分支&#xff0c;是CUP调度的基本单位 进程内核数据结构进程代码和数据 线程的理解&#xff1a; 产生的原因&#xff1a; 我们的代码在进程中是串行运行的&#xff0c;如果我们想要使他并行运行&#xff0c;分别完成不同的任务。之前的做法的创建子…

深入解析kube-scheduler的算法自定义插件

目录 ​编辑 一、问题引入 二、自定义步骤 三、最佳实践考虑 一、问题引入 当涉及到 Kubernetes 集群的调度和资源分配时&#xff0c;kube-scheduler 是一个关键组件。kube-scheduler 负责根据集群的调度策略&#xff0c;将 Pod 分配到适当的节点上。kube-scheduler 默认使…

cn.hutool.poi.excel 实现excel导出效果 首行高度,行样式,颜色,合并单元格,例子样式

需求 接了需求&#xff0c;下载excel模版&#xff0c;本来看着还是简单的&#xff0c;然后实现起来一把泪&#xff0c;首先是使用poi&#xff0c;我查了好久&#xff0c;才实现&#xff0c;然后是我用easyexcel又实现了一遍&#xff0c;用了一个周多才实现。 这是需求&#x…

web前端学习笔记11

11. CSS3高级特效 11.1 CSS3变形 CSS3变形是一些效果的集合, 如平移、旋转、缩放、倾斜效果 每个效果都可以称为变形(transform),它们可以分别操控元素发生平移、旋转、缩放、倾斜等变化 语法 transform:[transform-function] ; /* 设置变形函数,可以是一个,也可以是多…

python:__class_getitem__使用以及cached_property源码分析

python&#xff1a;__class_getitem__使用以及cached_property源码分析 1 前言 Python中如何模拟泛型类型&#xff1f; 当使用类型标注时&#xff0c;使用 Python 的方括号标记来形参化一个 generic type 往往会很有用处。 例如&#xff0c;list[int] 这样的标注可以被用来表…

如何通过OpenHarmony的音频模块实现录音变速功能?

简介 OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;是由开放原子开源基金会孵化及运营的开源项目&#xff0c;是面向全场景、全连接、全智能时代的智能物联网操作系统。 多媒体子系统是OpenHarmony系统中的核心子系统&#xff0c;为系统提供了相机、…

Python语法学习之 - 生成器表达式(Generator Expression)

第一次见这样的语法 本人之前一直是Java工程师&#xff0c;最近接触了一个Python项目&#xff0c;第一次看到如下的代码&#xff1a; i sum(letter in target_arr for letter in source_arr)这条语句是计算source 与 target 数组中有几个单词是相同的。 当我第一眼看到这样…

Offline RL : Beyond Reward: Offline Preference-guided Policy Optimization

ICML 2023 paper code preference based offline RL&#xff0c;基于HIM&#xff0c;不依靠额外学习奖励函数 Intro 本研究聚焦于离线偏好引导的强化学习&#xff08;Offline Preference-based Reinforcement Learning, PbRL&#xff09;&#xff0c;这是传统强化学习&#x…

js二进制数据,文件---ArrayBuffer,二进制数组

1.二进制数据 在 JavaScript 中有很多种二进制数据格式&#xff0c;比如&#xff1a;ArrayBuffer&#xff0c;Uint8Array&#xff0c;DataView&#xff0c;Blob&#xff0c;File 及其他。 2.ArrayBuffer 基本的二进制对象是 ArrayBuffer —— 对固定长度的连续内存空间…

linux:信号深入理解

文章目录 1.信号的概念1.1基本概念1.2信号的处理基本概念1.3信号的发送与保存基本概念 2.信号的产生2.1信号产生的五种方式2.2信号遗留问题(core,temp等) 3.信号的保存3.1 信号阻塞3.2 信号特有类型 sigset_t3.3 信号集操作函数3.4 信号集操作函数的使用 4.信号的处理4.1 信号的…

Qt输入输出类使用总结

Qt输入输出类简介 QTextStream 类(文本流)和 QDataStream 类(数据流)Qt 输入输出的两个核心类,其作用分别如下: QTextStream 类:用于对数据进行文本格式的读/写操作,可在 QString、QIODevice或 QByteArray 上运行,比如把数据输出到 QString、QIODevice 或 QByteArray 对象…

Ubuntu切换内核版本

#安装内核安装工具 sudo apt-get install software-properties-common sudo add-apt-repository ppa:cappelikan/ppa sudo apt-get update sudo apt-get install mainline#安装指定内核版本(有些版本并不能安装成功) mainline install 5.14.10#更新GRUB配置 sudo update-grub#查…

Python实现将LabelMe生成的JSON格式转换成YOLOv8支持的TXT格式

标注工具 LabelMe 生成的标注文件为JSON格式&#xff0c;而YOLOv8中支持的为TXT文件格式。以下Python代码实现3个功能&#xff1a; 1.将JSON格式转换成TXT格式&#xff1b; 2.将数据集进行随机拆分&#xff0c;生成YOLOv8支持的目录结构&#xff1b; 3.生成YOLOv8支持的YAML文件…

操作教程|通过DataEase开源BI工具对接金山多维表格

前言 金山多维表格是企业数据处理分析经常会用到的一款数据表格工具&#xff0c;它能够将企业数据以统一的列格式整齐地汇总至其中。DataEase开源数据可视化分析工具可以与金山多维表格对接&#xff0c;方便企业更加快捷地以金山多维表格为数据源&#xff0c;制作出可以实时更…

【网络版本计算器的实现】

本章重点 理解应用层的作用, 初识HTTP协议理解传输层的作用, 深入理解TCP的各项特性和机制对整个TCP/IP协议有系统的理解对TCP/IP协议体系下的其他重要协议和技术有一定的了解学会使用一些分析网络问题的工具和方法 ⭐注意!! 注意!! 注意!! 本课是网络编程的理论基础.是一个服务…

Antd Vue项目引入TailwindCss之后出现svg icon下移,布局中的问题解决方案

目录 1. 现象&#xff1a; 2. 原因分析&#xff1a; 3. 解决方案&#xff1a; 写法一&#xff1a;扩展Preflight 写法二&#xff1a; 4. 禁用 Preflight 1. 现象&#xff1a; Antd Vue项目引入TailwindCss之后出现svg icon下移&#xff0c;不能对齐显示的情况&#xff0…

爬虫实训案例:中国大学排名

近一个月左右的时间学习爬虫&#xff0c;在用所积累的知识爬取了《中国大学排名》这个网站&#xff0c;爬取的内容虽然只是可见的文本&#xff0c;但对于初学者来说是一个很好的练习。在爬取的过程中&#xff0c;通过请求数据、解析内容、提取文本、存储数据等几个重要的内容入…

React-router 最佳实践

使用的是 BrowserRouter&#xff0c;Routes 和 Route&#xff0c;这是 react-router-dom v5 和 v6 都支持的 API。这种方式的优点是路由配置和应用的其它部分是紧密集成的&#xff0c;这使得路由配置更加直观和易于理解 // router/index.js import { BrowserRouter as Router,…