学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1171

主题
发表于 2020-8-3 23:52:18 | 查看: 9385| 回复: 2

相关题目:

题目要求:找出flag
0x01 前景
一个经过360加固了的APK,我们先用FART脱壳
脱壳带走,分析test

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

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

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

记录一次非常简单的so层小逆向,适合小白入门
Native化,准备干libso

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

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

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

记录一次非常简单的so层小逆向,适合小白入门
0x02 操作
==================================开始操作===================================
首先查看init.array部分,它的运行时机真的很早。

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

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

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

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

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

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

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

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

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

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

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

记录一次非常简单的so层小逆向,适合小白入门
在动态注册时,我们通过观察IDA的.data.rel.ro需要知道方法结构体信息:
1
2
3
4
5
typedef struct {
const char* name;
const char* signature;
void*       fnPtr;
} JNINativeMethod;

结构体包含三部分分别是:方法名、方法的签名、对应的native函数地址;
那么这里我们肯定重点看第三部分,因为要找到具体的解密函数,这时候我们需要在动态注册段对应上:

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

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

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

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

我们来验证一下:
函数名
byte_1C066:0x87, 0x96, 0x80, 0x87, 0xF3, 0, 0, 0, 0, 0

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

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

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

记录一次非常简单的so层小逆向,适合小白入门
长度为4
[0]=0x87 ^ 0xF3 = 0x74 = t
[1]=0x96 ^ 0xF3 = 0x65 = e
[2]=0x80 ^ 0xF3 = 0x73 = s
[3]=0x87 ^ 0xF3 = 0x74 = t
合成得:test
所以这是test函数名

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

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

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

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

函数签名信息

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

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

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

记录一次非常简单的so层小逆向,适合小白入门
byte_1C070解密后是:(Ljava/lang/String;)Z
正好就是boolean test(string content)

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

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

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

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

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

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

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

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

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

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

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

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

记录一次非常简单的so层小逆向,适合小白入门
当我们遇到晦涩难懂的问题时,不如尝试去用用Frida。

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

一直以来想用Frida解开一道这种验证输入的题,奈何没有找到机会,这一次想尝试一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//新建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的进程
    1
    frida -U com.kanxue.test -l frida_test.js

    首先敲入
    1
    hookstrcmp()

    然后再在手机端敲入“bangbang”
    1
    观察电脑端日志

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

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

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

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

    记录一次非常简单的so层小逆向,适合小白入门
    毋庸置疑,kanxuetest即flag值

    0x03 验证

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

    记录一次非常简单的so层小逆向,适合小白入门
    所以,kanxuetest就是flag。
    游客,如果您要查看本帖隐藏内容请回复
    温馨提示:
    1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
    2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
    3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
    论坛交流群:672619046

      发表于 2020-8-4 18:58:36
      太给力了,这么多好东西!

        发表于 2022-7-28 09:41:21
        非常不错啊,感谢楼主无私的共享精神!

        小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

        GMT+8, 2024-12-22 09:55 , Processed in 0.120216 second(s), 51 queries .

        Powered by Discuz! X3.4

        Copyright © 2001-2021, Tencent Cloud.

        快速回复 返回顶部 返回列表