XCTF黑客精神解题报告

2023-11-07

题目来源:https://adworld.xctf.org.cn/

解题环境:kali + frida 12.8.0 + Win10 + IDA PRO 7.0

整体思路

静态分析.dex,应用的核心思路为com.gdufs.xman.MyAPP类中最先执行的initSN函数

其次,当我们在com.gdufs.xman.RegisterActivity中输入注册码,点击注册后,执行saveSN函数

只有当MyApp类中定义的静态字段m=1时,才会执行work函数

而上述三个关键函数,皆为JNI函数,具体实现在libmyjni.so中

那么解题的重心就需要转到so层了
使用IDA打开libmyjni.so,搜索Function name并未找到三个关键函数,说明采用了动态注册,通过frida脚本hook RegisterNatives函数可以得到三个函数在.so文件中的偏移为0x13b1,0x11f9,0x14cd。

分析initSN函数可知该函数主要功能为:打开/sdcard/reg.dat,读取其中的数据与"EoPAoY62@ElRD"进行比较,如果相同则m为1,如果不同则m为0。

 

再看saveSN函数,该函数的逻辑为:将用户输入的注册码经过一系列加密运算处理后,写入到/sdcard/reg.dat中

work函数的功能主要是当检测到m=1时打印提示信息
 

至此,题目意图已经非常明显,当我们输入的注册码经过一系列加密处理后为"EoPAoY62@ElRD",那么就是正确的注册码,即此题的flag。
这里暂不考虑加密细节,直接利用frida对加密函数进行重放以爆破得到明文,下面给出完整爆破代码。

//frida -U -f com.gdufs.xman -l demo.js --no-pause

//int fputs(const char *str, FILE *stream);
var fputs_str = null;
function hook_so_libc_fputs(){
    var libc_addr = Module.findBaseAddress("libc.so");
    var fputs_addr = Module.findExportByName("libc.so", "fputs");
    console.log("[libc.so] hooked fputs, fputs_addr="+fputs_addr);

    Interceptor.attach(fputs_addr,{
        onEnter: function(args){
            fputs_str = args[0].readCString();
            //console.log("[fputs] str="+fputs_str);
        },
        onLeave: function(retval){

        }

    });
}


function algorithm_cracking(){
    Java.perform(function(){
        var MyApp = Java.use("com.gdufs.xman.MyApp");
        var MyApp_instance = MyApp.$new();
        var dict = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()";
        
        var ciphertext = "EoPAoY62@ElRD";
        var ciphertext_array = new Array("EoP", "AoY", "62@", "ElR");
       
        var plaintext = "";
        var flag = 0;
        var t,i,j,k,g;
        var input;
        for (t = 0; t < ciphertext_array.length; t++) {
            flag =0;
            for (i = 0; i < dict.length; i++) {
                if (flag == 1) break;
                for (j = 0; j < dict.length; j++) {
                    if (flag == 1) break;
                    for (k = 0; k < dict.length; k++) {
                        input = "" + dict[i] + dict[j] + dict[k];
                        //console.log(temp);
                        MyApp_instance.saveSN(Java.use('java.lang.String').$new(input));
                        if (fputs_str == ciphertext_array[t]) {
                            console.log("input=" + input + "--output=" + fputs_str);
                            plaintext = plaintext + input;
                            console.log("plaintext="+plaintext);
                            flag = 1;
                            break;
                        } 

                    }
                }
            }
        }

        for (g = 0; g < dict.length; g++) {
            input = "" + dict[g];
            MyApp_instance.saveSN(Java.use('java.lang.String').$new(input));
            if (fputs_str == "D"){
                plaintext =plaintext + input;
                break;
            }
        }
        
        console.log("plaintext="+plaintext);
        console.log("algorithm_cracking finished");
    });


}



setImmediate(hook_so_libc_fputs);

setTimeout(algorithm_cracking,3*1000);







这里注意一个细节:算法爆破一定要注意输入明文与输出密文之间的对应关系,此题经过多次测试,可以得到以下规律:1明文长度与密文长度等价;2明文以3字符为一组进行加密,即爆破算法以3字符为单元依次进行破解。

 

运行frida脚本可以得到本题的最终flag为xman{201608Am!2333}
实际运行起来会非常耗时,大概需要20分钟才能爆破完成。

 

 最终小结

本题主要考察了算法逆向方面的知识点,较为简单。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XCTF黑客精神解题报告 的相关文章

  • 检查 WebView 元素时的 UiAutomator 错误

    I have recently started automation testing in android and was using UiAutomator tool for inspecting UI elements Surprisi
  • Xamarin Android Webview Javascript

    我正在尝试通过 Xamarin for Android 创建一个移动应用程序 它有一个显示网站的 WebView 问题是正常按钮会触发 但 javascript 事件不会触发 我已经启用了 Javascript 但没有运气 如何在 Andr
  • 如何正确释放Android MediaPlayer

    我正在尝试向我的 Android 应用程序添加一个按钮 当点击该按钮时它会播放 MP3 我已经让它工作了 但没有办法释放 mediaPlayer 对象 因此即使在我离开活动后它仍然会继续播放 如果我在react 方法之外初始化MediaPl
  • 按下按钮时应用不同的样式

    有没有办法在按下按钮时将样式应用于按钮 如果我有一种风格样式 xml
  • Gradle 构建错误:无法从 https://repo1.maven.org/maven2/io/fabric/tools/gradle/maven-metadata.xml 加载 Maven 元数据

    我在 Android studio 中遇到 gradle 构建错误 如下所示 Error A problem occurred configuring project MyApp Could not resolve all dependen
  • Bitmap.getPixels() 中的 IllegalArgumentException

    我想将数据从位图复制到int using getPixels 这是我当前的代码 int pixels new int myBitmap getHeight myBitmap getWidth myBitmap getPixels pixel
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • 对于一个单元格,RecyclerView onBindViewHolder 调用次数过多

    我正在将 RecyclerView 与 GridLayoutManager 一起使用 对于网格中的每个项目 我需要调用 REST api 来检索数据 然后 从远程异步获取数据后 我使用 UIL 加载 显示图像 一切似乎都很好 但我发现 on
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 如何检查 Android 中的同步设置

    我正在构建一个 Android 应用程序 我需要检查设备中注册的每个单独帐户的同步设置 我知道我可以通过 ContentResolver 类来做到这一点 但我遇到了一些问题 我已设法获取设备上所有帐户的列表 但我不知道在运行时从哪里获取特定
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 插件“Android Bundle Support”不兼容

    大家好 自从上次更新以来 当我启动 android studio 时 我遇到了一个非常奇怪的错误 我有这个错误 插件错误 插件 Android Bundle Support 不兼容 直到构建 AI 195 SNAPSHOT 我在网上找不到任
  • 在 Android 应用程序资源中使用 JSON 文件

    假设我的应用程序的原始资源文件夹中有一个包含 JSON 内容的文件 我如何将其读入应用程序 以便我可以解析 JSON See 开放原始资源 http developer android com reference android conte
  • 错误:(23, 13) 无法解决:com.google.android.gms:play-services:11.2.0“安装存储库和同步项目”不起作用

    我正在尝试在我的 Android 应用程序中获取位置并更新到服务器 这是我的 Gradle 代码 我在这里包含了compile com google android gms play services 11 2 0 这条线是从文档中 htt
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所

随机推荐

  • 滚动穿透的6种解决方案(转载)

    原文链接 滚动穿透的6种解决方案 在移动端中 如果我们使用了一个固定定位的遮罩层 且其下方的dom结构的宽度 高度超出屏幕的宽度 高度 那么即使遮罩层弹出后铺满了整个屏幕 其下方的dom结构依然可以滚动 这就是大家所说的 滚动穿透 而且经常
  • echarts X轴像直尺一样设置刻度

    在做老师的项目的时候 老师让我们实现X轴的直尺刻度显示 网上查了查相关代码 大家都没有明确介绍 因此我在这里记录一下 自己的学习 先看实现效果 对echarts的xAxis yAxis这两个属性进行修改即可实现 xAxis 第一个 是原X轴
  • npm install、npm install --save与npm install --save-dev (转)

    仅供学习参考 侵权删 以npm安装msbuild为例 npm install msbuild 会把msbuild包安装到node modules目录中 不会修改package json 之后运行npm install命令时 不会自动安装ms
  • qml学习之qwidget与qml结合使用并调用信号槽交互

    学习qml系列之一 说明 学习qml系列之qwiget和qml信号槽的交互使用 并在qwidget中显示qml界面 在qml中发送信号到qwidget里 在qwidget里发送信号给qml 在qwidget里面调用qml界面方式 方式一 使
  • 测试与开发模型

    测试与开发模型 测试的工作流程 1 需求分析 gt 2 测试计划和测试方案 gt 3 测试用例设计 gt 4 测试用例执行 gt 5 评估阶段 测试报告 1 需求分析 分许需求的点 参与需求评审 快速熟悉项目 2 测试计划和测试方案 计划
  • tq210-kernel 4.1.33移植(1)基本移植

    这篇文章讲述一个新的kernel的移植 1 到kernel org下载4 1 33 修改顶层Makefile ARCH arm CROSS COMPILE arm Linux 根据自己的环境修改交叉编译器前缀 如果发现 tmp cc8nFJ
  • 【Attention机制】YOLOX模型改进之(SE模块、ECA模块、CBAM模块)的添加

    文章目录 YOLOX模型改进 模块简介 SE模块 SE模块的具体介绍 插入位置 主要代码 CBAM模块 插入位置 主要代码 目的动机 ECA模块 插入位置 主要代码 模块添加 建立attention py 修改yolo pafpn py文件
  • 在Macbook Pro上为TensorFlow设置GPU

    最近忽然发现自己的Macbook Pro上装有一块额外的NVIDIA GeForce GT 750M显卡 于是蠢蠢欲动想装一个TensorFlow 试试在GPU上跑算法的性能 先进入TensorFlow官网的Mac安装页面 发现要先装一堆N
  • 循环语句

    for循环 for循环其实本质上与while循环本质上是一样的 标准形式 for 语句1 表达式的初始化 语句2 测试条件 语句3 执行更新 语句内容 关于for循环的结构 语句1是表达式是初始化 只会在程序开始的时候执行一次 语句2是判断
  • EMC测试项分类

    EMC包含两大项 EMI 干扰 和 EMS 敏感度 抗干扰 EMI测试项包括 RE 辐射 发射 CE 传导干扰 Harmonic 谐波 Flicker 闪烁 EMS测试项包括 ESD 静电 EFT 瞬态脉冲干扰 DIP 电压跌落
  • linux 日志 硬件检测,在Linux上分析硬件检测日志

    数据库管理员在数据库的运维过程中或多或少要和操作系统乃至硬件打上交道 分析数据库故障时操作系统日志往往也是一个重要的线索来源 以Linux操作系统为例 其主要的日志子系统 syslog subsystem 可大致分为三类 即1 用户连接日志
  • IKE主模式及预共享密钥认证配置实验

    一 组网和实验环境 按如上的接口ip先作配置 本文实验采用的交换机是H3C模拟器 下载地址如下 http forum h3c com forum php mod viewthread tid 109740 highlight H3C E6
  • L1-018 大笨钟(java)

    1 题目详情 微博上有个自称 大笨钟V 的家伙 每天敲钟催促码农们爱惜身体早点睡觉 不过由于笨钟自己作息也不是很规律 所以敲钟并不定时 一般敲钟的点数是根据敲钟时间而定的 如果正好在某个整点敲 那么 当 数就等于那个整点数 如果过了整点 就
  • kerberos认证系统服务器,基于Kerberos认证的NFS服务器搭建

    NFS是Linux下常用的共享软件 v3版本不太安全 无法进行用户认证 这里简单说明一下V4版本和Kerberos配合实现认证访问的过程 0 准备工作 跟之前的Kerberos一样 需要3台机器来做试验 很多资料上写的是两台 即kdc ni
  • 2022年11月14日--11月25日(ue4 tf1视频教程+socket视频教程+cesium for ue源码抄写,本周10小时,合计1747小时,剩余8253小时)

    工作内容中有高并发 我感觉cesium for ue除了例子外 很难突破 所以把网络视频教程学下 学习不是难事 难的是没有资料 从0到1 目前 mysql 7 1 tf1 4 4 oss 12 1 蓝图反射 1 7 moba 1 5 web
  • 【解决新手爬虫 python3】UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘‘ in position

    解决新手爬虫遇到的UnicodeEncodeError gbk codec can t encode character xa0 in position 7084 illegal multibyte sequence 起初的代码 from
  • Qt程序图标

    网络上有很多这方面的介绍 这里只是MARK一下 程序图标说明 准备 1 图标文件 ICO图标文件 也许需要BMP PNG转ICO工具 2 资源文件 RC文件 可手动创建一个空的RC文件 注 这两个文件应与工程文件 PRO 放在同一路径下 步
  • 编写一个函数计算传入字符串中数字、字母、空格以及其它字符的个数

    编写一个函数计算传入字符串中数字 字母 空格以及其它字符的个数 def num str1 a b c d 0 for i in str1 if i isdigit a 1 elif i isalpha b 1 elif i isspace
  • 记录一次生产环境Net Core应用内存暴涨导致OOM的排查过程

    事情起源于某个周五 刚开始是突然发现生产服务不能访问 请求时居然直接提示服务器拒绝响应 然后连用于管理生产环境的Portainer虽然能打开 但登录右上角直接出红色告警信息无法接收服务器信息 进去后所有的node都不显示 生产环境跑了二年多
  • XCTF黑客精神解题报告

    题目来源 https adworld xctf org cn 解题环境 kali frida 12 8 0 Win10 IDA PRO 7 0 整体思路 静态分析 dex 应用的核心思路为com gdufs xman MyAPP类中最先执行