【逆向】NahamCon CTF -Click Me Writeup(BridaFrida Hook 拿Flag)

news2024/12/27 13:53:22

文章目录

  • 前言
  • 一、样式与功能点
  • 二、反编译
  • 三、Frida Get Flag
  • 四、BurpSuite插件-Brida
  • 总结


前言

第一次做外国CTF比赛的mobile challenge 题,题目就是一个安卓的apk安装包。顺便记录一下代码分析过程以及分享两种不同的解题思路。


提示:以下是本篇文章正文内容,下面案例可供参考

一、样式与功能点

下载apk并安装后,发现这个app打开是一个cookie曲奇饼干。只有两个功能点可以按。

在这里插入图片描述

1、中间大大的曲奇饼,点了之后,上面的Cookies:数量会增加。
2、最下面的GET FLAG按钮。
从字面意思上来看,关键点肯定是这个GET FLAG按钮了,直接点击,发现提示:
“You do not hava enough cookies to get the flag”,中文意思是说没有足够的cookies去获得这个flag。

在这里插入图片描述

二、反编译

先把这个apk安装包反编译出源代码。然后搜索关键字符串“flag”和“You do not have enough cookies to get the flag”,最后定位到两个关键方法getFlag()和getFlagButtionClick()

在这里插入图片描述

代码Toast.makeText(this.getApplicationContext(), “You do not have enough cookies to get the flag”, 0).show();输出的就是我们app里面点击按钮之后输出的内容。整段代码的意思就是,它这里使用Intrinsics.checkNotNullParameter(view0, “view”)来检查传入的view0参数是否为null。如果view0为null,这个方法会抛出一个异常。

在这里插入图片描述

然后,它检查一个名为CLICKS的成员变量是否等于十六进制数值0x5F5E0FF(十进制表示为100000000)。也就是一亿。如果等于,那么它会调用getFlag()方法获取一个字符串,并在应用的上下文中显示一个Toast消息,内容为这个字符串。

在这里插入图片描述

Toast消息的显示时间长度为0,这在Android中表示Toast.LENGTH_SHORT,即较短的显示时间。

如果CLICKS不等于0x5F5E0FF,那么它会在应用的上下文中显示一个Toast消息,内容为"You do not have enough cookies to get the flag"。同样,这个Toast消息的显示时间长度也为0。

所以,这个方法已经说得很明显了,就是要你点击1亿下。否则,他们会看到一个提示消息,告诉你还没有收集到足够的"cookies"……

在这里插入图片描述

那么能不能连续点一个通宵,暴力无脑地把点击数点到1亿呢?那这样岂不是用个按摩枪对准手机疯狂输出就行了。

所以看到了上面的方法,名为cookieViewClick。这个方法的主要功能是在用户点击按钮时增加CLICKS的值,并更新显示CLICKS值的文本视图。

首先,它将CLICKS的值加1,并将结果保存回CLICKS。它检查新的CLICKS值是否大于或等于十六进制数值0xCC07C9(十进制表示为13377345)。也就是一千三百多万。如果是,那么它会将CLICKS的值设置为0xCC07C9。这是为了限制CLICKS的最大值。所以手动点击cookie,暴力无脑拿flag显然不是获取flag的方式。

接下来,它使用findViewById(0x7F080075)方法找到一个文本视图(TextView),并将其文本设置为CLICKS的值。这个文本视图用于显示用户当前的"cookies"数量。

在这里插入图片描述

三、Frida Get Flag

所以思路有了,就是hook MainActivity.getFlagButtonClick()方法,打印出通过调用新创建的MainActivity实例的getFlag()方法得到的值。下面就用Frida框架写一个JavaScript脚本,用于动态地修改Android应用中的Java代码。

首先,Java.perform(function() {…})是Frida框架中的一个函数,它确保当前线程被附加到Java虚拟机(VM)上,并执行传入的函数。这里可以看frida官方的api文档,里面有说明。

https://frida.re/docs/javascript-api/

在这里插入图片描述

编写Frida JavaScript脚本:


Java.perform(function() {
    console.log("+zangcc+");
    var ma_Class = Java.use('com.example.clickme.MainActivity');
    ma_Class.getFlagButtonClick.implementation = function(view){
        const main = Java.use('com.example.clickme.MainActivity');
        var flag = main.$new().getFlag();
        console.log(flag);
    };
});

com.example.clickme.MainActivity的Java类,并将其赋值给变量main_activity。

接下来,用main_activity.getFlagButtonClick.implementation = function(view){…}修改MainActivity类中的getFlagButtonClick方法的实现。新的实现会在方法被调用时执行传入的函数。

在Frida框架中,implementation是一个特殊的属性,它允许你替换一个方法的实现。当你为implementation赋值一个函数时,这个函数就会在原方法被调用时执行,而不是执行原方法的代码。

在这里插入图片描述

main_activity.getFlagButtonClick.implementation = function(view){…}这行代码将MainActivity类中的getFlagButtonClick方法的实现替换为了一个新的函数。

这个新的函数接受一个参数view,这个参数对应于原getFlagButtonClick方法的参数。由于getFlag()方法不是一个静态方法,所以要实例化一个类对象。用var flag = main.$new().getFlag()创建一个新的MainActivity实例,并调用其getFlag()方法,将返回值赋值给变量flag。最后,用console.log(flag)打印出变量flag的值。

在这里插入图片描述

通过之前的源码分析,我们知道必须点击 cookie 近1亿次。在cookieViewClick方法中,还可以看到计数器将在大约 1300 万次点击时停止增加。所以点击cookie显然不是获取flag的方式。

所以可以hook这个getFlagButtionClick方法,CLICKS当单击标志按钮时将成员设置为所需的值。


Java.perform(function(){
    console.log("+zangcc——2+");
    var ma = Java.use("com.example.clickme.MainActivity");
    ma.getFlagButtonClick.implementation = function(view){
      this.CLICKS.value = 99999999;
      this.getFlagButtonClick(view);
    }
  });

所以可以hook这个getFlagButtionClick方法,CLICKS当单击标志按钮时将成员设置为所需的值。

在这里插入图片描述

当点击GET FLAG按钮,flag信息会输出到面板上。

在这里插入图片描述

四、BurpSuite插件-Brida

如果用习惯了Brida,问题也不大,毕竟Brida就是把Frida和BurpSuite结合在了一起的工具,本质上没太大区别。

配置完之后,Attach application:

在这里插入图片描述

Save JS file->Reload JS->Comple & reload JS。整套流程其实就是保存后并加载这个brida.js然后再编译。

在这里插入图片描述

进入Debug export项,然后输入我们刚刚编辑的方法test,然后点击Run export,出现“Brida zangcc hook”说明调用脚本成功了,然后这时点击app的GET FLAG按钮,flag就打印输出到brida的控制面板。

在这里插入图片描述


总结

这里只想到这两种办法解,如果你还有更好的办法或者思路,欢迎提出。欢迎关注公众号:Eureka安全团队。以后文章多数会以公众号为主。

    文章原创,欢迎转载,请注明文章出处: 【逆向】NahamCon CTF -Click Me Writeup(Brida&Frida Hook 拿Flag).。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

选对软件公司,助力小程序商城腾飞

选择一家合适的软件公司对于小程序商城的开发和运营至关重要。在众多的软件公司中,如何找到最适合自己的合作伙伴呢?本文将从实际需求、公司实力、案例展示、服务态度和价格等五个方面,为您解析如何选择合适的软件公司。 一、明确实际需求 在…

用「超舒适」突围,星纪元 ES 加量不加价

在 2023 广州车展上,星途星纪元 ES 正式开启预售,新车预售区间 24.8-35.8 万元,共推出五款车型配置。 外观方面,星纪元 ES 前脸采用了封闭式的设计,前大灯组采用了流行的贯穿式设计搭配矩阵大灯,使得整个灯…

cefsharp119.4.30(cef119.4.3Chromium119.0.6045.159)版本升级体验支持x86_h264及其他多个h264版本

Cefsharp119.4.30,cef119.4.3,Chromium119.0.6045.159 此更新包括一个高优先级安全更新 This update includes a high priority security update. 说明:此版本119.4.3支持x86_H264视频播放(需要联系我),其他版本。.NETFramework 4.6.2 NuGet Gallery | CefSharp.WinForms …

Selenium(12):层级定位_通过父元素找到子元素

层级定位 在实际的项目测试中,经常会遇到无法直接定位到需要选取的元素,但是其父元素比较容易定位,通过定位父元素再遍历其子元素选择需要的目标元素,或者需要定位某个元素下所有的子元素。 层级定位的思想是先定位父对象&#xf…

外包干了4年,技术算是没了...

先说一下自己的情况。大专生,19年通过校招进入湖南某软件公司,干了接近3年的测试,今年年上旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了三年&#xff0c…

企业邮箱即时提醒服务推荐

现在用企业邮箱比较多,但是不能即时提醒,总是误事,什么邮箱可以即时提醒呢?随着工作和生活节奏的加快,传统的电子邮件系统由于不能即时提醒,往往会导致重要邮件的漏接,从而引发一系列的麻烦和误…

java--继承快速入门

1.什么是继承 java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立其父子关系。 2.继承的特点 子类能继承父类的非私有成员(成员变量,成员方法)。 3.继承后对象的创建 子类的对象是由子类、父类共同完成的。 4.继承的…

贝锐向日葵:独家算法如何支撑不断地产品创新?

作为国民级的专业远程控制品牌,贝锐旗下的“向日葵远程控制”一直在远程控制领域不断积累创新。 近年来,远程控制软件本身开始成为企业的主流远程业务工具以及个人场景下的日常必备软件,向日葵远程控制也在不断地完善并创新产品。 比如在前…

全网最详细的安装pytorch GPU方法,一次安装成功!!包括安装失败后的处理方法!

文章目录 前提---查看是否有NVIDIV英伟达显卡【笑哭】一、查看电脑的显卡驱动版本方法一:在cmd命令窗口中输入nvidia-smi,可以发现版本为12.2方法2:点击NVIDIA控制面板→系统信息 二、安装CUDA方法1: 在pytorch官网https://pytorc…

Vue3+Ts实现聊天机器人(chatBot-附代码)

一:项目介绍 本次实验主要涉及到的技术是 Vue3 Ts,当然其中也有部分是 Vue2 格式的代码以及 json 和 CSS 布局等。本来是想仿照 文心一言 来开发的一个聊天机器人案例。结果由于时间不足,可能只是做出来了一个半成品。不过核心功能是有的。由…

java项目之消防物资存储系统(ssm+vue)

项目简介 消防物资存储系统实现了以下功能: 管理员功能: 管理员登陆后,主要模块包括首页,个人中心,用户管理,仓库管理,物资入库管理,物资出库管理,仓库管理,物资详情管…

AI数字人授课/朗读文章会是什么样子的(叮,您的视频生成好了)

阿酷TONY,长沙,2023.11.23 AI数字人授课/朗读文章(叮,您的视频生成好了) 1.前几天的教程 上篇文章教程: 太累了,是时候让AI数字人来帮我干活了(走,上教程)…

2016年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2016 级考研管理类联考数学真题一、问题求解(本大题共 15 小题,每小题 3 分,共 45 分)下列每题给出 5 个选项中,只有一个是符合要求的,请在答题卡上将所选择的字母涂黑。真题(2016-01&…

2022年全国英烈纪念设施数据,各区县均有!

中国是一个拥有悠久历史和灿烂文化的国家,其英烈纪念设施承载着中国人民对为国家独立、民族解放和民主进步而英勇斗争的先烈们的崇敬和缅怀之情。 这些设施不仅是中国革命历史和先烈精神的重要载体,也是传承红色文化、弘扬革命精神的重要场所。 今天分享…

十一 动手学深度学习v2计算机视觉 ——微调

一、网络架构 一个神经网络一般可以分成两块 特征抽取,将原始像素变成容易线性分割的特征。线性分类器来做分类。 二、训练 是一个目标数据集上的正常训练任务, 但使用更强的正则化 使用更小的学习率使用更少的数据迭代 源数据集远远复杂于目标数据集…

十八、初识elasticsearsh (索引)

目录 一、Elasticsearch的介绍: 二、正向索引和倒排索引 1、正向索引 2、倒排索引 3、索引(index) :相同类型的文档的集合 4、映射(mapping):索引中文档的字段约束信息,类似表的结构约束 一、Elasticsearch的介绍: Elasticsearch是一个…

2-Linux学习环境搭建

1 Linux学习环境搭建 1.1 虚拟化介绍 # win 机器----》装一个虚拟化软件----》虚拟化出linux操作系统# kvm vmware openstack docker k8s # kvm vmware 虚拟化软件 -运行在linux上,做虚拟化的软件 -vmware运行在win,linux,商业软件…

软件测试岗位与职业发展

一、软件测试岗位有哪些? 在企业中,软件测试领域的几个典型的职位有:功能测试工程师(也叫手工测试)、自动化测试工程师、性能测试工程师、测试开发等。 1、功能测试(手工测试)工程师 主要工作内…