kalikai 发表于 2020-4-23 13:41

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

本帖最后由 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接口和底层实现机制。

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

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,这样就可以根据你的需求修改程序代码的逻辑和数据流。而不用去逆向整个代码或算法,从而节省人员的精力。

小朋友呢 发表于 2020-9-14 14:40

大神我直接复制的代码执行后出现这个
[{'type': 'error', 'description': 'Error: access violation accessing 0x0', 'stack': 'Error: access violation accessing 0x0\n   
at frida/runtime/core.js:387\n    at /script1.js:26', 'fileName': 'frida/runtime/core.js', 'lineNumber': 387, 'columnNumber': 1}] => None

LQMIKU 发表于 2020-6-28 18:39

楼主,看了你之前的010editor注册机,提示缺少一些dll的情况。这个应该是visual studio编译成exe的时候选debug模式造成的,换成release模式应该可以解决。一点小建议,不过不换也问题不大。(ps: 本来想在留言板说的,奈何我的用户组权限太低 )

mmattic 发表于 2020-4-23 14:47

谢谢分享

Dyingchen 发表于 2020-4-23 15:16

不知道和angr比起来两个哪个更好,估计还是符号执行好一些,这种自动攻防技术尚不成熟,期待以后的发展吧

謌丶无心留恋 发表于 2020-4-23 15:16

学习了,谢谢分享

moluo 发表于 2020-4-23 17:15

感谢分享,学习。

nws0507 发表于 2020-4-23 18:27

长见识了,只用过frida在安卓

https://img.alicdn.com/.gif

斩风 发表于 2020-4-23 19:02

学习了,感谢分享

大白痴先生 发表于 2020-4-23 19:53

楼主你好啊,能不能再仔细说一下,怎么样就知道:
“确认”按钮执行的函数地址为:0x0040173A。

shanxiqq 发表于 2020-4-23 21:07

大白痴先生 发表于 2020-4-23 19:53
楼主你好啊,能不能再仔细说一下,怎么样就知道:

我估计你就没看代码吧!图中那么大个箭头你看不见啊?自己看看。

lynxtang 发表于 2020-4-23 22:12

谢谢分享,正在学frida
页: [1] 2 3 4
查看完整版本: 使用Frida制造自动化脚本爆破Windows平台的CTF