Frida Hook初次实战

做攻防世界的CTF题,看到有大佬搞Frida的操作,按照大佬做到试了一下

ill-intentions(Native hook)

攻防世界——ill-intentions

image-20220208112109013.png

frida,frida-server,objection该安装的都安装好

adb连接上机子

由于没有修改apk包,触发按钮的Intent显示不了,用objection手动开启

1
2
objection -g com.example.hellojni explore
android intent launch_activity com.example.application.IsThisTheRealOne

image-20220208112221166.png

效果如下

1644290634948.jpg

挂上大佬hook Native的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//tt.js
//出自https://blog.csdn.net/Palmer9/article/details/122464683
//别问脚本什么意思,frida脚本还不太会写
function main() {
function getjstring(jstr) {
return Java.vm.getEnv().getStringUtfChars(jstr, null).readCString();
}
Java.perform(function () {
var so_addr = Module.findBaseAddress("libhello-jni.so");
var perhapsThis_addr = Module.findExportByName("libhello-jni.so", "Java_com_example_application_IsThisTheRealOne_perhapsThis");
console.log("perhapsThis_addr", perhapsThis_addr);
Interceptor.attach(perhapsThis_addr, {
onEnter: function (args) {
console.log("perhapsThis_args:[1]", getjstring(args[2]), "\n [2]", getjstring(args[3]), "\n [3]", getjstring(args[4]), "\n");
},
onLeave: function (retval) {
console.log("perhapsThis_result:", getjstring(retval));
},
});

Interceptor.attach(Module.findExportByName("libhello-jni.so", "Java_com_example_application_ThisIsTheRealOne_orThat"), {
onEnter: function (args) {
console.log("orThat_args:[1]", getjstring(args[2]), "\n [2]", getjstring(args[3]), "\n [3]", getjstring(args[4]), "\n");
},
onLeave: function (retval) {
console.log("orThat_result:", getjstring(retval));
},
});

Interceptor.attach(Module.findExportByName("libhello-jni.so", "Java_com_example_application_DefinitelyNotThisOne_definitelyNotThis"), {
onEnter: function (args) {
console.log("definitelyNotThis_args:[1]", getjstring(args[2]), "\n [2]", getjstring(args[3]), "\n");
},
onLeave: function (retval) {
console.log("definitelyNotThis_result:", getjstring(retval));
},
});
});
}
setImmediate(main);

出flag

image-20220208111547214.png

ill-intentions(java hook)

GDA

看雪大佬出品的GDA 好用!

还是因为没有修改apk包,触发按钮的Intent显示不了,再次用objection手动开启,找到相对应的进程注入

image-20220208113438039.png

鼠标点击,即可完成操作

image-20220208113530767.png

按下中间那个BroadcastIntent,就能hook出flag

image-20220208113157555.png

Obejction直接注入

发现GDA那个纯属走弯路,直接Objection注入不就好了

1
2
3
4
5
objection -g com.example.hellojni explore
>>CLI中输入
android intent launch_activity com.example.application.IsThisTheRealOne
android hooking watch class_method android.content.Intent.putExtra --dump-return --dump-args --dump-backtra
ce

image-20220208115213479.png

遇到一个问题,就是不知道Intent属于什么类,这个是看了GDA里的脚本后才知道的(android.content.Intent),如果想要直接注入的话,需要andriod的开发经验

bilibili-1024-技术对抗赛第6题(2021年)

参考了 https://www.bilibili.com/read/cv13720199/

大佬的脚本少写启动命令,当时折腾一个早上没解决出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function hook_native() {
Java.perform(function(){
var str0;
var arg1;
Interceptor.attach(Module.findExportByName("libc.so", "__system_property_get"), {
onEnter: function (args) {
str0 = Memory.readCString(args[0]);
arg1 = args[1];
if(str0.indexOf('ro.product.cpu.abi')!=-1||str0.indexOf('ro.build.version.release')!=-1){
console.log('arg0 '+str0)
}
},

onLeave: function (retval) {
if(str0.indexOf('ro.product.cpu.abi')!=-1){
var before = Memory.readCString(arg1);
Memory.writeUtf8String(arg1, "x86");
var after = Memory.readCString(arg1);
console.log('retval:','before',before,'after',after)
}else if(str0.indexOf('ro.build.version.release')!=-1){
var before = Memory.readCString(arg1);
Memory.writeUtf8String(arg1, "9");
var after = Memory.readCString(arg1);
console.log('retval:','before',before,'after',after)
}
}
});
});
}
setImmediate(hook_native);

方便是真的方便,大佬诚不欺我

1644293335887.jpg

结语

Objection好用,降低Frida使用门槛,java层面的hook可以解决很多问题,Native hook老实写frida就行了