本帖最后由 kalikai 于 2020-4-23 22:30 编辑
1 前言
谈到FrIDA,大部分人的反应都是使用Frida hook Android应用。 但是实际上,Frida提供了丰富的API接口支持多平台,如Windows、MAC、Linux、IOS、Android。相信熟悉PC补丁的朋友,都应该有用过Baymax。Baymax是一个很棒的工具,支持动态修改目标模块的指令和数据 ,实现对目标进程的动态补丁。但我们也可以发现,使用Baymax可以实现单点补丁破解很方便,但却无法实现自由度更高的自动化补丁脚本。而Frida使用Python+JavaScript这种调用形式,提供RPC远程调用和内存读写能力,意味着我们拥有更自由、更灵活的方式,编写自动化补丁和操控脚本,来实现对程序自动化操控。
2 CTF实验
我们通过使用一个CTF例子,来说明如何使用Frida自动化脚本进行爆破。
一个Windows平台的CTF.exe,需要输入6位数密码,获取Flag值。
提示字符串是"Try again!"。拖入IDA,搜索字符串。
通过动静态分析,基本确定,点击确定后,“确认”按钮执行的函数地址为:0x0040173A。
编写模拟点击确定函数,使用Frida提供的JS API: NativeFunction.
通过官方解释,我们可以得知。NtiveFunction第一个参数为指内存函数地址,第二个参数为返回值,第三个为入参类型。
通过Frida提供的RPC远程调用机制,我们可以不断的远程调用代码。
备注:Frida的Python API接口是一种底层接口的封装,API功能也是相当的有限。建议大家看下frida/core.py和frida/tracer.py学习下Frida底层的API接口和底层实现机制。
以下为模拟点击确定函数 代码调用代码。
[JavaScript] 纯文本查看 复制代码 import frida
import sys
def on_message(message, data):
print("[%s] => %s" % (message, data))
session = frida.attach('CTF.exe')
script = session.create_script('''
var enter=new NativeFunction(ptr('0x0040173a'), 'void',[]);
rpc.exports={
once:function(){
enter();
}
}
''')
script.on('message', on_message)
script.load()
while (1):
script.exports.once()
sys.stdin.read()session.deatch()
然后在输入框中,使用自动化脚本不断模拟输入框输入。如果需要模拟输入,那么就需要hook获取输入框相关函数。
在输入框输入“720000”,动静结合
可以看到,在0x414090这个地址,返回了输入数值。
IDA大致浏览了sub_414090()一下代码,应该是系统函数类似getText()之类的,从输入框获取文本函数。此处不做深究。
于是,浏览 调用sub_414090()函数的被调用处,hook的函数函数 sub_401ce7() 就可以确定了。
现在准备完毕。可以开始进行编写自动化脚本进行爆破了。
[Python] 纯文本查看 复制代码 import frida
import sys
def on_message(message, data):
print("[%s] => %s" % (message, data))
session = frida.attach('CTF.exe')
script = session.create_script('''
var number = 720000;
var needAdd = true;
var enter=new NativeFunction(ptr('0x0040173a'), 'void',[]);
rpc.exports={
once:function(){
enter();
}
};
var input = ptr('0x00401CE7');//函数入口
Interceptor.attach(input,{
onLeave:function(result)//hook返回值
{
Memory.writeAnsiString(ptr(result.toInt32()),number.toString())
if(needAdd){
number=number+1;
needAdd=false;
}
else{
needAdd=true;
}
}
});
''')
script.on('message', on_message)
script.load()
while (1):
script.exports.once()
sys.stdin.read()
session.deatch()
突然发现,还是不能自动化爆破。因为在hook时,会不断弹窗,需要手动点击。
再从源码中,把失败弹窗的代码nop掉。修补补丁保存新的exe文件。
使用自动化脚本爆破跑起来。自动爆破中。
过了几分钟,FLAG值就爆破出来了。
3 总结
使用Frida制造自动化脚本,可以更加灵活应用于破解、逆向、CTF等方面。
例如在某些特别复杂的场景中,算法是魔改的,密钥是分存的,有时可能还混个淆加个固,需要花费大量的时间进行分析。但是通过Frida这种工具,我们可以做到在不知道复杂算法的情况下,自动化的调用他们的加解密接口。例如神器Brida,这样就可以根据你的需求修改程序代码的逻辑和数据流。而不用去逆向整个代码或算法,从而节省人员的精力。
|