1. 程式人生 > >2017-2018-2 20155315《網絡對抗技術》Exp1:PC平臺逆向破解

2017-2018-2 20155315《網絡對抗技術》Exp1:PC平臺逆向破解

損壞 href 補碼 定位 log class ali 相差 運行程序

實驗目的

  • 本次實踐的對象是一個名為pwn1的linux可執行文件。
  • 該程序正常執行流程是:main調用foo函數,foo函數會簡單回顯任何用戶輸入的字符串。
  • 該程序同時包含另一個代碼片段,getShell,會返回一個可用Shell。正常情況下這個代碼是不會被運行的。我們實踐的目標就是想辦法運行這個代碼片段。我們將學習兩種方法運行這個代碼片段,然後學習如何註入運行任何Shellcode。

實驗內容

  • 手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數。
  • 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。
  • 註入一個自己制作的shellcode並運行這段shellcode。

實驗要求

  • 熟悉Linux基本操作
  • 理解Bof的原理
  • 會使用gdb,vi

實驗步驟

(一)直接修改程序機器指令,改變程序執行流程

  • 知識要求:Call指令,EIP寄存器,指令跳轉的偏移計算,補碼,反匯編指令objdump,十六進制編輯工具
  • 學習目標:理解可執行文件與機器指令
  • 進階:掌握ELF文件格式,掌握動態技術
思路
  • 一個程序的可執行文件可通過objdump命令對其進行反匯編,通過對匯編語言的學習可以看出程序讀取數據的過程。
    技術分享圖片
  • 從反匯編的文件來看,main函數中調用foo函數,使用call指令。通過分析發現foo函數與getShell函數的首地址之間
    存在偏移,兩者之間相差了14。系統調用foo函數對應機器指令為e8 d7ffffff
    ,則如果想調用getShell函數,就要對e8 d7ffffff進行修改。
  • 已經知道電腦是小端模式,即數據的高字節保存在內存的高地址中,而數據的低字節保存在內存的低地址中。因此,如果要修改,就要將"d7"改為"c3"。
  • 具體操作過程:
    • 將pwn1進行備份,修改備份文件
    • 用vi打開備份文件,用:%!xxd將顯示模式切換為16進制模式
    • /d7查找要修改的內容,定位後將d7改為c3
    • :%!xxd -r將轉換16進制為原格式,保存退出。
  • 再次反匯編之後,確定已經將程序修改為調用getShell函數,接下來就是運行程序了。
  • 運行時發現無法找到目錄或文件,按照老師提供的教程進行操作就可以了。
運行截圖

技術分享圖片

思考

運行成功之後就完成了實驗的第一個部分,按照老師的指導一步步操作還算順利。遇到的問題是,第一次在16進制模式修改完數據後出現操作失誤,先保存後轉換,在運行的時候導致文件損壞不可用。這是因為一開始保存的時候就改變了文件的格式,使得它不再是一個可執行文件的格式。查找資料後沒有找到能將其再次轉換的方法,只好重新進行實驗。

參考資料

  • kali國內更新源
  • objdump的用法
  • 64位Kali無法順利執行pwn1問題的解決方案

2017-2018-2 20155315《網絡對抗技術》Exp1:PC平臺逆向破解