首页
社区
课程
招聘
[原创]GDA CTF应用方向:牛刀小试ONE
发表于: 2023-10-9 14:40 6985

[原创]GDA CTF应用方向:牛刀小试ONE

2023-10-9 14:40
6985

首发:https://sec-in.com/article/2269

作者:梦幻的彼岸

测试程序来源:https://github.com/num1r0/android_crackmes

本篇文章涉及工具:GDA

通过快捷按钮进入APK入口点进行分析,如下图所示:

这段代码定义了一个名为MainActivity的Android应用程序类,它继承自AppCompatActivity。此类中定义了两个私有字段,name和description,分别用于存储应用程序的名称和描述。MainActivity的构造函数中,对这两个字段进行了初始化。

follow_clicked方法用于处理点击事件,它尝试打开一个指向特定Twitter用户的链接。如果第一种方式失败,它会尝试使用另一种方式打开链接。

onCreate方法是Android应用程序的生命周期方法之一,在应用程序启动时运行。在这个函数中,隐藏了应用程序的ActionBar,设置了应用程序的布局,并设置了一个点击监听器,当用户点击'submit'按钮时,会执行MainActivity$1类的实例的onClick方法。

代码内容

这段代码是一个名为MainActivity$1的Java的匿名内部类,它实现了View$OnClickListener接口,这个接口是Android开发中用于处理点击事件的。

分析一下这个类的各个部分:

这里找到了关键判断方法getFlag,双击进入查看

这段代码定义了一个名为FlagGuard的Java类,它具有以下功能:

又看到关键点了用来判断并输出内容,思路,更改判断不输出null,或查看getData方法涉及内容以查找对比的字符串很多概率就是flag

现在修改位置右键点击切换代码功能

smail代码

这里两个思路一个是NOP填充判断或修改判断指令将if-eqz修改为if-nez

两种修改思路都演示下


在要NOP的位置右键点NOP按钮

修改后的效果

此时按r键保存修改

点击OK进行之后的安装测试步骤

选择链接的设备

安装完毕

输入测试

弹出了flag

因之前NOP填充过,此时需要恢复DEX数据重新加载

恢复并重新加载后

在要修改的位置按M进入修改模式或右键修改指令功能

回车确定修改后的效果

这里解析下

if-nez: 对比如果不相等则跳转

if-eqz: 对比如果相等则跳转

这里修改为if-nez后达到输入错误的flag导致对比不先等以输出内容的目的

保存安装测试

同样获取到flag

getData位置双击

这是一个名为 Data 的 Java 类,它包含一个私有权限的 String 类型的变量 secret,以及两个公共方法:Data() 构造函数和 getData() 方法,但是,getData 方法并没有返回 secret 字段的值,而是返回了一个硬编码的字符串("s3cr37_p4ssw0rd_1337")。

前后分析,这个字符串就是对比的关键了

修改判断apk测试

看这样就是关键内容了,和正确的结果对比返回了错误的数据,

安装未修改apk验证

验证成功


同样的方法入口点查看

这里代码和之前类似就不讲解了

这里代码和之前类似就不讲解了

这段代码定义了一个名为 FlagGuard 的Java类。以下是对这个类的详细解析:

同样思路测试

轻松获得flag

这段 Java 代码定义了一个名为Data的类,位于com.entebra.crackme0x02.Data包中。该类有以下内容:

导入了一些所需的类:

java.lang.Object:继承自 Java 的基类Object。

android.content.Context:表示 Android 应用程序中的上下文对象,用于访问应用程序的资源。

java.lang.String:表示 Java 中的字符串类型。


验证

同样通过快捷按键进入

这段 Java 代码定义了一个名为 FlagGuard 的类。该类包含一个名为 flag 的字符数组,以及一个名为 generate 的私有方法。generate 方法的主要目的是生成一个字符串,该字符串基于输入的字符串 p0(在 getFlag 方法中使用)。

首先,代码导入了所需的类,如 Object、String、StringBuilder 和 android.os.Build$VERSION 等。

 接下来,FlagGuard 类的构造函数创建了一个名为 uocharArray 的字符数组,并将其赋值给 this.flag。

generate 方法开始时,定义了几个整数变量,然后创建了一个名为 ointArray 的整数数组。接着,创建了一个名为 str 的字符串构建器,用于存储生成的字符串。同时,创建了一个名为 ointArray1 的整数数组,用于在后续的循环中进行操作。

在 if 语句中,检查 Build$VERSION.CODENAME 的长度是否大于 0。如果满足条件,将执行一个 while 循环。在循环中,对 ointArray1 数组的元素进行了一系列操作,如赋值、移位、相加等。这些操作的具体目的尚不明确,可能与生成字符串有关。

在另一个 if 语句中,如果输入字符串 p0 满足 Data 类的 isPasswordOk 方法,则调用 generate 方法生成字符串。

在 generate 方法中,首先检查输入字符串 p0 是否满足条件。如果满足,将执行一个 for 循环,遍历整数数组 ointArray,并将每个元素的值存储在 flag 数组中。最后,将 flag 数组拼接到字符串构建器 str 中,并返回结果。

总之,这段代码的主要目的是生成一个字符串,该字符串可能与密码验证有关。具体的生成逻辑涉及到一系列复杂的数学运算,但具体含义尚不明确。

总结:可修改判断或查看 generate 方法生成字符串或isPasswordOk内容

轻松获取flag


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2023-10-9 14:42 被梦幻的彼岸编辑 ,原因:
收藏
免费 5
支持
分享
最新回复 (1)
雪    币: 3525
活跃值: (31011)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2023-10-12 09:29
1
游客
登录 | 注册 方可回帖
返回
//