type
status
date
slug
summary
tags
category
icon
password
ez_learn:
32位无壳程序,直接进行ida分析

有汇编说明没有反编译好,估计是有花指令,分析一下

打开这个看看指令数据都是什么

这里一看就是花指令,这个花指令是控制堆栈混淆ida的识别,先来分析一下这个花指令

将阴影部分nop掉
将所有这样的代码改为nop我们就去除了花指令,反编译看一下

very nice
进一步查看加密代码部分
查看具体内容

首先是对key进行了运算,先去看key的加密

在key的加密里面还有花指令,还是那样进行去除
但是可以直接dump下来key,不需要再进行还原了
但是在你调试的时候会发现退出,说明有反调试,就是在导出表里面的TLScallback函数,直接将其nop或者改变逻辑就可以
下面主要说明一下enc的加密:
其实下面这个就是SM4的魔改加密,但是就是想要死扣算法hhh
解密就是这样的操作,此处学习的点是struct包的使用
struct.pack(fmt, v1, v2, ...)
作用是将v1,v2的值按照fmt的格式转换为字节流
返回值:转换后的字节串
struct.unpack(fmt, buffer)
将字节流按照fmt转换为相应的类型
常见的格式化字符
Rustdroid:
安卓动态调试的流程:
直接动态调试,对于key的获取直接使用dump的方式,对于密文我们选择爆破或者z3求解,所以关键点就是对加密流程的理解,将加密代码表达更清晰一些
给一下解密代码(Z3版)
此处我的问题出在LShR上,我用的算术右移,导致出错,所以我们要注意逻辑右移的操作
解密代码,爆破版
对于这个代码,我直接把他的最后加密的stream[]那一部分直接dump下来,因为代码里面有许多不好写的地方就直接改进了,W2就是以获得值

得到
得到flag
WMCTF{2a04aed7-e736-43c4-80a7-f6ed28de34eb}
re1
这个安卓题考点是动态注册和hook函数
动态注册:
下面具体给一下代码的实现,也方便我们以后的识别
静态注册:
静态注册的方法相比于动态注册就显得是一个特定的规则
先后加载顺序
- 加载
.so
库
- 声明 Java 本地方法
- 实现对应的 C/C++ 函数
- 调用本地方法
安卓执行顺序:
- 1、动态链接器加载 SO 文件。
- 2、加载
.init_array
并调用其中的构造函数(这些函数会在JNI_OnLoad
之前执行)。
- 3、调用
JNI_OnLoad
函数进行 JNI 方法的注册和其他初始化操作。
- 4、应用的其余部分开始运行,包括对 Java 层的 JNI 调用。
在ida中查找.init_array这个的方法:
现在分析so文件

这个就是在.init_array的hook函数,把前面的这些函数hook成后面的这些,前面的这些就是我们的check函数,我们可以在JNI_Onload里面找

和我们前面分析的很像,所以我们直接找那个method列表

我们第三个就是指向函数,也就是我们真正的check函数

就是将encode里面的函数hook成那些

经过这个我们可以发现他就是一个xtea,但是经过了魔改,我们直接写脚本解密
easy_android
有点难,等我学学unidbg这些再来补充
- Author:xiaowaaa
- URL:https://www.xiaowaaa.asia//article/50b3d8fe-29fc-4c5c-9a5a-122a4c460d47
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!