攻防世界illusion暴力破解

看算法是不可能看算法的,这辈子都不可能看算法的,汇编又不会,出题人又苟得一匹,加密算法就算每一行都看懂了也不知道整体函数是干嘛的,只有暴力破解这种东西才能维持生活。

一、初步分析

先把illusion.apk拖进jadx进行分析,发现java逻辑很简单,就主界面一个按钮,点击就会调用CheckFlag函数进行校验,这个函数传入两个参数,一个是flag,一个是encflag
其中flag是我们输入的值,encflag是存在文中进行读取的,拿jadx直接打开便可得到

二、ida pro进行So文件分析

接着便用ida pro打开so文件进行分析(用Frida写完脚本后死活触发不到,后面看了网上大哥解体思路才发现这是个假函数,根本没有调用,而且对比的字符串也不对,所以hook它根本没有用,此处就不再演示了。 PS: 然额我在这儿死磕了十几个小时,算出来结果不对,一直以为是算法的特性。。。。)
真正调用的函数需要去Jni_Onload这个函数中找,最终找到的函数为sub_dc8这个函数(Tips:定位到相关代码按F5可以调出伪代码,在伪代码中按TAB键可以跳转到对应的汇编代码)
然后就需要开始分析伪代码了(咱就是说,虽然不想分析代码,但也不能一点儿代码不看)

根据伪代码分析,核心思路就是将输入的flag字符串逐个字符通过运算后,进行储存,然后查看是否和encflag一样。

显然,这儿的伪代码是有问题的,sub_10c0函数的返回值没写明,而且V7变量也没赋值,虽然猜测过函数的值直接赋值给V7然后+32,但结果显然不对。(因为在研究解密函数几小时无果后,果断百度求助大佬,然后某位大佬通过枚举发现,这函数就返回0,1两个值)

并且sub_10c0的核心函数是里面的sub_1028,大概长这样

像我这种计算机渣渣,百度了半天就算能差不多搞明白某几步在干嘛,也看不懂整体函数是在干嘛,更整不出decode函数来反向推演。

三、暴力破解

于是乎,咱有了一个大胆的想法,既然正确的flag加密和flag_enc全等,而且flag加密后的位数和加密前的位数相同,那么我可以先输入一个字符,加密后必然等于flag_enc的第一个字符,来暴力破解第一个,破解完第一个后再破解第二个,反正每个字符最多也就127种可能,时间复杂度也不高。

暴力破解的关键点在于修改传入的参数,以及获取每次加密后的字符串,传入的参数可以直接主动调用sub_dc8函数进行,加密后的字符串可以根据最后的判断两个加密串是否全等的函数j_strcmp的入参进行获取。

然而frida的So调用不是很友好(可能是我比较菜),途中经历过无法主动调用sub_dc8函数,尝试模拟点击按钮以触发sub_dc8函数,以上操作调用sub_dc8函数后均未触发j_strcmp函数,导致frida以失败告终。(失败的hook脚本就不放来,太乱了。。。)

在Frida进行无数次尝试后,无计可施的我已经渐渐开始放弃了Frida,偶然想起好像有个叫unidbg个东西,不知道干啥用的。抱着多学门手艺死(马当活马医)的态度,去了解了一下,发现是专门针对So的工具。于是忽,在大量google baidu后,终于写出了unidbg的暴力破解脚本,并成功打出flag,脚本如下:

package com.test;import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Emulator;
import com.github.unidbg.arm.HookStatus;
import com.github.unidbg.hook.HookContext;
import com.github.unidbg.hook.ReplaceCallback;
import com.github.unidbg.hook.hookzz.HookZz;
import com.github.unidbg.linux.android.AndroidARMEmulator;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.Module;
import com.github.unidbg.linux.android.dvm.array.ByteArray;
import com.github.unidbg.memory.Memory;
import com.github.unidbg.pointer.UnidbgPointer;
import com.sun.jna.Pointer;
import unicorn.Arm64Const;
import unicorn.ArmConst;import java.io.File;
import java.util.ArrayList;
import java.util.List;public class illusion extends AbstractJni {private final AndroidEmulator emulator;private final VM vm;private final Module module;private DvmClass cNative;private static String r0;private illusion () {// 创建模拟器实例,进程名建议依照实际进程名填写,可以规避针对进程名的校验emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("monkeylord.illusion").build();// 获取模拟器的内存操作接口final Memory memory = emulator.getMemory();// 设置系统类库解析memory.setLibraryResolver(new AndroidResolver(23));// 创建Android虚拟机,传入APK,Unidbg可以替我们做部分签名校验的工作
//        vm =  emulator.createDalvikVM(new File("unidbg-android/src/test/java/com/test/llusion.apk"));vm =  emulator.createDalvikVM();// 加载目标SODalvikModule dm = vm.loadLibrary(new File("unidbg-android/src/test/java/com/test/libnative-lib.so"), true); // 加载so到虚拟内存//获取本SO模块的句柄,后续需要用它module = dm.getModule();vm.setJni(this); // 设置JNIvm.setVerbose(false); // 打印日志dm.callJNI_OnLoad(emulator); // 调用JNI OnLoad}public static void main(String[] args) {illusion test = new illusion();test.hook();String flag_enc = "Ku@'G_V9v(yGS";String flag = "";for (int index = 0; index < flag_enc.length(); index++) {for (int i = 33; i < 127; i++) {test.CheckFlag(flag + String.valueOf((char) i), flag_enc);  // 进行判断if ((illusion.r0.length() > index)  && (flag_enc.charAt(index) == illusion.r0.charAt(index))) {flag += String.valueOf((char) i);break;}}System.out.println("Flag[0:"+index+"]: "+flag);}System.out.println("Completely Flag is: "+flag);}private void CheckFlag(String flag, String flag_enc) {//创建jobject对象DvmObject<?> thiz = vm.resolveClass("monkeylord.illusion").newObject(null);List<Object> list = new ArrayList<>(10);list.add(vm.getJNIEnv());list.add(0);  list.add(vm.addLocalObject(new StringObject(vm, flag)));   // arg 3list.add(vm.addLocalObject(new StringObject(vm, flag_enc)));   // arg 4Number number =  module.callFunction(emulator, 0xdc9, list.toArray());
//        System.out.print("result:");
//        DvmObject<?> object = vm.getObject(number.intValue());
//        System.out.print(object.getValue().toString());}public void hook() {HookZz hook = HookZz.getInstance(emulator);hook.replace(module.base + 0x00000E64+1, new ReplaceCallback() {@Overridepublic HookStatus onCall(Emulator<?> emulator, HookContext context, long originFunction) {//                System.out.println(context.getPointerArg(0).getString(0));  // 入参1 R0寄存器illusion.r0 = context.getPointerArg(0).getString(0);
//                System.out.println(context.getPointerArg(1).getString(0));  // 入参2 R1寄存器return super.onCall(emulator, context,originFunction);}}, true);}
}

运行结果如下:
Flag->CISCN{GJ5728}

最后,我只想说,unidbg赛高!!!!!

攻防世界illusion暴力破解相关推荐

  1. Linux SSH密码暴力破解技术及攻防实战

    对于Linux操作系统来说,一般通过VNC.Teamviewer和SSH等工具来进行远程管理,SSH是 Secure Shell的缩写,由IETF的网络小组(Network Working Group ...

  2. 攻防世界(pwn)--Mary_Morton 利用格式化字符串+栈溢出破解Canary的保护机制

    ctf(pwn) canary保护机制讲解 与 破解方法介绍 程序执行流程 有三个选项,1是利用栈溢出,2是利用格式化字符串,3是退出;可连续输入多次; IDA分析 解题思路 程序存在canary保护 ...

  3. 网络攻防研究第001篇:尝试暴力破解某高校研究生管理系统学生密码

    前言 如果你是在校大学生,而且还对网络攻防比较感兴趣的话,相信你最开始尝试渗透的莫过于所在院校的学生管理系统.因为一般来说这样的系统往往比较薄弱,拿来练手那是再合适不过的了.作为本系列的第一篇文章,我 ...

  4. 攻防世界 黑客精神unidbg破解

    攻防世界 黑客精神unidbg破解 一.Jadx分析 首先用jadx打开apk文件,查看MainActivity可以发现,页面判断了MyApp.m这个类变量的值,并调用类work()这个函数,且当类变 ...

  5. Web攻防之暴力破解(何足道版)

    然后发在先知平台备份了一份 1 @序 攻防之初,大多为绕过既有逻辑和认证,以Getshell为节点,不管是SQL注入获得管理员数据还是XSS 获得后台cookie,大多数是为了后台的登录权限,假若我们 ...

  6. 【安全攻防系列 Windows实战】教你如何 FTP暴力破解、四大病毒勒索病毒、蠕虫病毒、ARP病毒、挖矿病毒,怎么处理应急场景

    文章目录 FTP暴力破解 0x00 前言 0x01 应急场景 0x02 日志分析 0x04 处理措施 勒索病毒 0x00 前言 0x01 应急场景 0x02 事件分析 0x04 防范措施 蠕虫病毒 0 ...

  7. Python攻防-暴力破解ZIP加密文件的密码

    文章目录 前言 Python语法 自定义迭代器 Python多线程 Python脚本 单线程数字爆破 单线程字符爆破 多线程字典爆破 总结 前言 本文继续记录学习下 Python 的有趣应用:借助 P ...

  8. 【安全攻防系列】教你如何 ssh暴力破解、捕捉短连接、清理挖矿病毒、盖茨木马和DDOS病毒

    文章目录 ssh暴力破解 0x00 前言 0x01 应急场景 0x02 日志分析 系统账号情况 /var/log/secure /var/log/auth.log 0x03 处理措施 0x04 我的实 ...

  9. Python黑客攻防(十四)暴力破解FTP口令

    注:本篇文章为个人学习笔记仅供学习交流,请勿用于非法用途. 参考:<Python绝技:运用Python成为顶级黑客>. 前言: 从安全方面考虑,网站允许匿名FTP访问似乎是很疯狂的做法.然 ...

最新文章

  1. 通过regedt查看计算机密码,win10系统通过注册表设置定时更换密码提醒的处理步骤...
  2. 徐尧:如何搭建好的数据指标体系?
  3. 三个数字的运算规律预测
  4. 继承复习-发均分红包案例
  5. MySQL sql99语法—非等值连接
  6. ReentrantLock.nofairTryAcquire
  7. JSP(五):属性范围
  8. XML--XML作用
  9. 美国返还中国文物,阿里谣言粉碎机获奖,教育部规范研究生培养,腾讯严打微信跑分活动,推动降低港澳漫游费,这就是今天的大新闻。...
  10. 菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计
  11. HDU 4927 大数运算
  12. ASP.NET中常用功能代码总结(1)——发送邮件篇
  13. vue-自定义组件传
  14. 不参与,你怎么知道能有多刺激——一个币客与市场的深入对话
  15. 2022全新彩虹商城知识付费模板源码+修复改良版
  16. thinkpad x250装黑苹果教程_GitHub - siweijianrong/Hackintosh: Hackintosh黑苹果长期维护机型EFI及安装教程整理...
  17. c语言三个学生每人四门,C语言一道题目,求教教3.统计一个班的学生成绩。要求程序具有如下功能:(1) 每个学生的学号和四门功课的成绩从键盘读入。...
  18. 小学计算机教室使用汇报材料,勃李小学“教育信息化示范学校”汇报材料
  19. MATLAB实现光谱曲线包络线去除,附源代码
  20. HFSS仿真侧馈微带天线学习笔记

热门文章

  1. srm软件非生产采购的解决方案
  2. python人脸识别门禁_树莓派人脸识别门禁系统图文教程
  3. Oracle索引梳理系列(六)- Oracle索引种类之函数索引
  4. LabVIEW的万金油框架
  5. 特征选择方法_识别最优的数据驱动特征选择方法以提高分类任务的可重复性
  6. 网民热议:顺丰菜鸟之争凸显大数据巨大商业价值
  7. 关闭LINUX报警声
  8. 玩lol哪个服务器最新,LOL:坑最多的四个服务器,有没有你的大区?
  9. 「SDOI 2008」山贼集团
  10. 洛谷 P2015 二叉苹果树 题解