首页
社区
课程
招聘
[原创]使用Frida制造自动化脚本爆破Windows平台的CTF
发表于: 2020-4-23 02:02 9274

[原创]使用Frida制造自动化脚本爆破Windows平台的CTF

2020-4-23 02:02
9274

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接口和底层实现机制。 


以下为模拟点击确定函数 代码调用代码。

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() 就可以确定了。


现在准备完毕。可以开始进行编写自动化脚本进行爆破了。
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,这样就可以根据你的需求修改程序代码的逻辑和数据流。而不用去逆向整个代码或算法,从而节省人员的精力。 


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-4-23 15:38 被kalikaikai编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (4)
雪    币: 7762
活跃值: (3470)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错,现在很少有用frida搞Windows程序的
2020-4-23 07:47
0
雪    币: 214
活跃值: (278)
能力值: ( LV5,RANK:77 )
在线值:
发帖
回帖
粉丝
3
NB,最终的脚本也贴下呗?
2020-4-23 15:34
0
雪    币: 1887
活跃值: (360)
能力值: ( LV8,RANK:121 )
在线值:
发帖
回帖
粉丝
4
小巫 NB,最终的脚本也贴下呗?
在的。文章代码既是。代码也更新在附件了。
2020-4-23 15:39
0
雪    币: 222
活跃值: (44)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
大牛,这个附件里的hookctf.py明显和你最终结果图里的hookctf(1).py代码明显有区别,在运行了hookctf.py之后还会报错,
frida.core.RPCException: RangeError: invalid count
    at /script1.js:9
    at frida/runtime/message-dispatcher.js:15
    at o (frida/runtime/message-dispatcher.js:25)
应该是不能循环调用rpc的问题,除此之外我还找到了另外一个人的解析
https://www.freebuf.com/articles/system/182112.html
但是俩位的最终代码都是出现类似的错误,也就是无法模拟按钮点击,rpc函数完全不起作用,大牛能不能讲讲最后到底是怎么实现的呢
2020-9-26 17:04
0
游客
登录 | 注册 方可回帖
返回
//