-
題目
監聽伺服器埠,得到題目如下:
-
原始碼解析
-
主函式
主函式中是題目介面的邏輯,對應於使用者的選擇做出相應的操作,其中需要注意的是選項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。
-
zip-zip(子函式呼叫)
相關文章
- 子函式呼叫函式
- Qt 子執行緒呼叫connect/QMetaObject::invokeMethod 不呼叫槽函式問題QT執行緒Object函式
- 外部函式的呼叫函式
- gdb 如何呼叫函式?函式
- 函式指標呼叫函式指標
- C程式函式呼叫&系統呼叫C程式函式
- 父類與子類之間靜態函式的呼叫以及函式引數的傳遞函式
- PostgreSQL函式裡呼叫函式(SETOF + RETURN QUERY)SQL函式
- JS中函式內套函式的呼叫JS函式
- js函式 函式自呼叫 返回函式的函式 (閉包)JS函式
- httprunner yml 呼叫外部函式HTTP函式
- Javascript的函式呼叫與thisJavaScript函式
- C中呼叫Lua函式函式
- 幾種函式呼叫方式函式
- sequence 和索引函式呼叫索引函式
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- 核心函式 系統呼叫 系統命令 庫函式函式
- C語言函式呼叫棧C語言函式
- 函式呼叫棧的問題函式
- 函式棧幀(呼叫過程)函式
- 函式呼叫與空間分配函式
- 虛擬函式的呼叫原理函式
- 避免SQL中的函式呼叫SQL函式
- 避免對mod函式的呼叫函式
- 理解JavaScript的函式呼叫和thisJavaScript函式
- 函式呼叫規則總結函式
- Matlab中@與函式呼叫Matlab函式
- 使用rownum減少函式呼叫函式
- MySQL 儲存函式及呼叫MySql儲存函式
- 子父類中函式函式
- WINDOWS鉤子函式(轉)Windows函式
- VC:滑鼠鉤子函式函式
- vue在一個函式中呼叫另外一個函式Vue函式
- .Net7 CLR的呼叫函式和編譯函式函式編譯
- [C++]顯示呼叫建構函式和解構函式C++函式
- C++箴言:避免解構函式呼叫虛擬函式C++箴言函式
- 函式庫呼叫和系統呼叫的區別函式
- 什麼是IIFE(立即呼叫函式表示式)?函式
- 第 8 節:函式-函式巢狀呼叫與返回值函式巢狀