【Netzob学习】(五)使用netzob逆向未知协议之三——状态机推断

无限状态机是在学习网络的时候经常能够听到的一个词,尤其是我在用《计算机网络:自顶向下方法》学习TCP的时候,里面把每一个状态机都描述得十分清晰。简而言之,协议可以使用无限状态机来进行描述,接下来使用Netzob工具对官方提供的抓包pcap例子进行状态机的推断。下面介绍三种创建状态机的方式。

一、生成一个状态机链

在这里我们将生成一个能够说明指令和响应的顺序的基本状态机,每一个包发送后,都将导致状态的改变,因此取名为状态机链。

# Create a session of messages
session = Session(messages_session1)

# Abstract this session according to the inferred symbols
abstractSession = session.abstract(list(symbols.values()))

# Generate an automata according to the observed sequence of messages/symbols
automata = Automata.generateChainedStatesAutomata(abstractSession, list(symbols.values()))

# Print the dot representation of the automata
dotcode = automata.generateDotCode()
print(dotcode)

1、使用session.abstract()函数抽象得到abstractSession

2、 Automata.generateChainedStatesAutomata()函数能够通过symbols和abstractSession得到状态机链

3、使用generateDotCode()函数创建dotcode以便更好观察状态机

获得的状态机最终会被存放到dotcode内,这样做能够生成一个图像来显示状态机。运行上述代码得到的结果如下:

 二、生成一个单一状态机

这次我们不将PCAP包转换成一系列的状态机,而是产生一个能够接收所有观察到的发送包引起状态变化的独特状态。对于每一个发送的包(例如:‘CMDencrypt’),我们都期待有一个特殊的响应(例如:‘REDencrypt’),使用如下代码完成上述工作:

# Create a session of messages
session = Session(messages_session1)

# Abstract this session according to the inferred symbols
abstractSession = session.abstract(list(symbols.values()))

# Generate an automata according to the observed sequence of messages/symbols
automata = Automata.generateOneStateAutomata(abstractSession, list(symbols.values()))

# Print the dot representation of the automata
dotcode = automata.generateDotCode()
print(dotcode)

1、使用session.abstract()函数抽象得到abstractSession

2、 Automata.generateOneStateAutomata()函数能够通过symbols和abstractSession得到状态机链

3、使用generateDotCode()函数创建dotcode以便更好观察状态机

 获得的状态机最终也存放到dotcode来画出一个图以便观察,运行上述代码所得到的结果如下:

  三、生成一个基于PTA的状态机

 最后我们从第一和第三个数据包中,以PTA(Prefix-Tree Acceptor)的策略将状态机进行合并,形成一个状态机,代码如下:

# Create sessions of messages
messages_session1 = PCAPImporter.readFile("target_src_v1_session1.pcap").values()
messages_session3 = PCAPImporter.readFile("target_src_v1_session3.pcap").values()

session1 = Session(messages_session1)
session3 = Session(messages_session3)

# Abstract this session according to the inferred symbols
abstractSession1 = session1.abstract(list(symbols.values()))
abstractSession3 = session3.abstract(list(symbols.values()))

# Generate an automata according to the observed sequence of messages/symbols
automata = Automata.generatePTAAutomata([abstractSession1, abstractSession3], list(symbols.values()))

# Print the dot representation of the automata
dotcode = automata.generateDotCode()
print(dotcode)

 

1、使用session.abstract()函数抽象得到abstractSession

2、 Automata.generatePTAAutomata()函数能够通过symbols和abstractSession得到状态机链

3、使用generateDotCode()函数创建dotcode以便更好观察状态机

运行结果如下:

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值