zip-zip(子函式呼叫)

yuanyy720發表於2024-07-02
  • 題目

    監聽伺服器埠,得到題目如下:

  • 原始碼解析

    • 主函式

      主函式中是題目介面的邏輯,對應於使用者的選擇做出相應的操作,其中需要注意的是選項2,解壓操作需要獲得root許可權(uid==0).

    • 選項1,2:檔案壓縮和解壓縮,是常規的檔案壓縮程式碼,不做解釋。

    • 選項3:buy操作,buy()函式呼叫了加密函式encrypt();根據具體的實現邏輯,可知使用的是RSA加密演算法。其中n=221,e=7,從傳入引數和題目中的tips都能得到。如果滿足密文的前三個字元的ascii碼值為149,108和21,則獲得root許可權。

    • 題解

      整個解題思路如下。首先選擇3,透過加密操作獲得root許可權。

      獲得CDK的指令碼如下(RSA解密):

      import gmpy2
      def Decrypt(c,e,p,q):
          L = (p-1)*(q-1)
          d = gmpy2.invert(e, L)
          n = p*q
          crypto = gmpy2.powmod(c, d, n)
          print(chr(crypto))
      if __name__ == "__main__":
          p = 17
          q = 13
          e = 7
          c = 149
          Decrypt(c,e,p,q)
      

      然後選擇1,對目標檔案flag進行壓縮,壓縮檔案的命名為pwn,即當前正在執行的檔案,壓縮的同名檔案不會影響此次程式的執行,因為程式執行尚未結束,其掛載到了/proc目錄下。然而下次執行時,真正執行的檔案將會是原來的flag而不是pwn。最後選擇3,由於解壓操作接收到的檔名的長度只有1,不能正確解壓上一步得到的pwn檔案(flag),所以需要手動終止程式的執行。此處涉及到一個知識點,即unzip函式和zip函式都是main函式的子函式,利用子函式同棧記憶體大小相等的特點,在手動結束程式執行時,unzip的區域性變數filename正是上次在zip函式中輸入的檔名,即pwn。

相關文章