1. 程式人生 > >sa-babi漏洞程式碼生成

sa-babi漏洞程式碼生成

sa-babi

最近系統級程式設計要用到CMU的一篇論文,主要是生成漏洞樣本然後訓練memory network以後對開源軟體程式碼進行分析,檢視時候會有相似的漏洞。

在sa-babi的程式碼生成中有四個檔案,generate.py, sa_tag.py, score_tool_outputs.py, templates.py. 

  • generate.py

        generate.py 是生成的主要生成檔案,檔案的生成過程:

        1.設定body主體的生成器,主要是產生一個函式的主體部分以及每條語句對應的Tag.

        

        2.生成器函式會呼叫 _get_anon_vars(),獲得變數名稱,subtitutions 是之後會被替換的文字,pt_var是我自己定義的指標   變數,buf_var是陣列變數,idx_var是數組裡面的索引變數,max_var是(int)變數的最大值,buf_len是陣列變數的長度

        3.生成器函式最後會呼叫_assemble_general_example,dec_init_pairs是自定義的語句塊,是一個tuple組成的列表,在templates.py裡面對應的變數名是xxxx_xxxx_PAIRS. main_lines是函式體的主體部分,是一個字串組成的列表,在templates.py裡面對應的函式名是xxxx_xxxx_LINES. dummy_var是與錯誤無關的變數,感覺主要就是讓生成的函式體複雜一點,,既有正常的變數,也有不正常的變數。不然全部都是有問題的變數也不行啊。

 

        4._assemle_general_example 裡面呼叫的_get_lines會呼叫get_setup_lines方法,get_setup_lines方法會利用dec_init_pairs,將其轉換成對應的變數宣告和賦值語句。get_setup_lines方法返回的就是一個字串的列表啦。

        5.get_lines方法呼叫get_setup_lines方法後,會將setup_lines和main_lines拼接,組成函式的主體語句。這個時候的body_tags是函式語句對應的標籤,主要是TAG.OTHER和TAG.BODY, 因為含有漏洞的語句還沒有被差插入。get_lines之後會呼叫_insert_dummies方法,這個方法會將一些可能有問題的語句插入到main_llines中,插入的同時,會判斷是否有問題,比如,緩衝區溢位的標定是判斷下標是否越界,如果越界,則對應的TAG會是xxxx_xxxx_UNSAFE; 否則則是xxxx_xxxx_SAFE. 當然,插入的時候如果實在控制語句,比如if語句中,則TAG會程式設計xxxx_COND_xxxx, 意思是可能有錯誤,也可能沒有錯誤。最後,所有的標籤會加入到body_tags。

 

        6._insert_dummies會多次呼叫_insert_referential_dummy,_insert_referential_dummy會執行相應的插入語句的操作,具體就是mainlines會被拆成幾個list, 將需要插入的語句和這幾個list組合起來就是最後新的mainlines. 這個部分程式碼有點多,可以自己去看。

        7.最後還會對生成器函式進行assert操作,判斷生成的樣本是否符合要求。感覺主要就是判斷最後的tag是否在as_tag.py裡面。我生成程式碼的時候直接把assert操作給註釋掉了。

  • sa_tag.py

        這裡面主要是一些語句的標註,均是整數值。OTHER針對的是函式的名稱和include命令以及首尾的大括號;BODY是正常的語句;其他的就是可能存在錯誤的地方了。

  • score_tool_outputs.py

       這個函式的功能還不清楚,我用windows生成程式碼的時候沒有用到。

  • templates.py

       templates.py裡面的模板分為兩大類,一個是xxxx_xxxx_PAIRS, 這個是在get_lines裡面進行轉換的部分,主要是變數的定義與賦值操作;另一個是xxxx_xxxx_LINES, 這個是一些控制語句,但是沒有具體的操作,要等到insert_dummy以後將錯誤程式碼插入其中。

 

   在windows平臺上呼叫generate.py的時候,有幾個引數需要指定。一個是path,這是必須的,對應的是生成的檔案的目錄;還有一些非必要的引數,比如num_instances,這是樣本的數量。

這是我用pycharm配置的引數,命令列裡面基本也是這樣操作。

命令列操作的話就是python generate.py "path" -num_instances  num.