Linux 進程信息收集與行為分析


0x00 分析方法

1)基本信息收集

         對於一個進程的分析,首先可以通過ps,lsof等命令了解程序的一些基本信息。這個階段可以搜集進程開放了哪些端口,使用了哪些句柄,程序的運行狀態。

2)獲取程序組成二進制文件

         下一階段可以思考程序由哪些程序文件組成,通過ps命令可以找到程序的啟動文件路徑,通過進程的maps文件,可以查看進程加載了哪些so文件。 這一步可以得到程序的所有二進制代碼,作為IDA與gdb的分析輸入。

 

3)數據作為切入點,數據流跟蹤

         進程信息的搜集與程序代碼分析都比較零散,無法很好的將各個部分連接起來。得到了二進制代碼,逆向之后,也常常感覺到難以下手,缺少一個切入點。 此時數據流可以作為一條貫穿始終的線索,同時也可以作為對代碼研究的切入點。

         例如,當我們執行一個web登錄請求時,首先可以用tcpdump抓取數據,分析apache與客戶端之間的數據交互。 然后可以用strace監聽apache與mysql, 分析這個數據流到達的過程中,apache與mysql利用哪些系統調用讀寫數據,用什么方式與其他進程進行通信。

         使用gdb下斷點,斷下數據查看調用棧,分析處理數據的函數,即可在IDA中精確定位到相關邏輯處理的代碼。這樣即可通過一個可視化的操作作為切入點,對其每個階段的數據流進行跟蹤,最終精確定位到這個操作的邏輯處理代碼,分析這個業務的邏輯。

 

         分析思路如上圖所示。

0x01 進程信息

1)ps 命令收集進程運行信息

 

ps 可以找到進程的PID,狀態,啟用用戶,進程啟動命令等重要信息。

常用參數:

-A 顯示所有進程(等價於-e)(utility)
-a 顯示一個終端的所有進程,除了會話引線
-N 忽略選擇。
-d 顯示所有進程,但省略所有的會話引線(utility)
-x 顯示沒有控制終端的進程,同時顯示各個命令的具體路徑。dx不可合用。(utility)
-p pid 進程使用cpu的時間
-u uid or username 選擇有效的用戶id或者是用戶名
-g gid or groupname 顯示組的所有進程。
U username 顯示該用戶下的所有進程,且顯示各個命令的詳細路徑。如:ps U zhang;(utility)
-f 全部列出,通常和其他選項聯用。如:ps -fa or ps -fx and so on.
-l 長格式(有F,wchan,C 等字段)
-j 作業格式
-o 用戶自定義格式。
v 以虛擬存儲器格式顯示
s 以信號格式顯示
-m 顯示所有的線程
-H 顯示進程的層次(和其它的命令合用,如:ps -Ha)(utility)
e 命令之后顯示環境(如:ps -d e; ps -a e)(utility)
h 不顯示第一行

常用參數組合 afx,aux,alx

 

2)netstat 查看端口開放信息

    Netstat 命令用於顯示各種網絡相關信息,如網絡連接,路由表,接口狀態等等。

 

常見參數:

-a (all)顯示所有選項,默認不顯示LISTEN相關
-t (tcp)僅顯示tcp相關選項
-u (udp)僅顯示udp相關選項
-n 拒絕顯示別名,能顯示數字的全部轉化成數字。
-l 僅列出有在 Listen (監聽) 的服務狀態

-p 顯示建立相關鏈接的程序名
-r 顯示路由信息,路由表
-e 顯示擴展信息,例如uid等
-s 按各個協議進行統計
-c 每隔一個固定時間,執行該netstat命令。

參考資料:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316661.html

 

3)lsof查看句柄信息

  lsof(list open files)是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。

 

常見參數

-a 列出打開文件存在的進程

-c<進程名> 列出指定進程所打開的文件

-g  列出GID號進程詳情

-d<文件號> 列出占用該文件號的進程

+d<目錄>  列出目錄下被打開的文件

+D<目錄>  遞歸列出目錄下被打開的文件

-n<目錄>  列出使用NFS的文件

-i<條件>  列出符合條件的進程。(4、6、協議、:端口、 @ip )

-p<進程號> 列出指定進程號所打開的文件

-u  列出UID號進程詳情

-h 顯示幫助信息

-v 顯示版本信息

參考資料:http://www.cnblogs.com/peida/archive/2013/02/26/2932972.html

 

4)cat /proc/{PID}/maps

  每個進程的模塊加載信息都會存到PID對應的maps文件中。通過這條命令可以打印進程的模塊加載信息及加載到內存中的地址。

 

0x02 數據交互

 

  在整個分析過程中,數據流貫穿始終的線索。 數據本身才是核心的資產,同時數據也是驗證一些猜想的最好證據。 如想要驗證某個連接是否我的網絡操作的連接,如果抓包該連接中出現了我提交的數據就可以證明這個連接與我的操作相關了。如gdb調試中在內存中打印出輸入的數據,就能確定走到了相關的函數調用點。

  進程與外界的數據交互,可能是與文件的交互,與其他進程的交互,或者與其他主機建立網絡連接交互。在linux中這些都可以關聯到句柄上,可以使用lsof查看。 但是有些交互發生在瞬間,很快就關閉了,沒有合適的時機進行查看。 此時可以用strace 對進程進行監聽,同時strace也可以通過一些系統調用分析程序的執行過程。

 

1)Strace 使用

 

常用參數:

-c 統計每一系統調用的所執行的時間,次數和出錯的次數等.
-d 輸出strace關於標准錯誤的調試信息.
-f 跟蹤由fork調用所產生的子進程.
-ff 如果提供-o filename,則所有進程的跟蹤結果輸出到相應的filename.pid中,pid是各進程的進程號.
-F 嘗試跟蹤vfork調用.在-f時,vfork不被跟蹤.
-h 輸出簡要的幫助信息.
-i 輸出系統調用的入口指針.
-q 禁止輸出關於脫離的消息.
-r 打印出相對時間關於,,每一個系統調用.
-t 在輸出中的每一行前加上時間信息.
-tt 在輸出中的每一行前加上時間信息,微秒級.
-ttt 微秒級輸出,以秒了表示時間.
-T 顯示每一調用所耗的時間.
-v 輸出所有的系統調用.一些調用關於環境變量,狀態,輸入輸出等調用由於使用頻繁,默認不輸出.
-V 輸出strace的版本信息.
-x 以十六進制形式輸出非標准字符串
-xx 所有字符串以十六進制形式輸出.

參考資料:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html

用的比較順手的組合strace –p 9126 –s 1024 –ff –o log

該命令會跟蹤子進程和線程,並按線程將結果保存到不同的文件中。

 

使用strace最終apache得到的一些結果

 

該結果顯示了一個網絡連接建立,發送,接收,再到關閉的一個系統調用過程,能夠幫助我們分析程序是如何執行的。

 

2)tcpdump使用

    Tcpdump 是linux下常用的抓包工具,但是命令行下可視化分析不太方便。 推薦用-o選項將數據保存成pcapng格式的文件,再用wireshark或科來之類的軟件對數據進行分析。

0x03 程序行為

    通過對進程信息的收集,我們能得到相關的啟動程序與模塊so文件,這時就能夠丟到IDA中進行逆向分析了。 IDA的使用推薦閱讀《IDA Pro權威指南》。再用gdb進行動態調試能夠很好的幫助理解程序的運行過程,對數據的處理過程。在條件符合的情況下用gdbserver結合IDA的遠程調試,或者使用BinNavi,能夠更方便的分析程序流程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM