美文网首页
Peach Pit使用tcp协议与目标程序交互

Peach Pit使用tcp协议与目标程序交互

作者: 日常采坑君 | 来源:发表于2018-08-16 10:30 被阅读0次

最近一直在做Peach对应用程序的自动化模糊测试,但是网上的资料少之又少,官网的说明虽然很详细,但是sample相对较少,很多功能都是需要自己去摸索的。
最近因为项目需要,研究了一下pit的结构,以及通过publisher中的TcpClient属性来与外界交互,具体如下:

<?xml version="1.0" encoding="utf-8"?>
<Peach author="wx"> 
    <DataModel name="Mocov1">
        <Block name="block">
            <Number name="Type"  size="8" value="4"/>
        </Block>
    </DataModel>

    <DataModel name="Mocov2">
        <Blob name="Data1" length="4" value="12"/>
    </DataModel>
    
    <DataModel name="TheTest">
        <String name="value" value="32"  />
    </DataModel>

    <DataModel name="DataResponse">
        <String name="Response" value="" />
    </DataModel>

    
    <StateModel name="TheState" initialState="State1">
        <State name="State1">
            <Action type="output" publisher="notUse">
                <DataModel ref="Mocov1" />
            </Action>
            
            <Action type="input" publisher="rec">
                <DataModel ref="DataResponse"/>
            </Action>

            <Action type="changeState" ref="State2" when="int(StateModel.states['State1'].actions[1].dataModel['Response'].InternalValue) == 0"/>

            <Action type="changeState" ref="State3" when="int(StateModel.states['State1'].actions[1].dataModel['Response'].InternalValue) == 1"/>
            
        </State>
        
        <State name="State2">
            <Action type="output" publisher="ParsedFile">
                <DataModel ref="Mocov1"/>
                <Data name="LoadFromFile" fileName="C:/Mocov/51001.txt" />
            </Action>
        </State>
        
        <State name="State3">
            <Action type="output" publisher="NotParsedFile">
                <DataModel ref="Mocov2"/>
                <Data name="LoadFromFile" fileName="C:/Mocov/4522.txt" />
            </Action>
        </State>
    
    </StateModel>
        
        
    <Test name="Default">
        <StateModel ref="TheState"/>
                <Publisher name="notUse" class="Console" />
        <Publisher name="ParsedFile" class="FilePerIteration">
            <Param name="FileName" value="C:/Mocov/seed/parsed/parsed_{0}.mocov"/>
        </Publisher>
        
        <Publisher name="NotParsedFile" class="FilePerIteration">
            <Param name="FileName" value="C:/Mocov/seed/notparsed/not_parsed_{0}.mocov"/>
        </Publisher>
        
        <Publisher name="rec" class="TcpClient">
            <Param name="Host" value=##HOST## />
            <Param name="Port" value=##PORT##/>
        </Publisher>
        
    </Test>
</Peach>

这是一个比较完整的pit文件,通过Tcp协议,接受来自服务器的数据,这里的服务器我是在外部写了一个py程序,通过建立socket与Peach内置的socket进程进行通信。
在这里,我主要是想说明一下pit的逻辑:

  1. <publisher name="rec">
    这是一个与外界通信的publisher;首先,TcpClient将从服务器接收到的数据利用StateModel中的"action type=input"放入到 datamodel中的DataResponse中。这里要注意:在对应的state-->action中,一定要标明其对应的publisher是哪个,不然对于pit的解析程序来说,是不能自动对应的,这样就会将该action作为一个正常的动作执行。例如,对于action[1],若是不指定publisher,则程序会变异Mocov1的数据,而不是将其作为输出到HOST
  2. action[3/4]
    <Action type="changeState" ref="State2" when="int(StateModel.states['State1'].actions[2].dataModel['Response'].InternalValue) == 0"/>:
    这句语句执行的是一个判断,即when属性后跟着一个py判断句,判断由网络传进来的数据是否为0,若是,则执行state2.state2/3这里也要注意action与publisher的对应
  3. 最后,publisher对应的action-->input是指接受来自HOST的数据,outputHOST输出数据。
  4. 需要注意,在initialState中必须要存在一个不需要任何条件就可以执行的action,不然会报错。

相关文章

网友评论

      本文标题:Peach Pit使用tcp协议与目标程序交互

      本文链接:https://www.haomeiwen.com/subject/kcyibftx.html