type
status
date
slug
summary
tags
category
icon
password
notion image
😀
这周干的事情挺多的,复现一些之前没做出来的+给新生们出题

WMCTF剩余RE复现

re1

💡
主要考点:动态注册+hook
这道题主要是判断出错导致没往下面看
在进行讲解动态注册之前,我们要先了解一下什么是jni
JNI 全称是Java Native Interface,为Java本地接口,并提供了若干的 API 连接Java层与Native层。通俗来说,JNI 相当于桥梁,实现了 Java 和 C++ 之间互相访问调用。
notion image
💡
JNI 最常见的两个作用:
从 Java 程序调用 C/C++ 从 C/C++ 程序调用Java代码。 JNI 是一个双向的接口:通过 JNI 可以在 Java 代码中访问 Native 模块,还可以在 Native 代码中嵌入一个 JVM 并通过 JNI 访问运行于其中的 Java 模块。JNI 将 JVM 与 Native 模块联系起来,从而实现了 Java 代码与 Native 代码的互访-
  • 静态注册一般是应用层使用,绑定包名+类名+方法名,在调用JNI方法时,通过类加载器查找对应的函数。静态注册的缺点是包名、类名或方法名发生修改时,native层的jni方法名也得对应修改。
  • 动态注册一般是 framework 层使用,在JNI_OnLoad() 回调时,把 JNINativeMethod 注册到函数表。

jni静态注册:java_

jni静态注册的特征就是Java_开头
jni静态注册的流程
💡
  • 在 java 代码中定义 native 的方法
  • 根据 java 代码生成.h头文件,用于指定哪一个c/c++的方法去完成Java当中的方
  • 编写 c/c++代码,导入.h头文件,实现 .h头文件中的方法
  • 编写application.mk,Android.mk文件,通过ndk-build生成so文件
  • 在 java 代码中加载 so 文件
  • 逆向步骤:找到so文件,反编译,导出函数中可以找到C语言函数,通过名字找到对java和c的对应关系。
示例:正好记下来以后方便识别

jni 动态注册:JNI_OnLoad

jni动态注册的流程:
💡
  • 在 java 代码中定义 native 的方法
  • 新建 c/c++ 文件,导入jni.h头文件
  • 编写c/c++代码用于实现java层的方法
  • 通过 JNINativeMethod 结构体绑定 java 方法和 c/c++ 方法,通过 jni.h 文件中的RegisterNatives方法注册Java相应的类以及方法
  • 把c/c++当中注册的方法写入到JNL_Olad这个函数当中(JNI_OnLoad是由系统调用)
  • ndk-build 生成so,并在java当中加载 so 文件
  • 逆向步骤:找到so文件,反编译,JNI_Onload
示例:

安卓执行顺序

  • 1、动态链接器加载 SO 文件。
  • 2、加载 .init_array 并调用其中的构造函数(这些函数会在 JNI_OnLoad 之前执行)。
  • 3、调用 JNI_OnLoad 函数进行 JNI 方法的注册和其他初始化操作。
  • 4、应用的其余部分开始运行,包括对 Java 层的 JNI 调用。
因此我们在逆向动态注册的时候需要先找到.init_array

逆向分析

我们可以直接shift+F7打开段的视窗,然后找到.init_array
notion image
我们发现这些是经过了hook操作
notion image
由于.init_array是在JNI_onload之前执行的,相当于就是把前面的这些函数hook成后面的这些
notion image
我们直接定位到off_34028,发现它里的第三个值是个函数
notion image
应该是encode函数和比较函数
notion image
我们回到hook操作那里
notion image
notion image
notion image
notion image
notion image
notion image
就是魔改的xtea

EXP

notion image

easyAndroid

做这个题目前得需要用到unidbg,等学到这个了再去复现这个

“长城杯”全部题解

easyre

notion image
就是一个简单的异或
notion image

EXP

tmaze

notion image
对main函数进行分析,发现它是一个maze的问题
notion image
notion image
但是它这种迷宫是图的那种,我们直接选用dfs算法,先动态调试,调试出初始地址和最终地址,然后写一个idapython脚本
这个是有参数的动态调试,需要先帮迷宫路径填上去
notion image
notion image
idapython脚本
notion image
notion image

xiran

💡
64位go病毒样本分析
给了三个文件,一个是cha(用来求解私钥),一个clickme(病毒样本),还有一个flag.png.xiran.我们需要逆向然后得到解密的flag.png
主要是curve25519得到共享密钥之后才能去解决解密的问题,chacha20是一种流加密的方式,加密即解密,题目中的cha模块就是用来求解私钥的.
具体分析见之前的分析文章

关于新生赛出题

IDA基础学习

为了让新生在做招新赛题的时候能够学到一些IDA的操作,出了三道关于IDA操作的题
notion image
内容啥的就先不展示了,防止被查到
其中有一道题设置了简单的花指令
在出这道题的时候正好学习了一下怎么写花指令,一开始出了一些问题,刚开始从最简单的花指令开始写的,写的是运算抵消的,发现拖进ida里面可以被识别.但是它会使堆栈失衡
ida反汇编器的原理是行进递归反拒绾算法
其实总结出来基础的花指令就是以下这几种,同时也是能被逆向工作人员容易识别的
  • 无条件跳转的jmp db型
  • 条件跳转的jmp db型(这个也是CTF比赛中常见的类型)
jz,jnz (永恒跳转)
  • jmp to db干扰分析型(jx+jnx)
  • call +db+平衡
后面的平衡可以是指pop eax,或者使add esp,0x4,中间还可以穿插别的花指令,call的偏移要根据调试进行修改
  • call + add [esp], n + retn
然后出这道题只在几个函数里面加了花指令,希望他们可以学会patch功能,以及怎么恢复代码和函数

简单加密入门

写了一个excel,用excel里面的函数进行了简单的加密,只需要逆向公式即可
notion image
notion image
另外几个就是比较简单的题了
还出来了一道c语言数据类型的题目,选手需要知道数据类型的溢出

🤗 总结归纳

在分析样本的时候,主要当时卡在了前面私钥的获取过程,那个递归脚本没有写好,其次就是后面读取文件的时候,判断文件的大小,大于10MB的文件需要分块加密。
还是要多分析一些样本,另外就是加强自己的脚本编写能力
接下来的安排就是学习一些java和安卓逆向

📎 参考文章

💡
有关学习或者复现上的问题,欢迎您在底部评论区留言,一起交流~
 
 
关于SIMD在逆向中的应用记一次长城杯病毒样本分析
Loading...
5m10v3
5m10v3
目前主攻方向为Re
Announcement
🎉5m10v3のBlog已经上线啦🎉
-- 感谢各位师傅的支持 ---
👏欢迎师傅们前来交流👏