CTF-RE 从0到 N: 高版本 APK 调试 + APK逻辑修改再打包 + os层调试[2024 强网杯青少年专项赛 Flip_over] writeup

非常好的题,很适合新手入门!!!

how tu use JEB

通过百度网盘分享的文件:app-debug.apk
链接:https://pan.baidu.com/s/11oPBq7LTnzasuefGeU6mXA?pwd=1111 
提取码:1111 
--来自百度网盘超级会员V2的分享

step1

反编译查看Manifest

   android:allowBackup="true"android:appComponentFactory="androidx.core.app.CoreComponentFactory"android:dataExtractionRules="@xml/data_extraction_rules"android:debuggable="true"android:extractNativeLibs="false"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Flipover">

能发现其中的android:debuggable="true"

此题目在低版本不可用(安卓9)

使用 Android Studio Emulator
注意:
1.虚拟机版本要用(APIS),play无法获得root,
2.HAXM安装之后检测不到直接去目录里点.exe按

step2 JEB反编译定位核心代码

请添加图片描述
随便输入一个
请添加图片描述
请添加图片描述
定位到代码

package com.example.flipover;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private Button loginButton;private EditText passwordField;private EditText usernameField;static {System.loadLibrary("native-lib");}@Override  // androidx.fragment.app.FragmentActivityprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(layout.activity_main);this.usernameField = (EditText)this.findViewById(id.editTextUsername);this.passwordField = (EditText)this.findViewById(id.editTextPassword);this.loginButton = (Button)this.findViewById(id.buttonLogin);this.loginButton.setOnClickListener((View v) -> {if(this.validateLogin(this.usernameField.getText().toString(), this.passwordField.getText().toString())) {this.startActivity(new Intent(this, FlipGameActivity.class));this.finish();return;}Toast.makeText(this, "Invalid login credentials", 0).show();});}public native boolean validateLogin(String arg1, String arg2) {}
}

这是一个 Android 应用的登录界面代码:

  1. 类声明和变量:
public class MainActivity extends AppCompatActivity {private Button loginButton;private EditText passwordField; private EditText usernameField;
  • 这是主活动类,继承自 AppCompatActivity
  • 定义了登录按钮和用户名、密码输入框的变量
  1. 加载原生库:
static {System.loadLibrary("native-lib");
}
  • 加载包含原生代码的库文件(native-lib)
  1. onCreate 方法:
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(layout.activity_main);
  • 活动创建时调用
  • 设置界面布局
  1. 初始化 UI 元素:
this.usernameField = (EditText)this.findViewById(id.editTextUsername);
this.passwordField = (EditText)this.findViewById(id.editTextPassword);
this.loginButton = (Button)this.findViewById(id.buttonLogin);
  • 获取并关联界面上的输入框和按钮
  1. 按钮点击事件处理:
this.loginButton.setOnClickListener((View v) -> {if(this.validateLogin(usernameField.getText().toString(), passwordField.getText().toString())) {this.startActivity(new Intent(this, FlipGameActivity.class));this.finish();return;}Toast.makeText(this, "Invalid login credentials", 0).show();
});
  • 设置登录按钮的点击监听器
  • 调用 validateLogin 验证登录信息
  • 如果验证成功,跳转到游戏界面
  • 验证失败则显示错误提示
  1. 原生方法声明:
public native boolean validateLogin(String arg1, String arg2);
  • 声明一个原生方法用于验证登录
  • 具体实现在 C/C++ 代码中

这是一个包含原生代码(JNI)的 Android 登录界面,主要功能是:
7. 提供用户名和密码输入
8. 通过原生代码验证登录信息
9. 验证成功后跳转到游戏界面
10. 验证失败显示错误提示

step3 动态调试使得条件强制不成立

强制更改其寄存器值进入密码正确分支
请添加图片描述
运行后成功进入请添加图片描述
查看game类

package com.example.flipover;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.Arrays;public class FlipGameActivity extends AppCompatActivity {private Button buttonSubmit;private EditText editTextInput;// 加载native库static {System.loadLibrary("native-lib");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(layout.activity_flip_game);// 初始化UI组件editTextInput = (EditText) findViewById(id.editTextInput);buttonSubmit = (Button) findViewById(id.buttonSubmit);RecyclerView recyclerView = (RecyclerView) findViewById(id.recyclerViewCards);// 设置RecyclerView的布局管理器为3列的网格布局recyclerView.setLayoutManager(new GridLayoutManager(this, 3));recyclerView.setAdapter(new CardAdapter(this, Arrays.asList(new String[]{"Stay positive!", "Dream big!", "Believe in yourself!", "Stay curious!", "Keep learning!", "Chase your dreams!", "Stay strong!", "Be kind!", "You're amazing!"})));// 设置提交按钮的点击监听器buttonSubmit.setOnClickListener((View v) -> {// 获取输入文本并验证加密if (!validateAndEncrypt(editTextInput.getText().toString().trim())) {Toast.makeText(this, "Invalid input", Toast.LENGTH_SHORT).show();return;}Toast.makeText(this, "Congratulations, you have flipped to a hidden secret", Toast.LENGTH_SHORT).show();});}// 声明本地方法,用于验证和加密输入public native boolean validateAndEncrypt(String arg1);
}

导出.os在 ida 分析validateAndEncrypt函数

__int64 __fastcall Java_com_example_flipover_FlipGameActivity_validateAndEncrypt(__int64 a1, __int64 a2, __int64 a3)
{__int64 input; // x21__int64 i; // x8unsigned int v7; // w19int v8; // w4int v10; // w4_OWORD v11[2]; // [xsp+10h] [xbp-100h]unsigned __int64 v12; // [xsp+30h] [xbp-E0h]__int16 v13; // [xsp+38h] [xbp-D8h]_BYTE v14[64]; // [xsp+3Eh] [xbp-D2h] BYREF_BYTE v15[64]; // [xsp+7Eh] [xbp-92h] BYREFchar v16[65]; // [xsp+BEh] [xbp-52h] BYREFchar dest[4]; // [xsp+FFh] [xbp-11h] BYREFchar v18[5]; // [xsp+103h] [xbp-Dh] BYREF__int64 v19; // [xsp+108h] [xbp-8h]v19 = *(_QWORD *)(_ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2)) + 40);input = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(*(_QWORD *)a1 + 1352LL))(a1, a3, 0LL);if ( strlen((const char *)input) == 42&& !strncmp((const char *)input, "flag{", 5uLL)&& *(_BYTE *)(input + 41) == 125 ){strncpy(dest, (const char *)input, 4uLL);strncpy(v18, (const char *)input, 4uLL);v18[4] = 0;memcpy(v16, "a4c3f8927d9b8e6d6e483fa2cd0193b0a6e2f19c8b47d5a8f3c7a91e8d4b9f67", sizeof(v16));sub_AF3F4(dest, v16, 65LL, v14);sub_AF47C(dest, v14, 64LL, v15);i = 0LL;v13 = -28958;v12 = 0x89DDAB508133AF93LL;v11[1] = xmmword_74CEB;v11[0] = xmmword_74CDB;while ( (*(_BYTE *)(input + i) ^ 0x21 ^ v15[i]) == *((unsigned __int8 *)v11 + i) ){if ( ++i == 42 ){(*(void (__fastcall **)(__int64, __int64, __int64))(*(_QWORD *)a1 + 1360LL))(a1, a3, input);v7 = 1;__android_log_print(3, "NativeLib", "JNI_TRUE[%d]: %02x", 1, v8);return v7;}}(*(void (__fastcall **)(__int64, __int64, __int64))(*(_QWORD *)a1 + 1360LL))(a1, a3, input);__android_log_print(3, "NativeLib", "JNI_FALSE[%d]: %02x", 0, v10);}else{(*(void (__fastcall **)(__int64, __int64, __int64))(*(_QWORD *)a1 + 1360LL))(a1, a3, input);}return 0;
}

到此为止可以硬逆,但是本题既然是动态调试那我们就继续调试.os层

step4 修改代码逻辑并重新打包

我们可以使用MT管理器修改代码逻辑让其无论输入任何密码都为正确

00000028  invoke-virtual      MainActivity->validateLogin(String, String)Z, p0, v0, v1
0000002E  move-result         v2
00000030  if-eqz              v2, :50
:34
00000034  new-instance        v2, Intent
00000038  const-class         v3, FlipGameActivity
0000003C  invoke-direct       Intent-><init>(Context, Class)V, v2, p0, v3
00000042  invoke-virtual      MainActivity->startActivity(Intent)V, p0, v2
00000048  invoke-virtual      MainActivity->finish()V, p0
0000004E  goto                :64
:50
00000050  const-string        v2, "Invalid login credentials"
00000054  const/4             v3, 0
00000056  invoke-static       Toast->makeText(Context, CharSequence, I)Toast, p0, v2, v3
0000005C  move-result-object  v2
0000005E  invoke-virtual      Toast->show()V, v2
:64
00000064  return-void

根据包名找到类
请添加图片描述
定位到汇编

请添加图片描述

请添加图片描述
改为if-nez反转if条件,保存后重签名

请添加图片描述
成功!现在无论输入什么都会进入游戏界面!

step4 .os层调试

将ida服务器拖入虚拟机按如下操作运行,挂载ida服务器

C:\Users\A5rZ_admin>adb forward tcp:23946 tcp:2394623946
C:\Users\A5rZ_admin>adb shell
emu64xa:/ # mv /sdcard/Download/android_server /data/local/tmp/
emu64xa:/ # chmod 755 /data/local/tmp/android_server
emu64xa:/ # /data/local/tmp/android_server
IDA Android 64-bit remote debug server(ST) v9.0.30. Hex-Rays (c) 2004-2024
2024-11-25 14:25:44 Listening on 0.0.0.0:23946...

启动debug

adb shell am start -D -n com.example.flipover/.MainActivity

附加到程序
请添加图片描述
这虚拟机不行,再研究研究

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

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

相关文章

Taro React小程序开发框架 总结

目录 一、安装 二、目录结构 三、创建一个自定义页面 四、路由 1、API 2、传参 3、获取路由参数 4、设置TabBar 五、组件 六、API Taro非常好用的小程序框架&#xff0c;React开发者无缝衔接上。 一、安装 官方文档&#xff1a;Taro 文档 注意&#xff0c;项目创建…

qt添加模块

以QtNetwork模块为例 方式一 扩展-qt vs tools-qt project settings 方式二 右键选中项目-属性-qt project settings 方法三 在此界面选择select modules,即可进行相应模块添加

传统经验光照模型

1.什么是光照模型 光照模型(illumination model)&#xff0c;也称为明暗模型&#xff0c;用于计算物体某点处的光强(颜色值)&#xff0c;从算法理论基础而言&#xff0c;光照模型分为两类&#xff0c;一种是基于物理理论的&#xff0c;另一种是基于经验模型的。 基于物理理论的…

金融市场和预期

1.债券的分类 短期债券&#xff08;Short-term Bonds&#xff09;&#xff1a; 通常指到期期限在1年以内的债券。 中期债券&#xff08;Medium-term Bonds&#xff09;&#xff1a; 到期期限在1年到10年之间的债券。 长期债券&#xff08;Long-term Bonds&#xff09;&#xff…

C++:用红黑树封装map与set-2

文章目录 前言一、红黑树封装map与set中const迭代器1. 框架的搭建2. set实现const迭代器3. map实现const迭代器 二、operator[ ]1. operator[ ]要达成的样子2. insert的改变 三. 解决insert里set中的问题四. 解决map中的operator[ ]总结用红黑树封装map与set代码 前言 前面我们…

软件/游戏提示:mfc42u.dll没有被指定在windows上运行如何解决?多种有效解决方法汇总分享

遇到“mfc42u.dll 没有被指定在 Windows 上运行”的错误提示&#xff0c;通常是因为系统缺少必要的运行库文件或文件损坏。以下是多种有效的解决方法&#xff0c;可以帮助你解决这个问题&#xff1a; 原因分析 出现这个错误的原因是Windows无法找到或加载MFC42u.dll文件。这可…

07 初始 Oracle 优化器

查询优化器&#xff0c;简称优化器&#xff0c;是数据库最核心的组件之一。我们在这个系列的第一篇文章中已经给大家介绍了&#xff0c;优化器会参与到SQL语句的解析过程中&#xff0c;用来生成SQL语句的执行计划&#xff0c;直接决定SQL语句执行性能的优劣。 什么是执行计划 …

累积局部效应 (ALE) 图分析记录

Git地址&#xff1a;https://github.com/blent-ai/ALEPython/tree/dev 查看源码需要pip install alepython安装&#xff0c;这边查看源码发现就实际就一个py文件而已&#xff0c;我懒得再去安装&#xff0c;故直接下载源码&#xff0c;调用方法也可&#xff1b; # -*- coding:…

远程控制软件:探究云计算和人工智能的融合

在数字化时代&#xff0c;远程控制工具已成为我们工作与生活的重要部分。用户能够通过网络远程操作和管理另一台计算机&#xff0c;极大地提升了工作效率和便捷性。随着人工智能&#xff08;AI&#xff09;和云计算技术的飞速发展&#xff0c;远程控制工具也迎来了新的发展机遇…

正则表达式灾难:重新认识“KISS原则”的意义

RSS Feed 文章标题整理 微积分在生活中的应用与思维启发 捕鹿到瞬时速度的趣味探索 微积分是一扇通往更广阔世界的门&#xff0c;从生活中学习思维的工具。 数据库才是最强架构 你还在被“复杂架构”误导吗&#xff1f; 把业务逻辑写入数据库&#xff0c;重新定义简单与效率。…

网络原理(一):应用层自定义协议的信息组织格式 初始 HTTP

目录 1. 应用层 2. 自定义协议 2.1 根据需求 > 明确传输信息 2.2 约定好信息组织的格式 2.2.1 行文本 2.2.2 xml 2.2.3 json 2.2.4 protobuf 3. HTTP 协议 3.1 特点 4. 抓包工具 1. 应用层 在前面的博客中, 我们了解了 TCP/IP 五层协议模型: 应用层传输层网络层…

【JUC-Interrupt】中断相关概念

线程中断 一、相关概念二、API2.1、isInterrupted方法2.2、interrupted方法2.3、interrupt 三、总结&#xff1a; 一、相关概念 一个线程不应该由其他线程中断或停止&#xff0c;应该有线程自己来决定。 在Java中没有办法立即停止一个线程&#xff0c;因此提供了用于停止线程…

直播技术-Android基础框架

目录 &#xff08;一&#xff09;直播间架构 &#xff08;二&#xff09;核心任务调度机制 &#xff08;1&#xff09;复制从滑动直播间加载流程 &#xff08;2&#xff09;核心任务调度机制-代码设计 &#xff08;3&#xff09;核心任务调度机制-接入指南 (三&#xff0…

【es6】原生js在页面上画矩形添加选中状态高亮及显示调整大小控制框(三)

接上篇文章&#xff0c;这篇实现下选中当前元素显示调整大小的控制框&#xff0c;点击document取消元素的选中高亮状态效果。 实现效果 代码逻辑 动态生成控制按钮矩形,并设置响应的css // 动态添加一个调整位置的按钮addScaleBtn(target) {const w target.offsetWidth;con…

ArcGIS应用指南:ArcGIS制作局部放大地图

在地理信息系统&#xff08;GIS&#xff09;中&#xff0c;制作详细且美观的地图是一项重要的技能。地图制作不仅仅是简单地将地理数据可视化&#xff0c;还需要考虑地图的可读性和美观性。局部放大图是一种常见的地图设计技巧&#xff0c;用于展示特定区域的详细信息&#xff…

记录一些PostgreSQL操作

本文分享一些pg操作 查看版本 select version(); PostgreSQL 11.11 查看安装的插件 select * from pg_available_extensions; 查看分词效果 select ‘我爱北京天安门,天安门上太阳升’::tsvector; ‘天安门上太阳升’:2 ‘我爱北京天安门’:1select to_tsvector(‘我爱北京天…

RHCSA作业2

压缩 将整个 /etc 目录下的文件全部打包并用 gzip 压缩成/back/etcback.tar.gz [rootjyh ~]# cd /etc [rootjyh etc]# tar -czf etcback.tar.gz /etc tar: Removing leading / from member names tar: /etc/etcback.tar.gz: file changed as we read it [rootjyh etc]# ls使当…

大语言模型(LLM)安全:十大风险、影响和防御措施

一、什么是大语言模型&#xff08;LLM&#xff09;安全&#xff1f; 大语言模型&#xff08;LLM&#xff09;安全侧重于保护大型语言模型免受各种威胁&#xff0c;这些威胁可能会损害其功能、完整性和所处理的数据。这涉及实施措施来保护模型本身、它使用的数据以及支持它的基…

递推进阶与入门递归

一、递推进阶&#xff0c;勇攀高峰 昆虫繁殖 题目描述 科学家在热带森林中发现了一种特殊的昆虫&#xff0c;这种昆虫的繁殖能力很强。每对成虫过X个月产Y对卵&#xff0c;每对卵要过两个月长成成虫。假设每个成虫不死&#xff0c;第一个月只有一对成虫&#xff0c;且卵长成成虫…

深入浅出:JVM 的架构与运行机制

一、什么是JVM 1、什么是JDK、JRE、JVM JDK是 Java语言的软件开发工具包&#xff0c;也是整个java开发的核心&#xff0c;它包含了JRE和开发工具包JRE&#xff0c;Java运行环境&#xff0c;包含了JVM和Java的核心类库&#xff08;Java API&#xff09;JVM&#xff0c;Java虚拟…