XCTF - IllIntentions wp

做 ctf 每天都是踩坑的一天

文章目录

  • 题目概述
  • 我的做法
  • frida hook

题目概述

这道题本身逻辑不复杂,有一个 MainActivity 和三个二级 Activity IsThisTheRealOne, ThisIsTheRealOne, DefinitelyNotThis。主 activity 是空白页面,注册了一个 Receiver Send_to_Activity,在接收到特定 Action 后会根据参数选择一个 activity 启动。

MainActivity 注册 Send_to_Activity

每个 activity 内部会调用 jni 计算一个字符串,从返回值拿到结果,最后将该字符串用 broadcast 广播成一个 Intent。例如,IsThisTheRealOne 的成员函数有 jni 的接口,和一个 OnCreate 入口函数
jni

IsThisTheRealOne 的 OnCreate

我的做法

由于题目逻辑其实不复杂,我做的时候也不太会 hook,所以我选择复现加密函数。但是连续踩了三个坑 xs。

在这里插入图片描述
在这里插入图片描述

  • Java 部分,Utilities 类可以直接粘贴到新文件里在本地跑,这样 jni 的入参就知道了。
  • jni 里面其实就是 load 内存中预定义的字符串拼接到 arg0,然后和 s, s1 异或一下。把这段代码用 python 复现一下就好了。

jni 这里要注意字节序的问题,只有 strcpy 是保证相同字节顺序的,剩下两个 *(QWORD*)v11 = "" 的赋值,右边的字符串常量是 ida 按照数字的字节顺序直接翻译过来的,相当于数字的小端是字符串末尾。在小端序字符串的末尾会被放到内存低位。

踩了很多坑。首先是我之前以为单独的 java 文件不能写 pkg name,但事实上写了 pkg name 也能单独跑,不写 pkgname 反而会造成误导,例如本题 class.getName() = "com.example. ...." 会返回从包名开始的全限定名,但不写包名相当于是空,在本地测试会以为 getName 只有类名

匿名函数(匿名类)本质上是个内部类,他的 this 指向的是匿名类的 this,不再是外部类了。只是编译器会把内部匿名类命名为 "外部类名" + "$1"(or ".1").
图 2 的 subString(0, s.length() -2) 就是在处理这个问题。

注意:jeb 不会在反编译结果中以注释的形式显示匿名类的全限定名,需要鼠标 hover 在符号上方显示详细信息才看得到。相对的,jadx 默认就会显示。

frida hook

在模拟器里安装 frida server 后可以用 frida hook 安卓程序的过程,感觉这个可能是预期解法,学习一下。

首先参考了 这篇 (参考 1) 稀土的博客,里面记录了安装 frida server 的操作,然后 hook 了三个 jni 接口

function main() {Java.perform(function() {var DefinitelyNotThisOneHandler = Java.use('com.example.application.DefinitelyNotThisOne')DefinitelyNotThisOneHandler.definitelyNotThis.implementation = function(arg0, arg1) {console.log('进入 DefinitelyNotThisOneHandler 函数,参数1: ' + arg0 + " 参数2: " + arg1)var ret = this.definitelyNotThis(arg0, arg1)console.log('完成 DefinitelyNotThisOneHandler 函数,返回值: ' + ret )return ret}var ThisIsTheRealOneHandler = Java.use('com.example.application.ThisIsTheRealOne')ThisIsTheRealOneHandler.orThat.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function(arg0, arg1, arg2) {console.log('进入 ThisIsTheRealOneHandler 函数,参数1: ' + arg0 + " 参数2: " + arg1 + "  参数3: " + arg2)var ret =  this.orThat(arg0, arg1, arg2)console.log('完成 ThisIsTheRealOneHandler 函数,返回值:' + ret )return ret}var IsThisTheRealOneHandler = Java.use('com.example.application.IsThisTheRealOne')IsThisTheRealOneHandler.perhapsThis.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function(arg0, arg1, arg2) {console.log('进入 IsThisTheRealOneHandler 函数,参数1: ' + arg0 + "  参数2: " + arg1 + "  参数3: " + arg2)var ret =  this.perhapsThis(arg0, arg1, arg2)console.log('完成 IsThisTheRealOneHandler 函数,返回值: ' + ret )return ret}})
}setImmediate(main)

在 这篇 (参考 2) 博客里,作者 hook 了 Java 的 Intent.putExtra 函数,从而拦截发送。此外,作者没用 am broadcast 发送 Intent 触发二级 activity,而是使用的 objection 的 android intent

function main() {function getjstring(jstr) {return Java.vm.getEnv().getStringUtfChars(jstr, null).readCString();}Java.perform(function () {var so_addr = Module.findBaseAddress("libhello-jni.so");var perhapsThis_addr = Module.findExportByName("libhello-jni.so", "Java_com_example_application_IsThisTheRealOne_perhapsThis");console.log("perhapsThis_addr", perhapsThis_addr);Interceptor.attach(perhapsThis_addr, {onEnter: function (args) {console.log("perhapsThis_args:[1]", getjstring(args[2]), "\n    [2]", getjstring(args[3]), "\n    [3]", getjstring(args[4]), "\n");},onLeave: function (retval) {console.log("perhapsThis_result:", getjstring(retval));},});Interceptor.attach(Module.findExportByName("libhello-jni.so", "Java_com_example_application_ThisIsTheRealOne_orThat"), {onEnter: function (args) {console.log("orThat_args:[1]", getjstring(args[2]), "\n    [2]", getjstring(args[3]), "\n    [3]", getjstring(args[4]), "\n");},onLeave: function (retval) {console.log("orThat_result:", getjstring(retval));},});Interceptor.attach(Module.findExportByName("libhello-jni.so", "Java_com_example_application_DefinitelyNotThisOne_definitelyNotThis"), {onEnter: function (args) {console.log("definitelyNotThis_args:[1]", getjstring(args[2]), "\n    [2]", getjstring(args[3]), "\n");},onLeave: function (retval) {console.log("definitelyNotThis_result:", getjstring(retval));},});});
}
setImmediate(main);

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

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

相关文章

LNMP架构

一、概述 LNMP架构是一种常用于搭建动态网站的服务器架构组合,其名称由以下四个组件的首字母缩写组成: Linux:操作系统。Linux具有开源、稳定、安全、高性能等特点,是服务器领域广泛使用的操作系统。它为其他组件提供了运行环境和…

【Unity3D】实现2D角色/怪物死亡消散粒子效果

核心:这是一个Unity粒子系统自带的一种功能,可将粒子生成控制在一个Texture图片网格范围内,并且粒子颜色会自动采样图片的像素点颜色,之后则是粒子编辑出消散效果。 Particle System1物体(爆发式随机速度扩散10000个粒…

芯片AI深度实战:基础篇之langchain

基于ollama, langchain,可以构建一个自己的知识库,比如这个 Build Your Own RAG App: A Step-by-Step Guide to Setup LLM locally using Ollama, Python, and ChromaDB | HackerNoon 这是因为: 以上范例就实现了这样一个流程: 系列文章&…

mybatis(134/134)完结

一级缓存(默认情况下开启)同一个sqlsession中执行相同的查询语句走一级缓存 二级缓存 :同一个sqlsessionfactory,sqlsession关闭了才会将一级缓存提交到二级缓存中 外部编写的缓存 PageHelper插件:方便进行分页&#x…

C++,STL 简介:历史、组成、优势

文章目录 引言一、STL 的历史STL 的核心组成三、STL 的核心优势四、结语进一步学习资源: 引言 C 是一门强大且灵活的编程语言,但其真正的魅力之一在于其标准库——尤其是标准模板库(Standard Template Library, STL)。STL 提供了…

不背单词快捷键(不背单词键盘快捷键)

文章目录 不背单词快捷键 不背单词快捷键 ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ    …

EasyExcel写入和读取多个sheet

最近在工作中,作者频频接触到Excel处理,因此也对EasyExcel进行了一定的研究和学习,也曾困扰过如何处理多个sheet,因此此处分享给大家,希望能有所帮助 目录 1.依赖 2. Excel类 3.处理Excel读取和写入多个sheet 4. 执…

JavaScript函数中this的指向

总结:谁调用我,我就指向谁(es6箭头函数不算) 一、ES6之前 每一个函数内部都有一个关键字是 this ,可以直接使用 重点: 函数内部的 this 只和函数的调用方式有关系,和函数的定义方式没有关系 …

【C语言】内存函数

一、前言 在C语言中有着常见的内存函数,他们可以对内存进行操作,即可以修改内存的内容等,下面我们来简略地学习一下 二、memcpy(内存复制) cpy是复制的意思,顾名思义,就是将一块指定大小的内存的字节逐一赋值到新的内…

fscan全家桶更新:fscan免杀版,可过360、火绒、微步云沙箱,其他的自行测试

前言 fscan全家桶更新:fscan免杀版,可过360、火绒、微步云沙箱,其他的自行测试 其他版本 FscanPlus:fscan的plus版本 fs:有免杀效果 fscan低版本:自己重新编译的适合低版本系统的fscan FscanParser&a…

中间件安全

一.中间件概述 1.中间件定义 介绍:中间件(Middleware)作为一种软件组件,在不同系统、应用程序或服务间扮演着数据与消息传递的关键角色。它常处于应用程序和操作系统之间,就像一座桥梁,负责不同应用程序间…

微服务入门(go)

微服务入门(go) 和单体服务对比:里面的服务仅仅用于某个特定的业务 一、领域驱动设计(DDD) 基本概念 领域和子域 领域:有范围的界限(边界) 子域:划分的小范围 核心域…

js小游戏---2048(附源代码)

一、游戏页面展示 开始游戏: 游戏结束: 二、游戏如何操作 通过监听键盘的操作,进行移动变化 键盘上下左右键控制页面中所有模块同时向键入的方向移动,如果有两块一样的方块,就进行合并,并且在键盘每操作…

ASP.NET代码审计 SQL注入篇(简单记录)

sql注入,全局搜索 Request QueryString ToString() select select * aspx是设计页面,而aspx.cs是类页面,也就是说设计页面用到的类信息在这个页面里面,其实就是把设计和实现分离开来。 源码 using System; using System.Collect…

【Rust自学】14.6. 安装二进制crate

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 14.6.1. 从cratea.io安装二进制crate 通过cargo_install命令可以从crates.io安装二进制crate。 这并不是为了替换系统包,它应…

C++中的类与对象(中)

在上一节中,我们初步了解了一下,C中的类,这一概念,这一节让我们进一步深入了解一下。 文章目录 目录 前言 一、类中的默认成员函数 1.1 构造函数 构造函数的特点: 1.2 析构函数 析构函数的特点: 1.3 …

机器人抓取与操作概述(深蓝)——1

工业机器人:① “臂”的形态 ② “手”的形态 ③ 视觉,力和触觉 1 机器人的不同形态 “臂”的形态 “手”的形态 2 常见的操作任务 操作:插入、推和滑 抓取:两指(平行夹爪)抓取、灵巧手抓取 落地-产…

指针的介绍3后

1.函数指针变量 1.1函数的地址 void test(int (*arr)[2]) {printf("zl_dfq\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; } 由上面的程序运行可知: 函数名就是函数的地址 &函数名也可以拿到函…

基于Springboot的智能学习平台系统【附源码】

基于Springboot的智能学习平台系统 效果如下: 系统登陆页面 系统主页面 课程详情页面 论坛页面 考试页面 试卷管理页面 考试记录页面 错题本页面 研究背景 随着互联网技术的普及,人们探索知识的方式逐渐转向数字化平台。传统的教学方法通常局限于固定…

shiro学习五:使用springboot整合shiro。在前面学习四的基础上,增加shiro的缓存机制,源码讲解:认证缓存、授权缓存。

文章目录 前言1. 直接上代码最后在讲解1.1 新增的pom依赖1.2 RedisCache.java1.3 RedisCacheManager.java1.4 jwt的三个类1.5 ShiroConfig.java新增Bean 2. 源码讲解。2.1 shiro 缓存的代码流程。2.2 缓存流程2.2.1 认证和授权简述2.2.2 AuthenticatingRealm.getAuthentication…