当前位置: 首页 > 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.rkmt.cn/news/117124.html

相关文章:

  • MySQL架构长啥样?
  • Arbess从基础到实践(22) - 集成GitPuk+sourcefare+PostIn自动化部署
  • 2025 年最新客服机器人品牌有哪些,看这一篇就够了 - 品牌策略主理人
  • PC耐力板厂家推荐:聚碳酸酯专业制造 + 国际认证(技术实力) - 品牌排行榜
  • 测试中的认知偏差:如何识别与应对思维陷阱
  • OpenVoice V2实战指南:从零开始打造你的专属语音助手
  • ONNX预训练模型极速获取攻略:8大方案解决你的下载困扰
  • 2025年螺旋板式冷凝器生产厂家榜单推荐:可拆式螺旋板式换热器/钛螺旋板式换热器/不锈钢螺旋板式换热器生产厂家精选 - 品牌推荐官
  • 3分钟让你的Qt应用颜值翻倍:10款专业QSS模板免费使用指南
  • 温州建国医院正规专业吗?详情解读”温州建国医院什么样? - 速递信息
  • Blender插件完全指南:从入门到精通的必备工具清单 [特殊字符]
  • 企业利润翻倍的秘密:为什么你的对手都在搭建AI agent
  • 【计算机毕业设计案例】基于SpringBoot北京市公交管理系统的设计与实现基于JAVA的北京市公交管理系统(程序+文档+讲解+定制)
  • 快速生成应用:AI大模型与低代码的无缝融合之道
  • BasePopup:Android弹窗终极指南与高效解决方案
  • 打开PyCharm新建工程,合作博弈的数学工具箱哐当一声砸在桌面上。综合能源系统的利益分配问题像块硬骨头,咱们今天要用Shapley值的牙口啃碎它
  • 反爬虫监控
  • 键盘输入可视化神器:让你的按键操作不再“隐形“
  • 分布式监控终极指南:从业务场景出发的技术选型方法论
  • 开启“全无人测试”,特斯拉创历史新高!
  • 探索EBWO:混合改进的白鲸优化算法
  • 2003-2024年上市公司人工智能采纳程度数据+Stata代码
  • 如何解决管家婆软件登录提示“用户null登录失败配置文件打开错误”的问题
  • 【更新至2026年新版本】超详细PyCharm安装教程及基本使用!
  • 终极指南:3步搭建高性能饥荒服务器,告别卡顿困扰
  • 基于CodeT5+AST_diff的企业级代码重构系统:从屎山到微服务的production实践
  • Android开发圣经
  • 智能无人机开发技术实战:构建云端一体化应用新范式
  • 必看!2026年EOR名义雇主服务品牌排行榜:助力企业国际化的最佳选择
  • 揭秘Docker环境下LangGraph Agent扩展原理:3步实现智能体无缝集成