ez_rust_writeup

一道簡單的[[rust逆向]]
#rust逆向 #位運算

題目信息

  • 文件名:ezrust.exe
    題目附件:https://wwfj.lanzoul.com/iczMR30k5j4h
    密碼:bueq

題目分析

1. 初步分析

這是一道Rust編寫的逆向題目。通過IDA分析可以看到,這是一個典型的flag驗證程序。

2. 程序流程分析

程序的主要邏輯在sub_140002220函數中,讓我們逐步分析:

  1. 用戶輸入:程序首先輸出提示信息"please input your flag:",要求用戶輸入flag
  2. 長度檢查:程序檢查輸入的長度是否為23字符
  3. 字符處理:對輸入的每個字符進行特殊的位運算處理
  4. 比較驗證:將處理后的結果與硬編碼的目標數組進行比較

3. 核心算法分析

通過分析反編譯代碼,我們可以看到程序對輸入進行了如下處理:

// 偽代碼邏輯
for each character in input:v13 = character >> 4         // 右移4位v9 = 16 * ((character & 15) ^ 8)  // 低4位異或8后乘以16result = v9 + (v13 ^ 9)      // 組合結果

具體分析:

  • sub_140002AE0(v29, 4) 實現右移4位操作,提取高4位
  • sub_140002B30(v12, 15) 實現與15的按位與操作,提取低4位
  • 然后進行異或和移位運算的組合

4. 目標數組分析

程序中硬編碼了一個23字節的目標數組:

[-82, -36, -66, -50, 124, -102, -66, 124, -115, 124, -66, -115, -17, -70, 124, -102, -97, 111, -1, -34, -97, -1, -33]

轉換為無符號字節:

[174, 220, 190, 206, 124, 154, 190, 124, 141, 124, 190, 141, 239, 186, 124, 154, 159, 111, 255, 222, 159, 255, 223]

5. 逆向算法推導

從算法分析可以看出,對于輸入字符c:

  1. 取高4位:high = c >> 4
  2. 取低4位:low = c & 15
  3. 計算:result = 16 * (low ^ 8) + (high ^ 9)

要逆向這個過程,我們需要:

  1. 對于目標值target,求解原始字符c
  2. x = target // 16y = target % 16
  3. low ^ 8 = xhigh ^ 9 = y
  4. 所以 low = x ^ 8high = y ^ 9
  5. 原始字符 c = high * 16 + low

解題腳本

def solve_ezrust():# 目標數組(程序中硬編碼的期望結果)target = [174, 220, 190, 206, 124, 154, 190, 124, 141, 124, 190, 141, 239, 186, 124, 154, 159, 111, 255, 222, 159, 255, 223]flag = ""for target_byte in target:# 暴力搜索:對每個目標字節,嘗試所有可能的ASCII字符for char_val in range(32, 127):  # 可打印ASCII范圍# 模擬程序的加密算法high_4_bits = char_val >> 4      # 提取高4位low_4_bits = char_val & 0x0F     # 提取低4位# 核心算法:result = 16 * (low ^ 8) + (high ^ 9)encrypted = 16 * (low_4_bits ^ 8) + (high_4_bits ^ 9)if encrypted == target_byte:flag += chr(char_val)breakreturn flag# 驗證函數
def verify_algorithm(char):"""驗證加密算法"""char_val = ord(char)high = char_val >> 4low = char_val & 15result = 16 * (low ^ 8) + (high ^ 9)return resultif __name__ == "__main__":flag = solve_ezrust()print(f"Flag: {flag}")# 驗證結果target = [174, 220, 190, 206, 124, 154, 190, 124, 141, 124, 190, 141, 239, 186, 124, 154, 159, 111, 255, 222, 159, 255, 223]print("\n驗證結果:")for i, char in enumerate(flag):calculated = verify_algorithm(char)expected = target[i]status = "?" if calculated == expected else "?"print(f"字符 '{char}' (ASCII {ord(char)}) -> {calculated} (期望 {expected}) {status}")# 檢查是否所有字符都匹配all_match = all(verify_algorithm(char) == target[i] for i, char in enumerate(flag))print(f"\n整體驗證結果: {'成功' if all_match else '失敗'}")

運行結果

運行解題腳本后得到flag:

Flag: rUst_1s_@_s@f3_1anguage

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88196.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88196.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88196.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【QT】-隱式轉換 explicit用法

通俗易懂的解釋:隱式轉換 vs 顯式轉換 什么是隱式轉換? 隱式轉換就是編譯器偷偷幫你做的類型轉換,你甚至都沒意識到它發生了。 例子: cpp 運行 double x = 5; // 隱式:int → double(5 變成 5.0) int y = x * 2.5; // 隱式:double → int(截斷小數部分) 構造函數的隱…

Django核心知識點詳解:JSON、AJAX、Cookie、Session與用戶認證

1. JSON數據格式詳解1.1 什么是JSON?JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,具有以下特點:獨立于語言,幾乎所有編程語言都支持易于人閱讀和編寫易于機器解析和生成基于文本&#xff…

[特殊字符] Python 實戰 | 批量統計中文文檔詞頻并導出 Excel

本文展示如何用 Python 腳本: 批量讀取文件夾中的多篇中文文檔; 用 jieba 分詞并統計詞頻(過濾停用詞與單字符); 將各文檔詞頻輸出為對應 Excel 文件; 是文本分析、內容審查、報告編寫中的實用技巧。 &…

共享打印機(詳細操作+常見問題:需輸入用戶名密碼、無法連接等)

文章目錄一、設置打印機共享的準備工作二、Windows系統下打印機共享設置1. 啟用主機打印機共享2. 客戶端添加共享打印機三、我所遇到的問題及解決方法客戶機遇到輸入用戶名、密碼錯誤代碼 0x0000011b一、錯誤代碼 0x0000011b 的含義二、解決方法添加打印機沒成功其他問題此次打…

在 Windows 系統上配置 [go-zero](https://go-zero.dev) 開發環境教程

💻 在 Windows 系統上配置 go-zero 開發環境教程 本教程將詳細介紹如何在 Windows 系統上配置 go-zero 微服務框架的開發環境,包括依賴安裝、路徑配置、常見問題等。 🧱 一、前置環境安裝 1. 安裝 Go 下載地址:https://go.dev/…

開源=白嫖?

國內有一個非常濃重的思想,開源,開源就是免費,就是白嫖,就是不花錢,白給。那么什么是開源?“源代碼”是軟件中大多數計算機用戶從未見過的部分;它是計算機程序員可以操縱的代碼,以改變一個軟件(…

2048-控制臺版本

2048控制臺版 文章目錄2048控制臺版實現效果:在這里插入圖片描述庫函數使用:初始化變量功能函數實現:狀態判斷函數int Judge();數字生成函數 bool CtreateNumber()打印游戲界面 void…

提取出Wallpaper Engine壁紙的mpkg類靜態壁紙

github 地址 https://github.com/notscuffed/repkg先下載軟件2853…26目錄這樣獲取有的直接mp4格式,就不能用這方法準備好后 cmd 進入repkg目錄 執行 repkg extract ./294...333/scene.pkg

AI健康小屋“15分鐘服務圈”:如何重構社區健康生態?

AI健康小屋作為“15分鐘服務圈”的核心載體,通過技術賦能與場景重構,正推動社區健康生態從被動治療向主動預防、從單一服務向全周期管理轉型。那我們應該如何重構社區健康生態呢?服務模式創新1.全時段覆蓋AI健康小屋通過分時段服務滿足不同群…

[netty5: WebSocketFrame]-源碼分析

WebSocketFrame WebSocketFrame 是 Netty 中用于表示 WebSocket 消息幀的抽象基類,封裝了幀的內容、分片標志和擴展位信息,供各類具體幀(如文本、二進制、控制幀)繼承使用。 public abstract class WebSocketFrame extends Buffer…

【加解密與C】非對稱加解密(三)ECC橢圓曲線

ECC橢圓曲線的基本概念橢圓曲線密碼學(Elliptic Curve Cryptography,ECC)是一種基于橢圓曲線數學的公鑰密碼體制。與傳統的RSA相比,ECC在相同安全級別下使用更短的密鑰,計算效率更高,適用于資源受限的環境。…

力扣網編程150題:加油站(貪心解法)

一. 簡介 前面一篇文章使用暴力解法來解決力扣網150 題目:加油站。文章如下: 力扣網編程150題:加油站(暴力解法)-CSDN博客 暴力解法就是遍歷了所有元素作為起始點的可能,算法時間復雜度為 O(n*n)&#x…

windwos 設置redis長久密碼不生效

1、設置長久密碼redis.windows.conf 文件修改對應的設置密碼2、啟動時設置對應的加載配置文件

物聯網(IoT)領域存在多種協議

物聯網(IoT)領域存在多種協議,主要是因為不同的應用場景對通信的需求差異很大,包括實時性、帶寬、功耗、設備兼容性、安全性等。以下從協議多樣性的原因和你提到的具體協議(如 dc3-driver-* 模塊)展開說明&…

二、encoders

文章目錄一、batch_encoder (用于 BFV)1. 概述2. 數學原理3. 使用方法4. 代碼示例二、ckks_encoder (用于 CKKS)在 1. bfv_basics.cpp 中,我們展示了如何使用BFV方案執行非常簡單的計算。計算是在 plain_modulus 參數的模下執行的,并且 只使用了 BFV 明文…

數據一致性解決方案總結

數據一致性解決方案總結 我們在系統中,主要進行了數據冗余,那么就會帶來數據一致性的問題。常見的數據一致性問題有:數據庫主從同步延遲導致的讀數據不一致;數據庫主主之間數據的不一致;緩存和數據庫之間的數據不一致。…

17.Spring Boot的Bean詳解(新手版)

文章目錄1. 什么是Bean?從零開始理解1.1 Bean的定義1.2 為什么需要Bean?1.3 Bean vs 普通對象的區別2. Spring容器:Bean的家2.1 什么是Spring容器?2.2 容器的工作流程3. Bean的聲明方式詳解3.1 使用Component及其專門化注解3.1.1 …

cherryStudio electron因為環境問題無法安裝解決方法或打包失敗解決方法

$env:ELECTRON_MIRROR"https://npmmirror.com/mirrors/electron/"; $env:ELECTRON_CUSTOM_DIR"{{ version }}"; yarn install1. 上面是關于electron安裝失敗的解決方法. 也可以通過到git上下面包,解壓后,放到對應的目錄下面,并把里面的build文件夾刪除, b…

微服務架構中數據一致性保證機制深度解析

在微服務架構中,數據一致性是分布式系統設計的核心挑戰。由于服務拆分后數據自治(每個服務獨立數據庫),跨服務操作的一致性保障需突破傳統單體事務的局限。本文從一致性模型、核心解決方案、技術實現及面試高頻問題四個維度&#…

【Gin】HTTP 請求調試器

文章目錄 項目概述代碼功能詳解1. 導入必要的包2. 主函數和路由設置3. 請求信息捕獲4. 請求參數和頭信息5. 請求體處理5.1 JSON 數據處理5.2 表單數據處理5.3 Multipart 表單數據處理5.4 其他類型數據處理6. 構造響應對象7. 返回 JSON 響應功能特點使用場景完整代碼項目概述 這…