当前位置: 首页 > news >正文

Frida-Labs0x3-0xB WP

Frida-0x3

解法一

Java.perform(function (){var a = Java.use("com.ad2001.frida0x3.Checker");a.code.value = 512;
})

解法二

Java.perform(function(){var Checker =Java.use("com.ad2001.frida0x3.Checker");Checker.code.value=0;console.log("code当前的值是"+Checker.code.value);for(var i=0;i<256;i++){Checker.increase();}console.log("触发函数后的值为"+Checker.code.value);})
模板
Java.perform(function (){var <class_reference> = Java.use("<package_name>.<class>");<class_reference>.<variable>.value = <value>;})

Frida-0x4

解法

 Java.perform(function(){var a =Java.use("com.ad2001.frida0x4.Check");var a1= a.$new(); /创建实例var b=a1.get_flag(1337); /传入参数1337console.log("FLAG "+b); /打印结果
});
模板
Java.perform(function() {var <class_reference> = Java.use("<package_name>.<class>");var <class_instance> = <class_reference>.$new(); // Class Object<class_instance>.<method>(); // Calling the method})

Frida-0x5

解法

Java.perform(function(){Java.choose("com.ad2001.frida0x5.MainActivity",{onMatch:function(a){a.flag(1337)},onComplete:function(){console.log("ok")}})
})

居然没有;也可以

模板
Java.performNow(function() {Java.choose('<Package>.<class_Name>', {onMatch: function(instance) {// TODO},onComplete: function() {}});
});
  1. onMatch:onMatch 回调函数针对在 Java.choose作期间找到的指定类的每个实例执行。该回调函数接收当前实例作为其参数。可以在 onMatch 回调中定义要对每个实例执行的自定义操作。
  2. onComplete 回调在 Java.choose作完成后执行作或清理任务。此块是可选的,如果您在搜索完成后不需要执行任何特定作,则可以选择将其留空。

Frida-0x6

试错一

 Java.perform(function(){Java.choose("com.ad2001.frida0x6.MainActivity",{onMatch:function(instance){instance.get_flag(1234)instance.get_flag(4321)console.log("good")},onComplete:function(){console.log("better")}})})

错误原因:Checker 类的 num1num2实例字段,不是静态字段,需要创建一个 Checker 的实例才能修改这些字段

试错二

 Java.perform(function(){var Checker = Java.use("com.ad2001.frida0x6.Checker");var checker = Checker.$new();checker.num1.value = 1234;checker.num2.value = 4321;console.log("ok");return checker;
});

错误原因:get_flag() 是 MainActivity 实例的成员方法,必须通过实例调用

修复过程

  1. 首先创建实例checker=Checker.$new()
  2. 传入num1、num2参数数值
  3. 使用 instance 调用get_flag(checker)

解法

 Java.perform(function(){Java.choose("com.ad2001.frida0x6.MainActivity",{onMatch:function(instance){var Checker = Java.use("com.ad2001.frida0x6.Checker");checker=Checker.$new()checker.num1.value=1234checker.num2.value=4321console.log("good")instance.get_flag(checker)},onComplete:function(){console.log("better")}})})

0x6&0x7:MainActivity中不能随意创建实例,而普通的Java方法可以创建实例

Frida-0x7

试错一:

Java.perform(function(){Java.choose("com.ad2001.frida0x7.onCreate",{onMatch:function(instance){var Checker=Java.use("com.ad2001.frida0x7.Checker")checker=Checker.$new()checker.num1.value(555)checker.num2.value(555)},onComplete:function(){console.log("good")}})

错误分析:checker方法是同时接收两个参数,我这里是模仿0x6的一个个接收参数

解法一

Java.perform(function(){Java.choose("com.ad2001.frida0x7.MainActivity",{onMatch:function(instance){var Checker=Java.use("com.ad2001.frida0x7.Checker")checker=Checker.$new(555,555)instance.flag(checker)},onComplete:function(){console.log("good")}})
})

试错二

先进行:frida -U -f com.ad2001.frida0x7 再在 终端输入代码进行hook

错误原因:$init在应用初始化阶段就已经完成,想要拦截并传入新的参数必须在app进程开始前完成调用

改正:frida -U -f com.ad2001.frida0x7 -l D:\damn\JavaScript\1.js

解法二:

Java.perform(function(){var a=Java.use("com.ad2001.frida0x7.Checker")a.$init.implementation=function(param){this.$init(600,600)}
})
模板
Java.perform(function(){
var <class_reference> = Java.use("<package_name>.<class>")
<class_reference>.$init.implementation=function<args>{
// TODO
}
})
知识点

构造函数

它的核心是 直接拦截 Checker 类的构造函数($init),强制用满足条件的参数(600,600)初始化实例

$init 是什么?

  • 在 Frida 中,Java 类的 构造函数 统一用 $init 表示(因为 Java 构造函数没有返回值、名字和类名一致,Frida 用 $init 标准化)。
  • 比如 Java 里的 Checker(int a, int b) 构造函数,在 Frida 中对应的就是 Checker.$init(参数为两个 int)。

Frida0x8

试错一

Module.enumerateExports("libfrida0x8.so")[0]

umerate:重计数

错误原因:1.必须用Frida -U -F com.ad2001.frida0x8 2.modulename必须带引号

改正

[Android Emulator 5554::Frida 0x8 ]-> Module.enumerateExports("libfrida0x8.so")[0]
{"address": "0x7fff59a6e8c0","name": "Java_com_ad2001_frida0x8_MainActivity_cmpstr","type": "function"
}

使用另外的API函数查找函数地址

[Android Emulator 5554::Frida 0x8 ]-> Module.getExportByName("libfrida0x8.so","Java_com_ad2001_frida0x8_MainActivity_cm
pstr")
"0x7fff59a6e8c0"

模块基地址+偏移量

[Android Emulator 5554::Frida 0x8 ]-> Module.getBaseAddress("libfrida0x8.so")
"0x7fff59a6e000"
知识点
  1. Module.enumerateExports("moduleName")

    作用:枚举指定模块的所有的导出函数/符号

    导出函数

  2. Module.getExportByName("moduleName","exportName")

    Module.findExportByname("moduleName","exportName")

    通过名称查找导出函数的地址

  3. Module.getBaseAddress("modelName")

    获取模块的基地址(加载地址

下一步进行编写代码

试错二

Interceptor.attach(0x7fff592ca8c0,{OnEnter:function(args){console.log("yes,entering it")},OnLeave:function(retval){console.log("retval")}
})

错误原因:1.targetAddress必须用ptr修饰,因为0x7fff592ca8c0是一个字符串,而ptr(0x7fff592ca8c0)是一个NativePointer对象,Frida所有的内存操作都需要NativePointerl类型

2.OnEnter:和OnLeave:开头都要小写

改正后:

Interceptor.attach(ptr(0x7fff592ca8c0),{onEnter:function(args){console.log("yes,entering it")},onLeave:function(retval){console.log("retval")}
})

小问题原因:他没有回显,因为咱们没有获得输出

解决方法一:

查看日志输出

相关命令:1.frida-ps -U /查看所有进程

​ 2.adb logcat --pid=pid /显示指定进程的Android的日志

然后就可以获得flag了

12-16 20:03:31.498 2783 2783 D input : 1
12-16 20:03:31.498 2783 2783 D Password: FRIDA{NATIVE_LAND}

解决方法二:

修改代码,直接输出参数二

试错一

Interceptor.attach(ptr(0x7fff592ca8c0),{onEnter:function(args){var a=Memory.readUtf8String(args[0])var b=Memory.readUtf8String(args[1])if(a.includes("qqq")){console.log("yes,entering it")console.log(b)}},onLeave:function(retval){console.log("out")}
})

错误原因:targetaddress的地址是Java_com_ad2001_frida0x8_MainActivity_cmpstr的地址,是是 JNI 函数。 args[0]args[1]不是字符串。我们需要查找strcmp函数

改正:
Interceptor.attach(ptr(0x7ffff47a4ff0),{onEnter:function(args){var a=Memory.readUtf8String(args[0])var b=Memory.readUtf8String(args[1])if(a.includes("qqq")){console.log("yes,entering it")console.log(b)}},onLeave:function(retval){}
})

这样就可以获得flag了

完整代码

Java.perform(function(){var targetaddress=Module.getExportByName("libfrida0x8.so","strcmp")
Interceptor.attach(targetaddress,{onEnter:function(args){var a=Memory.readUtf8String(args[0])var b=Memory.readUtf8String(args[1])if(a.includes("qqq")){console.log("yes,entering it")console.log(b)}},onLeave:function(retval){}
})
})

模板

Interceptor.attach(targetAddress,{onEnter:function(args){console.log("Entering"+functionName)},onLeave:function(retval){console.log("Leaving" +functionName)}
})

Frida0x9

代码

Java.perform(function(){var targetaddress=Module.findExportByName("liba0x9.so","Java_com_ad2001_a0x9_MainActivity_check_1flag")Interceptor.attach(targetaddress,{onEnter:function(args){console.log("enter it")},onLeave:function(retval){retval.replace(1337)console.log("good")}})
})

Frida0xA

模板

var native_adr = new NativePointer(<address_of_the_native_function>);
const native_function = new NativeFunction(native_adr, '<return type>', ['argument_data_type']);
native_function(<arguments>);

var base=Module.findBaseAddress("libfrida0xa.so")var flag=base.add(0x206B0 )var na=new NativePointer(flag)const get_flag=new NativeFunction(na,'void',['int','int'])get_flag(1,2)

var na =Module.findExportByName("libfrida0xa.so","_Z8get_flagii")
const get_flag=new NativeFunction(na,'void',['int','int'])
get_flag(1,2)

Frida0xB

这一题我们主要要学习的是花指令的nop

解法一

Xwriter

试错

var jnz=Module.getBaseAddress("libfrida0xb.so").add(0x170ce)
var writer=new X86Writer(jnz)
try{writer.putNopPadding(6)writer.flush()
}finally{writer.dispose()
}

错误原因:该内存只能读取不能直接修改,

解决方法:修改内存权限

正确代码

var jnz=Module.getBaseAddress("libfrida0xb.so").add(0x170ce)
Memory.protect(jnz,6,"rwx")      /赋予写入权限
var writer=new X86Writer(jnz)  
try{writer.putNopPadding(6)  /向写入流中插入6个字节的90填充writer.flush()   /刷新缓冲区
}finally{writer.dispose()  /清理资源
}

总结收获:

  1. MainActivity中不能随意创建实例,而普通的Java方法可以创建实例
  2. 含static:静态方法 不含static:实例方法
http://www.jsqmd.com/news/106211/

相关文章:

  • 比手动排查快10倍:自动化处理Socket端口冲突
  • 无线充电系统S - S拓扑仿真:WPT闭环控制探索
  • 一文帮你总结2025年最新获客系统品牌有哪些,必看! - 品牌策略主理人
  • 零基础学会用AI监控网站链接健康状态
  • 5分钟快速验证:Maven原型项目生成器
  • Conda环境管理:比传统pip快3倍的依赖解决方案
  • Redmi Note 12 Pro Speed-开启开发者选项
  • 曲速推理机故障排除指南
  • CF587F Duff is Mad
  • 利用wan2.1协议快速构建网络通信原型
  • 用 Go 像写 Web 一样做桌面应用:完全离线的手机号归属地查询工具
  • AI助力SpringBoot+MyBatisPlus开发:自动生成CRUD代码
  • websocket功能开发
  • STM32HAL库读取ADS1115驱动
  • 任务5-2 关联查询和子查询
  • 分布式电源接入对配电网影响分析 关键词:分布式电源 配电网 评估 参考文档:《自写文档,联系我...
  • 源网荷储充一体化平台:安科瑞EMS微电网能源管理系统介绍
  • HoughLinesP 霍夫变换 C#x2B;#x2B; opencv 内存报错处理
  • Day4 9. 奇怪的信 -卡码网C++基础课
  • Python - UV 为每个项目创建独立、干净的Python工作空间
  • 测试决策的心理因素:在认知偏差与专业判断间寻找平衡
  • 上海防水补漏上门维修服务哪家好?认准芮生建设,14年专业团队守护安居 - shruisheng
  • 33、Linux线程同步与互斥
  • TestDisk数据恢复实战:从分区丢失到文件找回的完整指南
  • 使用 C# 将 DataTable 和 Excel 数据互转
  • 完整教程:SQL常用语句解析:从查询到操作
  • MySQL架构长啥样?
  • 【计算机毕业设计案例】基于springboot+微信小程序的选修课管理系统的设计与实现“课程查询-在线选课-课表管理-成绩追踪”(程序+文档+讲解+定制)
  • 3个关键步骤解决JimuReport报表组件依赖配置难题
  • 上海专业做室外防水 选芮生建设 14年经验守护建筑外墙屋顶不漏 - shruisheng