一、前记

最近开始回归ctf了,想看看有关机器学习类的ctf译文。虽然现目前接触的比较少。但是越往后面肯定越是一个趋势。趁着现在总结一下。

二、大胆预测

机器学习在ctf中的考点应该会是建模模型进行预测,或者是生成线性函数进行预测。考点的形式应该不会太花,主要就是数据预测。(目前遇到的就是这样,往后遇到新的会及时更新)

三、储备知识

在我之前的博客有介绍一些基本知识(参考《 numpy和pandas的基本概念这一文》),重复的不再多说。今天补充的知识是使用numpy进行拟合曲线。

numpy在数据运算和数据处理方面独树一帜,这次介绍的是numpy里面的polyfit()函数和poly1d()函数。利用这两个函数我们就能将一些点拟合成一条曲线。

1、polyfit()
polyfit()函数使用最小二乘法将一些点拟合成一条曲线。
格式:numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
x:要拟合点的横坐标
y:要拟合点的纵坐标
deg:自由度.例如:自由度为2,那么拟合出来的曲线就是二次函数,自由度是3,拟合出来的曲线就是3次函数

第一步:首先要知道一些已知点(为了便于演示,在本实验里面我们构造了一些sin(x)的点)

#encoding:utf-8
from numpy import *
from matplotlib.pyplot import *
from matplotlib import *

x = np.arange(-1, 1, 0.02)
y = 2 * np.sin(x * 2.3) + np.random.rand(len(x))

第二步:展示散点图

scatter(x,y)
show()

结果如图所示:
-L8-2GQ6MC@-5NK6NS0L-ZW

第三步:使用polyfit函数进行拟合曲线
参照格式可以自由选择自由度
例:选择x,y的二次函数

parameter=ployfit(x,y,2)

parameter其实就是本例中二次函数的三个(n+1)参数
出现的结果为:
V-YW7X1KT-UVMY---LWVP-B
实际的公式为:

y2=parameter[0]*x**2+parameter[1]*x**1+parameter[2]*x**0

到这里,拟合曲线就已经完成了

2、poly1d()
这个函数帮助我们直接将参数拼接起来而不用一个一个写出来
格式:
p=poly1d(parameter)
步骤一:
将polyfit()弄好的参数放进poly1d()里面
p+poly1d(parameter)
步骤二:
使用(x,p(x))可以列出所有在拟合曲线上的值
16Y5GOZPQ0P0-POF--YGY-3

到此,拟合曲线的全部过程就已经完成。

四、CTF中的机器学习题目

第一道 2020V&N公开赛 ML第一步

题目难点:机器学习,提取有关内容

第一步:审计题目
会先询问你的名字,然后给你70组数据.我们要用这70组数据,来预测一条拟合曲线.接着题目会给我们一些x值,让我们来预测y值,在预测正确的一定范围内会给flag.

第二步:提取有关数据并调整到正确格式

def process(s):
    xa = []
    ya = []
    for i in s:
        v = i.decode().strip().split(',')
        x = float(v[0][2:])
        y = float(v[1][2:-2])
        xa.append(x)
        ya.append(y)

    return (np.array(xa), np.array(ya))

第三步:拟合曲线

(x, y) = process(s)
print((x,y))
z1 = np.polyfit(x, y, 10)
p1 = np.poly1d(z1)

第四步:预测

for i in range(10):
    q = p.recvline()
    xi = float(re.compile(b'When x=([0-9\.]+),y=?').findall(q)[0])
    p.sendline(str(p1(xi)))
    print(xi, p1(xi))
p.interactive()

完整脚本如下:

import numpy as np
from pwn import *
import re

p = remote("node3.buuoj.cn", )

p.recvline()
p.sendline('aaaaa')

for i in range(4):
    print(p.recvline())

p.sendline()
s = []
for i in range(70):
    s.append(p.recvline())

def process(s):
    xa = []
    ya = []
    for i in s:
        v = i.decode().strip().split(',')
        x = float(v[0][2:])
        y = float(v[1][2:-2])
        xa.append(x)
        ya.append(y)

    return (np.array(xa), np.array(ya))

(x, y) = process(s)
print((x,y))
z1 = np.polyfit(x, y, 10)
p1 = np.poly1d(z1)
print(p1)

p.recvline()
p.sendline()
for i in range(10):
    q = p.recvline()
    xi = float(re.compile(b'When x=([0-9\.]+),y=?').findall(q)[0])
    p.sendline(str(p1(xi)))
    print(xi, p1(xi))
p.interactive()