CTF Android逆向 -- KGB Messenger APK文件结构介绍,破解账户与密码,静态分析,修改并构建APK,逆向算法,APK文件签名

news2024/11/27 6:18:33

前言

一次练习Android逆向的记录,写得很详细,有什么没有理解的地方可以私信

csdn不让我加外链,所以将链接前面的#号去掉即可

题目:

ht#tps://github.com/tlamb96/kgb_messenger

在这里插入图片描述

在这个挑战中,一共有三个flag,翻译为中文是

在这里插入图片描述

使用到的工具

adb:apt install adb
安卓模拟器:ht#tps://www.yeshen.com/
Apktool:apt install apktool
JD-GUI:ht#tps://github.com/java-decompiler/jd-gui/releases/
dex2jar:apt install d2j-dex2jar
uber-apk-signer:ht#tps://github.com/patrickfav/uber-apk-signer

安装程序

我们使用安卓模拟器来安装这个apk程序,直接将apk包拖入模拟器即可安装

在这里插入图片描述

在这里插入图片描述

但是打开这个程序就会报错,提示为这个app只能在俄罗斯设备上运行

apk文件结构介绍

在这里插入图片描述

AndroidManifest.xml:

https://developer.android.com/guide/topics/manifest/manifest-intro
1.应用程序包的名称
2.应用程序的所有组件
3.此应用程序运行需要什么权限,以及其他应用程序访问此应用程序的信息所需的权限
4.兼容性功能

res:

包含资源但具有开发人员无法更改的预定义文件夹层次结构的文件夹。这些文件用于为不同的屏幕大小、操作系统版本和多语言支持提供替代方案。

META-INF:

这是一个包含验证信息的文件夹。这是在“签署”应用程序时生成的。这个文件夹APK中包含的每个文件的指纹信息。这意味着对 APK 的任何修改(甚至替换图标)都需要重新签署 APK,否则操作系统将拒绝安装

classes.dex:

Google 的 Java VM 版本的专有格式,它包含所有编译成称为Dalvik的特定字节码的 Java/Kotlin 代码

resources.arsc:

包含将代码 (classes.dex) 链接到资源 (res) 的信息的文件。例如,代码可能引用对话框的文本,而资源包含所有语言的文本。然后,Android 操作系统会根据设备的区域设置选择正确的语言。

Flag1

静态分析

使用Apktool解码APK并将其输出到kgb文件夹中

apktool d kgb-messenger.apk -o kgb

首先查看程序的AndroidManifest.xml文件,看看程序启动时调用了什么

在这里插入图片描述

启动时调用的是MainActivity函数

我们用dex2jar将apk转换为.jar 格式,因为这样我们之后就可以使用JD-GUI来查看程序的Java代码

d2j-dex2jar.sh kgb-messenger.apk -o kgb.jar

在这里插入图片描述

然后用JD-GUI分析这个jar包

在这里插入图片描述

双击打开程序,按下ctrl+o,选择jar包

在这里插入图片描述

在这里插入图片描述

找到MainActivity.class,在下面可以看到程序启动时报错的字符串

在这里插入图片描述

if (str1 == null || str1.isEmpty() || !str1.equals("Russia")) {
      a("Integrity Error", "This app can only run on Russian devices.");
      return;
} 

首先程序会判断str1的值是否等于Russia,不等于的话就会报错

if (str2 == null || str2.isEmpty() || !str2.equals(getResources().getString(2131558400))) {
      a("Integrity Error", "Must be on the user whitelist.");
      return;
}

然后会判断str2的值是否等于2131558400,我们需要将这个值转换为十六进制值,才能在xml文件中找到对应的位置

在这里插入图片描述

然后在/res/values文件夹里查找0x7f0d0000的位置

grep -inr --color 0x7f0d0000 *.xml

在这里插入图片描述

可以看到name的值,接着我们搜索User

在这里插入图片描述

在这里可以看到一个base64编码,我们解密看看

echo "RkxBR3s1N0VSTDFOR180UkNIM1J9Cg==" | base64 -d

在这里插入图片描述

成功找到第一个flag

FLAG{57ERL1NG_4RCH3R}

Flag2

在这里插入图片描述

我们需要想办法让这两个if判断成功,才能进入下一步login挑战

我们可以修改程序,将这两个if判断去掉,然后构建一个新的apk,之前我们用apktool解码过这个apk包,选择我们直接搜索即可

找到MainActivity文件

find /home/kali/apk/kgb -name "MainActivity*"

在这里插入图片描述

打开第一个文件,定位到0x7f0d0000的位置

在这里插入图片描述

我们需要把第115行到175行的内容都删除,然后将186行的内容更改为return-void

在这里插入图片描述

保存文件

构建apk

然后使用Apktool构建一个新的apk

apktool b kgb -o new_kgb.apk

在这里插入图片描述

给apk文件签名

构建完apk文件后,不能直接安装,我们需要先给apk文件签名

java -jar uber-apk-signer-1.2.1.jar -a new_kgb.apk

在这里插入图片描述

在这里插入图片描述

然后将这个新生成的apk直接拖到安卓模拟器内并打开

在这里插入图片描述

破解账户与密码

现在就不会报错了,回到JD-GUI,单击LoginActivity

在这里插入图片描述

在这里插入图片描述

在这里可以看到程序登录验证的代码,和我们找第一个flag的步骤相似,我们需要将2131558450转换为16进制,来查找用户名

grep -inr --color 0x7f0d0032 *.xml

在这里插入图片描述

name的值为username,现在查找username字符串

在这里插入图片描述

用户名为:codenameduchess

现在我们需要知道密码是什么,回到JD-GUI

在这里插入图片描述

双击这个函数,跳转到密码验证的地方

在这里插入图片描述

我们输入的密码和2131558446进行了比较,将其转换为十六进制后继续寻找

在这里插入图片描述

name的值为password,继续寻找

在这里插入图片描述

在这里有一串md5值,但是无法爆破出来,根据题目简介

在这里插入图片描述

this is a “recon” challenge,难道意思是需要社会工程吗

用Google搜索这个用户名

在这里插入图片描述

在这里插入图片描述

一个动画人物,现在直接搜索密码试试

在这里插入图片描述

在这里插入图片描述

password为:Guest,题目说字符均为小写,所以是:guest

现在登录程序

在这里插入图片描述

在这里插入图片描述

登录成功,获得flag

flag{G00G1_PRO}

我对guest字符串进行了加密
在这里插入图片描述

在这里插入图片描述

发现是这个md5值不完整,开头少了一个0,不然是能被爆破出来的

Flag3

回到JD-GUI,单击MessageActivity

在这里插入图片描述

在这里插入图片描述

在这下面可以看到获取最后的flag代码,每当我们发送消息时,都会调用onSendMessage函数,

EditText editText = (EditText)findViewById(2131165225);
String str = editText.getText().toString();

我们输入的文本会转换成String str

if (a(str.toString()).equals(this.p)) {
        Log.d("MessengerActivity", "Successfully asked Boris for the password.");
        this.q = str.toString();
        this.o.add(new a(2131558434, "Only if you ask nicely", j(), true));
        this.n.c();
      } 

然后str传参到a函数里,并且在这里调用了equals函数来检查它是否等于p

在这里插入图片描述

在上面可以看到p的值,下面可以看到a的函数代码

在这里插入图片描述

这个a函数对我们输入的字符串进行一些异或操作,我们需要写一个脚本来还原字符串

p = "V@]EAASB\022WZF\022e,a$7(&am2(3.\003"
p = list(str(p))

for i in range(len(p) // 2):
	p[i] = chr(ord(p[i]) ^ 0x32)
	p[len(p) // 2 + 1 + i] = chr(ord(p[len(p) // 2 + 1 + i]) ^ 0x41)

p.reverse()
print("".join(p))

在这里插入图片描述

运行脚本,获得字符串,回到模拟器,输入字符串并发送

在这里插入图片描述

在这里插入图片描述

r的值为

在这里插入图片描述

b函数进行的操作

在这里插入图片描述

我们继续写一个脚本来还原字符串

import string

r = "\000dslp}oQ\000 dks$|M\000h +AYQg\000P*!M$gQ\000"
r = list(str(r))
r.reverse()

for i in range(len(r)):
	if i % 8 == 0:
		print("_", end="")
		continue 
	for ch in string.printable:
		final_ch = chr((ord(ch) >> (i % 8)) ^ ord(ch))
		if final_ch == r[i]:
			print(ch, end="")
print("")

运行脚本,获得字符串

在这里插入图片描述

还原一下,字符串为

May I *PLEASE* have the password

回到模拟器,发送消息
在这里插入图片描述

获得最后的flag

FLAG{p455w0rd_P134SE}

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

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

相关文章

UE4 Pak打包、挂载、加载

首先,必须得明确的一点就是如果想要加载Pak内资源,那么这些资源必须是经过Cook的。如果打包的是未Cook的资源,那么即使Pak挂载成功,也不可能会成功加载Pak内资源。 不知道怎么生成Cook资源,可以看我前一篇 ​​​​​…

持之以恒,方得始终|海联捷讯的六年数字化历程

企业数字化已经成为了企业家与管理者的共识。如何实现数字化转型,从认知到战略,上至组织文化,下至每个组织成员的行为,都需要做出改变——它本质上是一种创新的企业管理模式和运营机制,重要性不言而喻。而降本增效也是…

学习->C++篇十七:C++的类型转换和IO流

目录 一.类型转换 1.C语言中的类型转换 2.C中的类型转换 二.IO流 1. C语言的输入与输出 2. 流是什么 3. stringstream 一.类型转换 1.C语言中的类型转换 (1)隐式类型转换,编译阶段自动进行,不能转换就编译报错。&#xff…

TCP/IP四层协议

七层模型层数太多记不住,四层模型 应用层,传输层,网络层,网络接口层的名字必须记得滚瓜烂熟。(重点也是tcp/ip四层模型) 四层模型: 1.应用层: 两台终端设备上的应用程序 应该遵守…

三面美团 Java 岗,HR 现场直接发 offer,他是横着走出来的

前情提要 这是一个发生在我朋友身上的真实事情: 这里就叫他程序员 Y 吧。 程序员 Y 工作不到两年,周末在朋友圈发了个喜报,准备入职美团。 之后,我就带着祝福跟 Y 聊了许久,聊天的内容就是具体了解一下他面试的过程…

技术分享之IntelliJ plugin

资料 https://zhaojian.blog.csdn.net/article/details/127882946 Plugin Configuration File https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html 今天分享的主要内容: 了解插件能够做什么 如何开发一个插件 阅读两个常用的插件源码 intellij的窗…

15.Django大型电商项目之创建模型与sql表反向生成模型

1.用户模块模型类创建 1.1 创建用户的子应用 python .\manage.py startapp userapp在settings中挂载子应用 创建子应用urls.py 在主应用中加入子应用的urls.py 1.2 创建表 如何在直接导入sql文件形成表,这里就直接在navicate中把sql文件拖进去点击开始即可 这里…

大数据技术系列:图解大数据平台开发

导言 在前面的文章《「大数据技术体系」学习实践导览》中,概要式的梳理了大数据平台的业务目标,大数据平台的架构框架,大数据平台中常用的技术及工具,数据治理四方面的内容,算是对自身所了解大数据知识体系的抛砖引玉…

第十四届蓝桥杯集训——JavaC组第十二篇——while循环(循环四要素)

第十四届蓝桥杯集训——JavaC组第十二篇——while循环(循环四要素) 前言 百度解析:以环形、回路或轨道运行;沿曲折的路线运行;特指运行一周而回到原处,再转。或说反复地连续做某事。 那么,在程序中依然是连续重复的按照一定的规则去执行某事。 程序计数器…

如何把视频分屏?教你轻松学会视频分屏

分屏视频该怎么操作?不知道大家有没有看到过这样一个视频,就是一个视频里有两个或者有更多个画面,我们在观看的时候可以同时看好几个画面。其实这就是分屏视频,在一个页面中加入多个画面。这样的视频是不是既好玩又炫酷呢&#xf…

尚硅谷Promise笔记

文章目录一、Promise介绍与基本使用1-1.初体验之promise封装ajax请求1-2.Promise对象状态属性PromiseState的值有三个1-3.Promise对象状态属性PromiseResults二、Promise API2-1.Promise构造函数Promise(excutor){}2-2.Promise.prototype.then 方式:(onResolved,onR…

App 黑白化技术实践

前言 很高兴遇见你~ 最近打开各大 App 会发现它们都做了黑白化,如下支付宝的处理: 可以看到应用设置了全局灰色调,表达了一种对逝者的哀悼,非常的应景和人性化。作为程序猿,我们来探索一下它从技术角度是怎么实现的。…

[附源码]Python计算机毕业设计SSM基于java旅游信息分享网站(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

汇编语言第2章—寄存器

8086CPU有14个寄存器,分别是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。2.1 通用寄存器 8086CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,称为通用…

【Spring】AOP记录日志

我的aop记录日志,可以记录:【 操作类型、操作描述、参数、登录项目的用户ip】 当然记录什么靠你自己决定。 一.自定义一个注解 Target({ElementType.METHOD,ElementType.PARAMETER}) Retention(RetentionPolicy.RUNTIME) Documented public interface A…

两位前阿里 P10 的成长经历的启发

目录 汤峥嵘的成长经历 关键节点一:到美国留学 关键节点二:美国工作十年 关键节点三:八年阿里时光 关键节点四:加入途牛和 VIPABC 毕玄的成长经历 关键节点一:小公司里脱颖而出 关键节点二:加入淘宝…

FineReport数据分析教程- 图表刷新接口

1. 概述 1.1 预期效果 点击按钮可以刷新普通报表或决策报表中的图表,以普通报表为例,效果如下图所示: 1.2 实现思路 通过FR.Chart.WebUtils.getChart("chartID").dataRefresh()获取要刷新的图表对象,其中chartID为图表…

程序员如何写一份更好的简历

简历中的常见错误 1. 信息过多,缺乏重点 信息过多的常见表现是十几行的技能列表, 我举一个血淋淋的例子: 20 行的技能列表,这位求职者开始就把自己了解的所有工具都列出来,希望能够突显自己的经验和学习能力&#xf…

pytorch基础操作(五)多层感知机的实现

1、多层感知机 1、激活函数的引入 这个多层感知机有4个输⼊,3个输出,其隐藏层包含5个隐藏单元。输⼊层不涉及任何计算,因此使⽤此⽹络产⽣输出只需要实现隐藏层和输出层的计算。因此,这个多层感知机中的层数为2。注意&#xff0…

小米盒子为什么搜不到电视家?电视安装包解析错误解决方案

不少的朋友在小米电视盒子上安装了美家市场软件商店后,却发现在市场里面没法安装想要的电视盒子直播软件,这是怎么回事呢?其实大部分原因是电视盒子机制的问题限制了安装,导致部分品牌电视盒子装软件时会弹出“无法安装”的提示。…