首页
论坛
课程
招聘
[原创]记录一次非常简单的so层小逆向,适合小白入门
2020-8-3 15:58 6179

[原创]记录一次非常简单的so层小逆向,适合小白入门

2020-8-3 15:58
6179

题目要求:找出flag

0x01 前景

一个经过360加固了的APK,我们先用FART脱壳

脱壳带走,分析test

Native化,准备干libso

0x02 操作

==================================开始操作===================================

首先查看init.array部分,它的运行时机真的很早。


窥探一下这里的两个内容:第一个函数.datadiv是异或解密【双击进去后分析逻辑得到】

第二个byte_8905是个被加密过的字节


我们接着看JNI_OnLoad,可以发现只动态注册了一个函数,那我们有理由猜测是test

在动态注册时,我们通过观察IDA的.data.rel.ro需要知道方法结构体信息:

typedef struct {
const char* name;
const char* signature;
void*       fnPtr;
} JNINativeMethod;

结构体包含三部分分别是:方法名、方法的签名、对应的native函数地址;

那么这里我们肯定重点看第三部分,因为要找到具体的解密函数,这时候我们需要在动态注册段对应上:


我们来验证一下:

函数名

byte_1C066:0x87, 0x96, 0x80, 0x87, 0xF3, 0, 0, 0, 0, 0

长度为4

[0]=0x87 ^ 0xF3 = 0x74 = t

[1]=0x96 ^ 0xF3 = 0x65 = e

[2]=0x80 ^ 0xF3 = 0x73 = s

[3]=0x87 ^ 0xF3 = 0x74 = t

合成得:test

所以这是test函数名


函数签名信息

byte_1C070解密后是:(Ljava/lang/String;)Z

正好就是boolean test(string content)


函数注册地址

之后我们来到OOXX函数观看流程,发现JUMPOUT函数,而且进入sub_8930函数查看了一些逻辑之后发现流程晦涩难懂。

当我们遇到晦涩难懂的问题时,不如尝试去用用Frida。


====================================转换思路=========================================


一直以来想用Frida解一道这种验证输入的题,奈何没有找到机会,这一次想尝试一下:

//新建frida_test.js
function hookstrcmp(){
    Java.perform(function() {
        console.log("I am a Hook function");
        var strcmp = Module.findExportByName("libc.so","strcmp");//这里发现无论“libnative-lib.so”还是“libc.so”都是一样的地址
        console.log("find strcmp:",strcmp);
        Interceptor.attach(strcmp, {
            onEnter: function (args) {
                    //hook住后打印strcmp的第一个参数和第二个参数的内容
                    console.log("[*] strcmp (" + ptr(args[0]).readCString() + "," + ptr(args[1]).readCString()+")");
            
            },onLeave:function(retval){}
        });
    })
}

启动frida并attach app的进程

frida -U com.kanxue.test -l frida_test.js

首先敲入

hookstrcmp()

然后再在手机端敲入“bangbang”

观察电脑端日志

我打印出来了整个运行过程中的strcmp,发现只有一处和bangbang进行了比较

毋庸置疑,kanxuetest即flag值


0x03 验证

所以,kanxuetest就是flag。



《0day安全 软件漏洞分析技术(第二版)》第三次再版印刷预售开始!

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (10)
雪    币: 34
活跃值: 活跃值 (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Lateautumn4 活跃值 2020-8-3 23:31
2
0
感恩大佬!
雪    币: 1058
活跃值: 活跃值 (156)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whitehack 活跃值 2020-8-5 10:47
3
1
一丁点都看不懂的路过.....
雪    币: 180
活跃值: 活跃值 (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
疯子Tear 活跃值 2020-8-5 11:41
4
0
怎么看.init_array
雪    币: 419
活跃值: 活跃值 (64)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
eastmaster 活跃值 2020-8-5 15:49
5
0
感觉这个有点取巧,如果比对不是strcmp呢?如果用memcmp, 或者干脆就逐字节比对呢?
雪    币: 1818
活跃值: 活跃值 (72)
能力值: ( LV3,RANK:23 )
在线值:
发帖
回帖
粉丝
Black貓①呺 活跃值 2020-8-5 18:00
6
0
疯子Tear 怎么看.init_array

Shift + F7 ,找到 .init_array 双击进去,是一个 函数表(数组),一个个看就行

最后于 2020-8-5 18:00 被Black貓①呺编辑 ,原因:
雪    币: 180
活跃值: 活跃值 (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
疯子Tear 活跃值 2020-8-9 09:43
7
0
Black貓①呺 疯子Tear 怎么看.init_array Shift + F7 ,找到 .init_a ...
没有怎么办
雪    币: 212
活跃值: 活跃值 (67)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
乔瑞 活跃值 2020-8-9 13:04
8
0
想请问下函数名怎么算的。看的一脸懵逼。
雪    币: 1818
活跃值: 活跃值 (72)
能力值: ( LV3,RANK:23 )
在线值:
发帖
回帖
粉丝
Black貓①呺 活跃值 2020-8-10 09:28
9
0
疯子Tear 没有怎么办
没有就直接关注 JNI_OnLoad 鲁
雪    币: 83
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
烟 鬼 活跃值 2020-8-11 18:33
10
0
样板呢  新手想尝试一下
雪    币: 492
活跃值: 活跃值 (136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Dyingchen 活跃值 2020-8-11 23:37
11
0
能出这个app分析jni onload逻辑流程的教学吗
游客
登录 | 注册 方可回帖
返回