攻防世界 黑客精神unidbg破解

一、Jadx分析

首先用jadx打开apk文件,查看MainActivity可以发现,页面判断了MyApp.m这个类变量的值,并调用类work()这个函数,且当类变量m的值为0时会跳转到RegActivity注册页面
RegActivity界面比较简单,就是把输入的sn传入MyApp.saveSN()函数,然后退出,可以看出关键都在MyApp这个类。
所以我们继续查看MyApp这个类,发现类有三个native函数,所以需要进一步分析so文件。
### 二、IDA PRO分析

(1)找关键函数

将对应的so文件拖到ida pro后通过Export栏可以发现有JNi_OnLoad函数,说明函数为动态注册,所以进入JNi_OnLoad函数查看注册的函数。
Tips: ida pro直接反编译的格式可能会很乱,这个时候可以把变量右键设置set item type设置成为JNIEnv*,然后许多函数都能解析出来类,就好看了很多(如果不知道设置哪一个变量,就把能试试的都试一便,总有一个能行_

通过分析Onload函数可以发现注册函数在off_5044这个位置上,点击跳转后发现注册的函数名字符串找到了,但是函数名却是n1,n2,n3,可以对这些函数重命名,这样好看一点儿。
由此三个关键函数,work(), initSN(), saveSN()就找到了。

(2)分析关键函数

- work()函数分析

进入work函数,将传入的变量类型右键设置set lvar type设置为JNIEnv*后,F5反编译如下,可以看到该函数用getValue的方法获取了MyApp.m的值(getValue 函数用同样的方法进行反编译),然后将unk_2EFB或unk_2F25处的值赋给了V3,其中unk_2F25处的值啥也看不到,unk_2EFB处的值能看到有flag字样,应该和flag有关。最后该函数调用类callWork函数(反编译了一下,暂时没看懂,不过不重要)
因此work函数的主要逻辑就是判断MyApp.m的值是否为1,如果为1则赋值对应地址的值给V3,然后调用callWork。

- initSN()函数分析

进入initSN()函数分析其逻辑为:读取reg.dat的内容,如果内容为"EoPAoY62@ElRD",则MyApp.m的值设置为1,否则为0

- saveSN()函数分析

进入saveSN()函数分析,首先修改变量类型,使得反编译更加人性化,一般变量第一个为JEIEnv*, 第二个参数jobject或者jclass, 后面的参数就是传入的native 函数中传入的参数,依次修改尝试就行。
通过分析代码,v10为数组的索引,从0-sn的长度,依次增长,然后将v10的值会在字符串的指定位置取一个值来与sn对应索引位置的字符串作异或运算。所以可以看出逻辑应该为,输入的sn的每一位和字符串"W3_arE_whO_we_ARE"的固定位置的字符进行了异或运算,然后输出到V8上,最后使用f_puts函数保存到文件中。(至于在"W3_arE_whO_we_ARE"取了那几位,不重要,反正异或运算可逆)

(3)整体流程思路

通过分析三个函数,可以看出该程序的整体调用思路为,work->initSN->saveSN,逻辑思路为:

  • (1) work函数:判断MyApp.m的值是否为1,然后赋值对应地址的值给v3
  • (2) initSN函数:判断reg.dat的内容是否为 “EoPAoY62@ElRD”,若是则MyApp.m赋值为1
  • (3) saveSN函数: 将输入的sn与"W3_arE_whO_we_ARE"做异或运算后保存到reg.dat中

通过jadx可以看出只有当MyApp.m的值为1时才算已注册,所以reg.dat的内容应该为"EoPAoY62@ElRD",而reg.dat的内容是根据输入sn与字符串"W3_arE_whO_we_ARE"通过异或的算法得出的,因此只要将"EoPAoY62@ElRD"与字符串"W3_arE_whO_we_ARE"做异或运算的算法,也能得出我们应该输入的sn,及输入"EoPAoY62@ElRD"进行注册就能得到应该输入的sn。

三、unidbg脚本编写

通过编写unidbg脚本,需要实现的函数有

  • saveSN: 主动调用saveSN函数,传入sn参数
  • f_puts: saveSN函数中的子函数,hook该函数可以得到运算后的字符串
  • work: 打印work中的地址unk_2EFB查看是否有提示

整体代码如下

package com.hack;import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Emulator;
import com.github.unidbg.Module;
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.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.memory.Memory;
import com.sun.jna.JNIEnv;
import com.sun.jna.Pointer;
import unicorn.ArmConst;import java.io.File;
import java.util.ArrayList;
import java.util.List;public class hack extends AbstractJni {private final AndroidEmulator emulator;private final VM vm;private final Module module;private DvmClass cNative;private hack () {emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.test").build();final Memory memory = emulator.getMemory();memory.setLibraryResolver(new AndroidResolver(23));vm = emulator.createDalvikVM(new File("unidbg-android/src/test/java/com/hack/hack.apk"));DalvikModule dm = vm.loadLibrary(new File("unidbg-android/src/test/java/com/hack/libmyjni.so"), true);vm.setJni(this);vm.setVerbose(true);dm.callJNI_OnLoad(emulator);module = dm.getModule();}@Overridepublic void setStaticIntField(BaseVM vm, DvmClass dvmClass, String signature, int value) {switch (signature) {case "com/gdufs/xman/MyApp->m:I":System.out.println("> Patched: com/gdufs/xman/MyApp->m:I");return;}super.setStaticIntField(vm, dvmClass, signature, value);}@Overridepublic int getStaticIntField(BaseVM vm, DvmClass dvmClass, String signature) {switch (signature) {case "com/gdufs/xman/MyApp->m:I":System.out.println("> Patched: com/gdufs/xman/MyApp->m:I");return 0;}return super.getStaticIntField(vm, dvmClass, signature);}@Overridepublic DvmObject<?> newObject(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {switch (signature) {case "com/gdufs/xman/MainActivity-><init>()V":System.out.println("> Patched: com/gdufs/xman/MainActivity-><init>()V");return vm.resolveClass("com/gdufs/xman/MainActivity").newObject(null);}return super.newObject(vm, dvmClass, signature, varArg);}@Overridepublic void callVoidMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg) {switch (signature) {case "com/gdufs/xman/MainActivity->work(Ljava/lang/String;)V":System.out.println("> Patched: com/gdufs/xman/MainActivity->work(Ljava/lang/String;)V");return;}super.callVoidMethod(vm, dvmObject, signature, varArg);}public static void main(String[] args) {hack test = new hack();test.hookPuts();test.hookWork();test.saveSN();test.work();}private void saveSN() {List<Object> list = new ArrayList<>(10);list.add(vm.getJNIEnv());list.add(0);list.add(vm.addLocalObject(new StringObject(vm, "201608Am!2333")));   // arg 3Number number =  module.callFunction(emulator, 0x000011F8+1, list.toArray());}private void work() {DvmClass dvmClass = vm.resolveClass("com/gdufs/xman/MyApp");String methodSign = "work()V";DvmObject<?> dvmObject = dvmClass.newObject(null);DvmObject ret = dvmObject.callJniMethodObject(emulator, methodSign);Pointer pointer = emulator.getMemory().pointer(module.base + 0x00002EEB);System.out.println("> Pointer:"+pointer.getString(0x10));}private void hookPuts() {// hook saveSN中的f_puts函数HookZz hook = HookZz.getInstance(emulator);hook.replace(module.base + 0x00002C3C+1, new ReplaceCallback() {@Overridepublic HookStatus onCall(Emulator<?> emulator, HookContext context, long originFunction) {System.out.println("> onCall:f_puts()");System.out.println("> arg0:"+context.getPointerArg(0).getString(0));  // 入参1 R0寄存器return super.onCall(emulator, context,originFunction);}}, true);}private void hookWork() {HookZz hook = HookZz.getInstance(emulator);hook.replace(module.base + 0x000014AC, new ReplaceCallback() {@Overridepublic HookStatus onCall(Emulator<?> emulator, HookContext context, long originFunction) {System.out.println("onCall work");System.out.println(context.getPointerArg(0).getString(0));  // 入参1 R0寄存器return super.onCall(emulator, context,originFunction);}@Overridepublic void postCall(Emulator<?> emulator, HookContext context) {System.out.println("postCall work");System.out.println(context.getPointerArg(0).getString(0));  // 入参1 R0寄存器super.postCall(emulator, context);}}, true);}
}

运行结果如下
根据结果可以发现work中的函数是提示flag格式的,格式为xman{……},而且输入的sn即是flag,然后我们本应该输入的sn由异或运算可以得出为。

所以最终flag为:xman{201608Am!2333}

攻防世界 黑客精神unidbg破解相关推荐

  1. 攻防世界illusion暴力破解

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

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

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

  3. 攻防世界———MISC 高手区题解

    目录 1,base64stego 2,easycap 3,Avatar 4,What-is-this 5,签到题 6,Training-Stegano-1 7,Excaliflag 8,Get-the ...

  4. 攻防世界MISC刷题1-50

    目录 1.ext3 2.base64stego 3.功夫再高也怕菜刀 4.easycap 5.reverseMe 6.Hear-with-your-Eyes 7.What-is-this 8.norm ...

  5. 刚子扯谈:我对黑客精神的一些认知

    文:刚子 谈谈个人对黑客的理解吧,方便大家对"黑客"有所认知. 黑客(英文:Hacker,或称骇客),通常是指对计算机科学.编程和设计方面具高度理解的人. 在信息安全里," ...

  6. 攻防世界- CRYPTO -练习区12题解

    攻防世界- CRYPTO-新手区 一.base64 题目描述: 元宵节灯谜是一种古老的传统民间观灯猜谜的习俗. 因为谜语能启迪智慧又饶有兴趣,灯谜增添节日气氛,是一项很有趣的活动. 你也很喜欢这个游戏 ...

  7. 世界黑客大师赛在京开战 中日美俄等十国战队角逐冠军

    北京时间6月27日,第二届世界黑客大师赛WCTF 2017在北京正式开战.作为全球奖金最丰厚.参赛队伍级别最高的"夺旗类"黑客大赛,本届大赛吸引了来自中国.美国.俄罗斯.法国.瑞士 ...

  8. 攻防世界 ——crypto

    目录 新手区部分题解: 1,easy_RSA 2,Normal_RSA 3, 幂数加密 4,easy_ECC 高手进阶区部分题题解 5, ENC 6,告诉你个秘密 7,Easy-one 8,说我作弊需 ...

  9. 攻防世界 CRYPTO 新手练习区 答题(1-12题解)

    序 传送门:https://adworld.xctf.org.cn/task/ 1.base64 题目描述:元宵节灯谜是一种古老的传统民间观灯猜谜的习俗. 因为谜语能启迪智慧又饶有兴趣,灯谜增添节日气 ...

最新文章

  1. 使用jQuery提交表单
  2. Java并发性和多线程介绍目录
  3. java random用法_JAVA面试题(1)
  4. 全网最细Docker安装Minio,填满最新版大坑(强烈推荐收藏)
  5. android单选按钮空值,Android的 - 空指针异常的对话与单选按钮
  6. Vue3(监视器watch)
  7. [VB]多级目录创建函数,支持很深的目录创建。
  8. 三维计算机视觉(四)--关键点
  9. 每个人心中都有一片极乐净土
  10. [转]编程的首要原则(s)是什么?
  11. 扫描件如何转换成pdf及word文档?
  12. jQuery fsBanner 手风琴
  13. 男儿当杀人!!!!(诗一首)
  14. zkeys阿帕云对接易支付插件,支持zkeys阿帕云最新版(亲测可用)
  15. 陕西省ti杯竞赛题目_2017年全国大学生电子设计竞赛和陕西省(TI杯)校际联赛暨西安电子科技大学校内选拔赛...
  16. 嵌入式数据库系统Berkeley DB
  17. 马云说完新零售,范驰开讲新店商
  18. 华为 无线AP与AC详细配置 你学废了吗?
  19. radmin自动启动服务器,Radmin自动连接器+服务端一键安装
  20. 一念逍遥显示服务器列表失败,一念逍遥账号注册失败怎么办 注册不了解决方法...

热门文章

  1. 黑马程序员_Java_多线程
  2. Beyond Compare 4破解版和破解教程
  3. Unity 程序员推荐书目
  4. 上海大学计算机跨考限制,注意:跨考专业有限制!这些你必须要了解!
  5. origin作图所用数据点太多,做图时需要跳过数个数据给一个标记的方法
  6. 数据分析京东笔记本电脑
  7. html中在图片上写文字,用HTML代码在图片上写字
  8. IP2188中文数据手册
  9. 【视频分享】尚硅谷Java视频教程_Spring注解驱动开发视频教程
  10. 【金山文档】 2021级2021-2022学年第二学期大学物理实验考试表格-软件2112https://kdocs.cn/l/cmrTqjJ1ogsN