-
題目
監聽伺服器埠,得到題目如下:
-
原始碼解析
-
主函式
主函式中是題目介面的邏輯,對應於使用者的選擇做出相應的操作,其中需要注意的是選項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函式
- 普通函式與函式模板呼叫規則函式
- 普通函式與函式模板呼叫規則2函式
- httprunner yml 呼叫外部函式HTTP函式
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- 核心函式 系統呼叫 系統命令 庫函式函式
- 函式呼叫與空間分配函式
- 函式呼叫棧的問題函式
- 函式棧幀(呼叫過程)函式
- 虛擬函式的呼叫原理函式
- vue跨頁面呼叫函式Vue函式
- MySQL 儲存函式及呼叫MySql儲存函式
- C語言函式呼叫棧C語言函式
- vue在一個函式中呼叫另外一個函式Vue函式
- .Net7 CLR的呼叫函式和編譯函式函式編譯
- 子父類中函式函式
- 什麼是IIFE(立即呼叫函式表示式)?函式
- 第 8 節:函式-函式巢狀呼叫與返回值函式巢狀
- JavaScript 之有趣的函式(函式宣告、呼叫、預解析、作用域)JavaScript函式
- [20190401]關於semtimedop函式呼叫.txt函式
- makefile--函式定義與呼叫函式
- 建構函式之間的呼叫函式
- [20180531]函式呼叫與遞迴.txt函式遞迴
- 函式的呼叫方式和引數函式
- [20231123]函式與bash shell呼叫.txt函式
- js 使用 DotNetObjectReference 呼叫 c# 函式JSObjectC#函式
- JS的五種函式呼叫方式JS函式
- MySQL:MySQL層比較函式呼叫MySql函式
- Python入門之函式呼叫(二)Python函式
- 運用inlinehook主動呼叫函式inlineHook函式
- C++中函式呼叫的用法C++函式
- 詳細講解函式呼叫原理函式