Frida-Labs

news/2025/3/20 6:38:15/文章来源:https://www.cnblogs.com/WXjzc/p/18231528

0x1

截图

截图

获取了100以内的随机数

截图

只需要确保输入的数为随机数的2倍+4即可

截图

hook该方法,返回值随意,只要自己输入符合对该值的要求即可

Java.perform(function () {let MainActivity = Java.use("com.ad2001.frida0x1.MainActivity");MainActivity["get_random"].implementation = function () {this["get_random"]();console.log('get_random() return 0');return 0;};
})

返回0,输入4即可

截图

0x2

截图

很显然,需要主动调用get_flag方法,将显示的textview修改掉

截图

Java.perform(function () {Java.choose('com.ad2001.frida0x2.MainActivity',{onMatch: function(instance){instance.get_flag(4919)},onComplete: function(){}})
})

采用attach方式进行hook,避免找到实例时,值修改后又被该回去

或者spawn的话用下面的脚本(因为get_flag是静态方法)

Java.perform(function () {let MainActivity = Java.use("com.ad2001.frida0x2.MainActivity");MainActivity["onCreate"].implementation = function (savedInstanceState) {this["onCreate"](savedInstanceState);MainActivity.get_flag(4919)}

截图

0x3

截图

需要修改Checker的code属性的值为512

截图

截图

Java.perform(function () {let MainActivity = Java.use("com.ad2001.frida0x3.MainActivity$1");MainActivity["onClick"].implementation = function (view) {let Checker = Java.use("com.ad2001.frida0x3.Checker")Checker.code.value = 512this["onClick"](view);};
})

在onclick下面hookCheck类,可以最大程度上避免其他类或方法对其产生干扰

截图


0x4

截图

这里应该是考察主动调用,新建一个Check类的实例,调用get_flag,并把值送给textview

截图

截图

Java.perform(function () {let MainActivity = Java.use("com.ad2001.frida0x4.MainActivity");MainActivity["onCreate"].implementation = function (savedInstanceState) {this["onCreate"](savedInstanceState);let Check = Java.use("com.ad2001.frida0x4.Check").$new()let c = Check.get_flag(1337)console.log(c)};
})

直接打印结果即可(我想试着修改textview,结果出现了不知名错误=-=)

截图

0x5

截图

与0x2不同的是,这里的方法不再是静态方法

截图

Java.perform(function () {Java.choose('com.ad2001.frida0x5.MainActivity',{onMatch: function(instance){instance.flag(1337)},onComplete: function(){}})
})

还是attach

截图

0x6

截图

在0x5的基础上,构造Checker即可

截图

截图

Java.perform(function () {Java.choose('com.ad2001.frida0x6.MainActivity',{onMatch: function(instance){let Checker = Java.use('com.ad2001.frida0x6.Checker').$new()Checker.num1.value = 1234Checker.num2.value = 4321instance.get_flag(Checker)},onComplete: function(){}})
})

依旧是attach

截图

0x7

截图

hookChecker的构造方法即可

截图

Java.perform(function () {let Checker = Java.use("com.ad2001.frida0x7.Checker");Checker["$init"].implementation = function (a, b) {console.log('hook $init()')this["$init"](520,520);};
})

截图

0x8

截图

这里就要去看so了,直接hook返回值肯定拿不到正确的flag

截图

每位的ascii码减一就是flag了,但是这里用到了strcmp进行比较

截图

直接hook strcmp

截图

同时看到有打印日志,因此也可以hook日志

截图

0x9

截图

修改native的返回值即可

截图

Java.perform(function () {let MainActivity = Java.use("com.ad2001.a0x9.MainActivity");MainActivity["check_flag"].implementation = function () {this["check_flag"]();console.log(`hook check_flag() return 1337`);return 1337;};
})

截图

0xA

截图

这里就是正常的调用

截图

但是在so里,存在一个导出函数get_flag

截图

可以一眼看出如何解密,但是还是采用hook的方式来做

截图

主动调用一下get_flag,同时还要注意其真正的导出名,不然找不到地址,解密后通过日志输出了

Java.perform(function () {var addr = Module.findExportByName("libfrida0xa.so", "_Z8get_flagii");console.log(addr)let get_flag_pointer = new NativePointer(addr)let get_flag = new NativeFunction(get_flag_pointer,'int',['int','int'])get_flag(1,2)
})

截图

0xB

截图

截图

在so中,由于永假的判断,导致代码不执行,所以可以把jnz给nop掉,一共6个字节

截图

Java.perform(function () {var funAddr = Module.findExportByName("libfrida0xb.so", "Java_com_ad2001_frida0xb_MainActivity_getFlag");var opAddr = funAddr.add(0x1E)console.log(opAddr)var writer = new X86Writer(opAddr)Memory.protect(opAddr,0x1000,'rwx')try{writer.putNop()writer.putNop()writer.putNop()writer.putNop()writer.putNop()writer.putNop()writer.flush()}finally{writer.dispose()}
})

或者是将jnz改成jz,我这里64位的模拟器,jnz的字节码是0f85d2000000,85改成84就是jz

Java.perform(function () {var funAddr = Module.findExportByName("libfrida0xb.so", "Java_com_ad2001_frida0xb_MainActivity_getFlag");var opAddr = funAddr.add(0x1E)console.log(opAddr)var writer = new X86Writer(opAddr)Memory.protect(opAddr,0x1000,'rwx')try{writer.putU8(0x0f)writer.putU8(0x84)writer.putU8(0xd2)writer.putU8(0x0)writer.putU8(0x0)writer.putU8(0x0)writer.flush()}finally{writer.dispose()}
})

截图

这里附上在ida中将jnz改为jz后的伪代码

截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/719963.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

udp协议实现组播功能

/**************************************************************************************************************************************** file name:multicast.c* author :momolyl@126.com* date :2024/06/04* brief :小组实现,小组中的每位成员都…

Archlinux安装教程

先放张图:准备工作 1、进入 Live 环境后关闭 reflector systemctl stop reflector 2、使用iwctl联网 3、timedatectl 修改时区 timedatectl set-timezone Asia/Shanghai 4、date验证时间 fdisk -l 查看硬盘和分区情况 cfdisk <硬盘编号> 修改分区 如:cfdisk /dev/sda…

若依创建表格

若依创建表格 一、首先在数据库中创建表格 1、新建Mysql数据库2、将字符集与排序规则改成如图所示,数据库名字自己取3、新建表4、在表中新建字段5、创建表,前5个根据规范是必须要有的6、保存表,自己取表名二、启动项目 1、将项目中的sql数据库拖到数据库中2、将配置文件中的…

JQL相关写法整理

一。子节点的field写法:const res3 = await db.collection(res1, res2).field(_id._value as value, name as text, _id["ws-config-brand"] as children).get()因为 ws-config-brand 含有特殊字符 - ,所以需要用 [""] 括起来 比如,想实现分类与品牌联动…

路由器动态分配(rip和ospf)

实验二 路由器动态路由的配置方法一、实验目的: 1.理解动态路由的工作原理; 2. 学习并掌握动态路由协议RIP的配置; 3.学习并掌握动态路由协议OSPF的配置; 4.进一步学习路由器的配置命令。 二、实验原理: RIP:Routing Information Protocol,路由信息协议,是应用较早…

1500PLC通过232自由口转profinet网关接ABB扫码枪通讯方案

在不动其他设备和程序的情况下只需要添加一台232自由口转profinet网关(XD-PNR100),232自由口转profinet网关集成了网口和串口,支持扫码枪的自由协议以及接口转换。232自由口转Profinet网关将传统的232自由口协议转换为现代化的Profinet协议,成功接入到1500PLC上,实现无缝…

SIP协议:AOR和Contact作用

sip协议交互的消息中,通常可以看到一些固定的格式,例如:可以看到消息头中包含“From”,"To","Contact"等字段。这些是起到什么作用呢?From和To是消息交互双方使用的域名,供双方作为位置服务使用。可以通过位置服务将一个URI映射到另一个用户可能使用的…

vlan划分

实验一vlan的创建与划分 一、实验目的: 1.了解vlan的工作原理; 2.学习基于端口划分vlan的方法; 3.了解跨交换机的相同vlan之间的通信; 4.进一步学习交换机端口的配置命令。 二、实验原理: VLAN(Virtual Local Area Network)即虚拟局域网,是一种通过将局域网内的设…

网络技术零基础小白入门课程-深信服内部课程 笔记

02-家庭组网介绍: Q:交换机比路由器速度更快,为什么还比路由器便宜? A:交换机工作在数据链路层,而路由器工作在网络层,因此路由器软件逻辑、硬件成本更高。03-衡量网络性能的指标 Q:在线用户、并发连接用户的概念一样吗? A: 不一样,在线用户是已经访问网站的,并发连接数…

服务器安装centos系统报错

安装centos报错:dracut-initqueue:warning:dracut-initqueue timeout -starting timeout scripts解决方法 U盘启动报错信息 查看U盘的对应 分区 重启电脑 按 e 进入编辑模式 将:vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet改…

【VMware vSphere】使用vSphere Lifecycle Manager(vLCM)管理独立主机和集群的生命周期。

vSphere Lifecycle Manager(vLCM)是 vSphere 7 中引入的一项新功能,它提供了一种集中式、自动化和简单性的方式来管理和升级 vSphere 基础架构组件(如vCenter、ESXi主机和NSX)的生命周期。 VMware 早期用于 vSphere 升级和补丁管理的解决方案称为vSphere Update Manager(…