用这个题试了试frida这个Hook神器,确实有点厉害

这也是第一次接触Hook

应该就是在运行时更改Java层的变量,乃至更改执行流程

安装

首先更新到python 3.7,否则会有一堆奇奇怪怪的版本问题

pip install frida
pip install frida-tools

流程

最初的最初还是要看一下代码的,jadx逆一下apk
p1

下来是判断的逻辑以及最后的flag
p2

可以看到他比我大1时,我就赢了,我比他大1我就输了,一样就是平,他比我大2我就输了,反之我就赢了,就是这么个逻辑
但是要连赢1000次,这个概率就是1/(3 ^ 1000),基本就是个不可能事件了,这里使用Hook改变量m, n, cnt,使我点击之后我赢,这时候更改的话以及不管你点的什么了
我们设置m=0,n=1,这样它就比我大1了,cnt=999,这样直接就可以到1000,然后显示出flag。或者可以硬刚直接逆那个库...

首先,启动frida-server
p3

详细代码段

import frida
import sys


def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)


jscode = """
Java.perform(function() {
    // Function to hook is defined here
    var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');
    // Whenever button is clicked
    MainActivity.onClick.implementation = function (v){
        // Show a message
        send('onClick');
        // Call the original onClick handler
        this.onClick(v);
        // Set our values after running the original onClick handler
        this.m.value = 0;
        this.n.value = 1;
        this.cnt.value = 999;
        // Log to the console that it's done, and we should have the flag
        console.log('Done:' + JSON.stringify(this.cnt));
    };
});
"""
process = frida.get_usb_device().attach('com.example.seccon2015.rock_paper_scissors')
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
sys.stdin.read()

设置好之后就随便点了,直接会出来结果

SECCON{107749}

真的知道Hook这么强之后还是很兴奋的,应该也能直接Get点变量啥的出来吧,这样就不用apktool逆了再慢慢找string了。