type
status
date
slug
summary
tags
category
icon
password
这周干的事情挺多的,复现一些之前没做出来的+给新生们出题
WMCTF剩余RE复现
re1
主要考点:动态注册+hook
这道题主要是判断出错导致没往下面看
在进行讲解动态注册之前,我们要先了解一下什么是jni
JNI 全称是Java Native Interface,为Java本地接口,并提供了若干的 API 连接Java层与Native层。通俗来说,JNI 相当于桥梁,实现了 Java 和 C++ 之间互相访问调用。
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
我们发现这些是经过了hook操作
由于.init_array是在JNI_onload之前执行的,相当于就是把前面的这些函数hook成后面的这些
我们直接定位到off_34028,发现它里的第三个值是个函数
应该是encode函数和比较函数
我们回到hook操作那里
就是魔改的xtea
EXP
easyAndroid
做这个题目前得需要用到unidbg,等学到这个了再去复现这个
“长城杯”全部题解
easyre
就是一个简单的异或
EXP
tmaze
对main函数进行分析,发现它是一个maze的问题
但是它这种迷宫是图的那种,我们直接选用dfs算法,先动态调试,调试出初始地址和最终地址,然后写一个idapython脚本
这个是有参数的动态调试,需要先帮迷宫路径填上去
idapython脚本
xiran
64位go病毒样本分析
给了三个文件,一个是cha(用来求解私钥),一个clickme(病毒样本),还有一个flag.png.xiran.我们需要逆向然后得到解密的flag.png
主要是curve25519得到共享密钥之后才能去解决解密的问题,chacha20是一种流加密的方式,加密即解密,题目中的cha模块就是用来求解私钥的.
具体分析见之前的分析文章
记一次长城杯病毒样本分析 | 5m10v3のBlog
这是一个分享技术的站点
https://5m10v3.top/article/101533f9-4e40-8085-af25-ecd964256e45
关于新生赛出题
IDA基础学习
为了让新生在做招新赛题的时候能够学到一些IDA的操作,出了三道关于IDA操作的题
内容啥的就先不展示了,防止被查到
其中有一道题设置了简单的花指令
在出这道题的时候正好学习了一下怎么写花指令,一开始出了一些问题,刚开始从最简单的花指令开始写的,写的是运算抵消的,发现拖进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里面的函数进行了简单的加密,只需要逆向公式即可
另外几个就是比较简单的题了
还出来了一道c语言数据类型的题目,选手需要知道数据类型的溢出
🤗 总结归纳
在分析样本的时候,主要当时卡在了前面私钥的获取过程,那个递归脚本没有写好,其次就是后面读取文件的时候,判断文件的大小,大于10MB的文件需要分块加密。
还是要多分析一些样本,另外就是加强自己的脚本编写能力
接下来的安排就是学习一些java和安卓逆向
📎 参考文章
有关学习或者复现上的问题,欢迎您在底部评论区留言,一起交流~
- Author:5m10v3
- URL:https://5m10v3.top/article/102533f9-4e40-80db-96f6-c14f07fe99a1
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!