Frida 练习——Frida-labs

这个项目可以从看 frida 相关视频过渡到实战,没有 ctf 这么难,感觉不看 frida 相关视频直接打这个练习也行。

项目地址: https://github.com/DERE-ad2001/Frida-Labs/tree/main


frida_0x1

从应用的界面看这是要你输入一个数字

01

查看源代码,很容易的看出这是要你找到这个随机数 i

02

下面的声明的 obj 是要在 app 界面中输入的数字

然后把存有随机数 i 与输入的数字 obj 传到 check 函数中进行检查

image-20250108143145970

在 check 函数中发现输入的 obj 也就是 check 函数声明的 i2

判断条件是(i*2)+4==i2

所以我们要输入的 obj 应该是随机数 i*2+4

这里有两个解法:


解法一:hook get_random

这里我们可以直接 hook 掉 get_random 来查看 get_random 生成的随机数

也可以直接返回一个特定值然后按照计算式输入,但是随机数是在程序初始化生成的,所以要在程序初始化时进行注入。

1
frida -U -f com.ad2001.frida0x1 -l .\hook.js

查看 get_random exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function hookTest1() {
var utils = Java.use("com.ad2001.frida0x1.MainActivity");
utils.get_random.implementation = function () {
var ret = this.get_random();
console.log("get_random: ", ret);
return ret;
};
}

function main() {
Java.perform(function () {
hookTest1();
});
}
setImmediate(main);

image-20250108144455672

05

返回特定数字 exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
function hookTest1() {
var utils = Java.use("com.ad2001.frida0x1.MainActivity");
utils.get_random.implementation = function () {
return 0;
};
}

function main() {
Java.perform(function () {
hookTest1();
});
}
setImmediate(main);

然后输入 4 即可进入下一个界面


解法二:hook check

check 函数是在程序初始化之后才运行的,所以不必在初始化的时候进行 hook

1
frida -U "Frida 0x1" -l ./hook.js

这样 hook 之后随便输入一串数字之后就可以进到下一个页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function hookTest1() {
var utils = Java.use("com.ad2001.frida0x1.MainActivity");
utils.check.overload("int", "int").implementation = function (a, b) {
this.check(a, a * 2 + 4);
return;
};
}

function main() {
Java.perform(function () {
hookTest1();
});
}
setImmediate(main);

frida_0x2

感觉这个题没有上一个难,hook静态方法。

打开软件,发现只有一个“HOOK ME!”

02

查看源码

01

发现main函数下面有一个get_flag函数

这串代码是把下面的经过base64加密过的aes密文进行解密

而且这是个静态函数,有静态标识符,直接按照静态函数hook模板hook就行

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

function hookTest1() {
Java.perform(function() {
var ClassName=Java.use("com.ad2001.frida0x2.MainActivity");
ClassName.get_flag(4919);
})
}

function main() {
Java.perform(function(){
hookTest1();
});
}
setImmediate(main);

frida_0x3

这题也是hook一个静态方法,但是这次的静态方法不在Mainactivity

而是在Checker函数中

先打开这个App界面,如下图,点击完click me会提示try again

01

查看源码

02

发现判断条件是Checker.code == 512

跟进Checker.code

03

发现只是个静态函数,并且有个increase函数每次加2,所以我们只需要用让这个increase函数循环256次就能得到flag

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//定义一个名为hookTest1的函数
function hookTest1() {
Java.perform(function() {
var ClassName = Java.use("com.ad2001.frida0x3.Checker");
for (var i = 0; i < 256;i++){
ClassName.increase();
}

})
}

function main() {
Java.perform(function(){
hookTest1();
});
}
setImmediate(main);