2018X-nuca Neural Network详解
广告位API接口通信错误,查看德得广告获取帮助
这道题当时没有队伍解出来,我当时想是有更多的步骤在图里面,tensorboard检测不出来,或者那些其余的操作有影响,当时有个提示是并非所有节点都在图里,最后又找了一遍pbtext的文本,看到有个节点带了很多数据,名字又是precisefinal,就感觉这是精确数据,最后拿到flag。Neural Network
神经网络,一个完全没接触过的全新领域。先查一波资料:
TensorFlow中文社区
tensorboard使用
Tensorflow 模型文件的使用以及格式转换
tensorflow只能在python3.5和python3.6安装,踩坑就踩了好久。
搭好环境直接跑一下它的python脚本,除了有个提示外都正常,提示可以在脚本开头加段代码去掉
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
运行一下python脚本,随便输点东西进去,然后弹出错误警告。似乎是大小不对,应该32个而不是16个。看一下脚本的内容,get_input函数里把输入rjust了16,改成32,这样就可以跑了,输出了Sorry, srcret wrong! Try harder?
分析一下脚本,结合各种地方找的资料,发现他读取了一个model.meta文件作为图,x应该是输入tensor,y是输出tensor。把输入放进黑盒操作一波得到输出,然后跟常量final比较,要求误差在1e-8之内。
看样子重点就在于它的model.meta这个文件里了。用hexeditor打开,只能看到一些字符串和数据。
在查一波资料,发现了tensorboard这个东西,他能把meta文件的内容转化成图,于是根据教程,得到了这个模型的模型图。
点进各个节点可以看到每个节点的输入(Inputs),输出(Outputs)和操作(Operation)。于是我们找到了In_string和Out_judge。跟着Out_judge的操作沿着输入一步一步往前走,能找到In_string。这些个过程就是黑盒的过程了。注意其中有很多的分支是没用到的,不必理会。最终整理出正向的操作(用tensorflow的函数表示):
t0 = tf.matmul(In_string, v0)
t1 = tf.add(t0, v3)
t2 = tf.sigmoid(t1)
t3 = tf.matmul(t2, v1)
t4 = tf.add(t3, v4)
t5 = tf.tanh(t4)
t6 = tf.matmul(t5, v2)
t7 = tf.add(t6, v5)
t8 = tf.sigmoid(t7)
matmul:矩阵相乘
sigmoid:S型生长曲线,具体可以百度
add:两个矩阵对应量相加
tanh:双曲正切
relu:正数不变,负数变为为0
这里的v0到v5都是常量。参考脚本中res的用法,可以拿到数据:
def gn(nm):
return sess.run(nm + ":0", feed_dict={x:[X]})
In_string = gn("In_string")
v0 = gn("Variable/read")
v1 = gn("Variable_1/read")
v2 = gn("Variable_2/read")
v3 = gn("Variable_3/read")
v4 = gn("Variable_4/read")
v5 = gn("Variable_5/read")
为了方便调试,我们定义:
def gv(v):
return sess.run(v, feed_dict={x:[X]})
print(gv(a0))
直接print(t1)并不能输出它的值。参考之前的res,要把数据喂进去run一下,会返回一个numpy的array数据类型,于是这样就可以输出了。
同时,输出np.array时默认会省略一些数据用省略号代替,且输出的精度不足。为了更直观的观看,可以添加如下代码:
np.set_printoptions(threshold='nan')
np.set_printoptions(precision=20)
有了正向的输入过程,每个函数都是有反函数的,我们似乎就可以逆向得到输入了,逆向过程如下
from scipy.special import logit
def invsigmoid(a):
b= np.array([[0.0]*32])
for i in range(32):
b[0][i]=logit(a[0][i]) #logit为sigmoid的反函数,但是tensorflow中没有这个函数,只能借助scipy中的了
return b
a = np.array([[1.40895243e-01, 9.98096014e-01, 1.13422030e-02, 6.57041353e-01,
9.97613889e-01, 9.98909625e-01, 9.92840464e-01, 9.90108787e-01,
1.43269835e-03, 9.89027450e-01, 7.22652880e-01, 9.63670217e-01,
6.89424259e-01, 1.76012035e-02, 9.30893743e-01, 8.61464445e-03,
4.35839722e-01, 8.38741174e-04, 6.38429400e-02, 9.90384032e-01,
1.09806946e-03, 1.76375112e-03, 9.37186997e-01, 8.32329340e-01,
9.83474966e-01, 8.79308946e-01, 6.59324698e-03, 7.85916088e-05,
2.94269115e-05, 1.97006621e-03, 9.99416387e-01, 9.99997202e-01]])
a0=invsigmoid(a)
a1=tf.subtract(a0,v5)
a2=tf.matmul(a1,tf.matrix_inverse(v2))
a3=tf.atanh(a2)
a4=tf.subtract(a3,v4)
a5=tf.matmul(a4,tf.matrix_inverse(v1))
a6=invsigmoid(gv(a5))#a5是个tensor对象,要用np.array数据类型才能使用。
a7=tf.subtract(a6,v3)
a8=tf.matmul(a7,tf.matrix_inverse(v0))
l=gv(a8).tolist()
ll=l[0]
flag=''
for i in range(len(ll)):
ll[i]*=128
ll[i]=round(ll[i])
flag+=chr(ll[i])
print(flag)
然而出问题了。最终的a8全是naf。让我们想办法输出中间变量的值,看看哪里有问题。在每一步后面输出a的数据。调着调着发现,第二个invsigmoid出了问题,意义不明(似乎是超出定义域了)。
思考了一下,我先随便输一个数据进去,用它算的结果逆一遍,看看能不能得到原来的值,于是:
def trans(secret):
return np.array([float(ord(x))/128 for x in secret])
fakeflag = "flag{01234567012345670123456789}" 这道题当时没有队伍解出来,我当时想是有更多的步骤在图里面,tensorboard检测不出来,或者那些其余的操作有影响,当时有个提示是并非所有节点都在图里,最后又找了一遍pbtext的文本,看到有个节点带了很多数据,名字又是precisefinal,就感觉这是精确数据,最后拿到flag。
Neural Network
神经网络,一个完全没接触过的全新领域。先查一波资料:
TensorFlow中文社区 copyright 无奈人生
tensorboard使用
Tensorflow 模型文件的使用以及格式转换
tensorflow只能在python3.5和python3.6安装,踩坑就踩了好久。
搭好环境直接跑一下它的python脚本,除了有个提示外都正常,提示可以在脚本开头加段代码去掉
import os www.wnhack.com
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
运行一下python脚本,随便输点东西进去,然后弹出错误警告。似乎是大小不对,应该32个而不是16个。看一下脚本的内容,get_input函数里把输入rjust了16,改成32,这样就可以跑了,输出了Sorry, srcret wrong! Try harder?
分析一下脚本,结合各种地方找的资料,发现他读取了一个model.meta文件作为图,x应该是输入tensor,y是输出tensor。把输入放进黑盒操作一波得到输出,然后跟常量final比较,要求误差在1e-8之内。 内容来自无奈安全网
看样子重点就在于它的model.meta这个文件里了。用hexeditor打开,只能看到一些字符串和数据。
在查一波资料,发现了tensorboard这个东西,他能把meta文件的内容转化成图,于是根据教程,得到了这个模型的模型图。
点进各个节点可以看到每个节点的输入(Inputs),输出(Outputs)和操作(Operation)。于是我们找到了In_string和Out_judge。跟着Out_judge的操作沿着输入一步一步往前走,能找到In_string。这些个过程就是黑盒的过程了。注意其中有很多的分支是没用到的,不必理会。最终整理出正向的操作(用tensorflow的函数表示):
无奈人生安全网
t0 = tf.matmul(In_string, v0)
t1 = tf.add(t0, v3)
t2 = tf.sigmoid(t1)
t3 = tf.matmul(t2, v1)
t4 = tf.add(t3, v4) 无奈人生安全网
t5 = tf.tanh(t4)
t6 = tf.matmul(t5, v2)
t7 = tf.add(t6, v5)
t8 = tf.sigmoid(t7)
matmul:矩阵相乘
www.wnhack.com
sigmoid:S型生长曲线,具体可以百度
add:两个矩阵对应量相加
tanh:双曲正切
relu:正数不变,负数变为为0
这里的v0到v5都是常量。参考脚本中res的用法,可以拿到数据:
copyright 无奈人生
def gn(nm):
return sess.run(nm + ":0", feed_dict={x:[X]})
In_string = gn("In_string")
v0 = gn("Variable/read")
v1 = gn("Variable_1/read")
无奈人生安全网
v2 = gn("Variable_2/read")
v3 = gn("Variable_3/read")
v4 = gn("Variable_4/read")
v5 = gn("Variable_5/read")
为了方便调试,我们定义:
copyright 无奈人生
def gv(v):
return sess.run(v, feed_dict={x:[X]})
print(gv(a0))
直接print(t1)并不能输出它的值。参考之前的res,要把数据喂进去run一下,会返回一个numpy的array数据类型,于是这样就可以输出了。
同时,输出np.array时默认会省略一些数据用省略号代替,且输出的精度不足。为了更直观的观看,可以添加如下代码: www.wnhack.com
np.set_printoptions(threshold='nan')
np.set_printoptions(precision=20)
有了正向的输入过程,每个函数都是有反函数的,我们似乎就可以逆向得到输入了,逆向过程如下
from scipy.special import logit
def invsigmoid(a): 无奈人生安全网
b= np.array([[0.0]*32])
for i in range(32):
b[0][i]=logit(a[0][i]) #logit为sigmoid的反函数,但是tensorflow中没有这个函数,只能借助scipy中的了
return b
无奈人生安全网
a = np.array([[1.40895243e-01, 9.98096014e-01, 1.13422030e-02, 6.57041353e-01,
9.97613889e-01, 9.98909625e-01, 9.92840464e-01, 9.90108787e-01,
1.43269835e-03, 9.89027450e-01, 7.22652880e-01, 9.63670217e-01,
6.89424259e-01, 1.76012035e-02, 9.30893743e-01, 8.61464445e-03,
本文来自无奈人生安全网
4.35839722e-01, 8.38741174e-04, 6.38429400e-02, 9.90384032e-01,
1.09806946e-03, 1.76375112e-03, 9.37186997e-01, 8.32329340e-01,
9.83474966e-01, 8.79308946e-01, 6.59324698e-03, 7.85916088e-05,
2.94269115e-05, 1.97006621e-03, 9.99416387e-01, 9.99997202e-01]]) www.wnhack.com
a0=invsigmoid(a)
a1=tf.subtract(a0,v5)
a2=tf.matmul(a1,tf.matrix_inverse(v2))
a3=tf.atanh(a2)
a4=tf.subtract(a3,v4) copyright 无奈人生
a5=tf.matmul(a4,tf.matrix_inverse(v1))
a6=invsigmoid(gv(a5))#a5是个tensor对象,要用np.array数据类型才能使用。
a7=tf.subtract(a6,v3)
a8=tf.matmul(a7,tf.matrix_inverse(v0))
l=gv(a8).tolist()
www.wnhack.com
ll=l[0]
flag=''
for i in range(len(ll)):
ll[i]*=128
ll[i]=round(ll[i])
本文来自无奈人生安全网
flag+=chr(ll[i])
print(flag)
然而出问题了。最终的a8全是naf。让我们想办法输出中间变量的值,看看哪里有问题。在每一步后面输出a的数据。调着调着发现,第二个invsigmoid出了问题,意义不明(似乎是超出定义域了)。
思考了一下,我先随便输一个数据进去,用它算的结果逆一遍,看看能不能得到原来的值,于是:
copyright 无奈人生
def trans(secret):
return np.array([float(ord(x))/128 for x in secret])
fakeflag = "flag{01234567012345670123456789}"。 (责任编辑:wnhack)
【声明】:无奈人生安全网(http://www.wnhack.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱472701013@qq.com,我们会在最短的时间内进行处理。