攻防世界ReverseMe-120

這道題比較經典,涉及三個知識點,所以記錄一下。

首先給了一個文件,detect it easy看了下,是32位exe。

放入ida中,找下main函數,F5反編譯看一下偽代碼。

int __cdecl main(int argc, const char **argv, const char **envp)
{unsigned int v3; // edxunsigned int v4; // ecx__m128i si128; // xmm1unsigned int v6; // esiconst __m128i *v7; // eax__m128i v8; // xmm0int v9; // eaxchar v11[100]; // [esp+0h] [ebp-CCh] BYREFchar v12[100]; // [esp+64h] [ebp-68h] BYREFunsigned int v13; // [esp+C8h] [ebp-4h] BYREFprintf("please input your flah:");memset(v11, 0, sizeof(v11));scanf("%s", v11);memset(v12, 0, sizeof(v12));sub_A21000(v12, &v13, (unsigned __int8 *)v11, strlen(v11));v3 = v13;v4 = 0;if ( v13 ){if ( v13 >= 16 ){si128 = _mm_load_si128((const __m128i *)&xmmword_A34F20);v6 = v13 - (v13 & 0xF);v7 = (const __m128i *)v12;do{v8 = _mm_loadu_si128(v7);v4 += 16;++v7;v7[-1] = _mm_xor_si128(v8, si128);}while ( v4 < v6 );}for ( ; v4 < v3; ++v4 )v12[v4] ^= 0x25u;}v9 = strcmp(v12, "you_know_how_to_remove_junk_code");if ( v9 )v9 = v9 < 0 ? -1 : 1;if ( v9 )printf("wrong\n");elseprintf("correct\n");system("pause");return 0;
}

從后往前看,要得到correct結果,就需要v12和字符串you_know_how_to_remove_junk_code相等。

v12和v13先是和輸入的v11進行了一個函數sub_A21000的處理,然后又做了一段包含異或0X25的處理。

先看第一個函數。

知識點1:這里其實是一個base64解密函數。

int __fastcall sub_A21000(_BYTE *a1, unsigned int *a2, unsigned __int8 *a3, unsigned int a4)     //a1是v12,a2是v13值,a3是輸入數據,a4是輸入數據長度。
{int v4; // ebxunsigned int v5; // eaxint v6; // ecxunsigned __int8 *v7; // ediint v8; // edxbool v9; // zfunsigned __int8 v10; // clchar v11; // cl_BYTE *v12; // esiunsigned int v13; // ecxint v14; // ebxunsigned __int8 v15; // clchar v16; // dlint v20; // [esp+14h] [ebp-4h]unsigned int v21; // [esp+14h] [ebp-4h]int i; // [esp+24h] [ebp+Ch]v4 = 0;       // 記錄 '=' 出現的次數v5 = 0;// 當前輸入索引(掃描位置)v6 = 0;  // 有效 Base64 數據字符數(不包括空格、換行、=)v20 = 0;// 同 v6,用于避免寄存器沖突(編譯器優化痕跡)if ( !a4 )     //長度為0就退出return 0;v7 = a3;do{v8 = 0;v9 = v5 == a4;if ( v5 < a4 ){do{if ( a3[v5] != 32 )// 跳過前導空格break;++v5;++v8;}while ( v5 < a4 );v9 = v5 == a4;}if ( v9 )break;if ( a4 - v5 >= 2 && a3[v5] == 13 && a3[v5 + 1] == 10 || (v10 = a3[v5], v10 == 10) )// 遇到換行繼續{v6 = v20;}else{if ( v8 )// Base64 中間不能有空格,返回錯誤return -44;if ( v10 == 61 && (unsigned int)++v4 > 2 )// 等于號的個數比2個多,非法return -44;if ( v10 > 0x7Fu )// 檢查字符是否超出 ASCII 127return -44;v11 = byte_A34E40[v10];if ( v11 == 0x7F || (unsigned __int8)v11 < 0x40u && v4 )return -44;v6 = ++v20;}++v5;}while ( v5 < a4 );if ( !v6 )return 0;v12 = a1;v13 = ((unsigned int)(6 * v6 + 7) >> 3) - v4;  //這里用的是通用公式,取字節數減去填充 = 的數量if ( a1 && *a2 >= v13 ){v21 = 3;      // 每組 4 個 Base64 字符生成最多 3 字節v14 = 0;for ( i = 0; v5; --v5 ){v15 = *v7;if ( *v7 != '\r' && v15 != '\n' && v15 != ' ' ){v16 = byte_A34E40[v15];   //byte_A34E40是base64的字母表v21 -= v16 == 64;v14 = v16 & '?' | (v14 << 6);   //累加 6 位if ( ++i == 4 )   //每 4 個字符為一組{i = 0;if ( v21 )*v12++ = BYTE2(v14);   //高字節if ( v21 > 1 )*v12++ = BYTE1(v14);//中字節if ( v21 > 2 )*v12++ = v14;//低字節}}++v7;}*a2 = v12 - a1;return 0;}*a2 = v13;return -42;
}

確定好該函數后,右擊rename函數為base64decode方便查看,繼續看代碼。

v3 = v13;v4 = 0;if ( v13 ){if ( v13 >= 16 ){si128 = _mm_load_si128((const __m128i *)&xmmword_A34F20);v6 = v13 - (v13 & 0xF);v7 = (const __m128i *)v12;do{v8 = _mm_loadu_si128(v7);v4 += 16;++v7;v7[-1] = _mm_xor_si128(v8, si128);}while ( v4 < v6 );}for ( ; v4 < v3; ++v4 )v12[v4] ^= 0x25u;}v9 = strcmp(v12, "you_know_how_to_remove_junk_code");

知識點2:這里是使用了SSE指令,即帶 _mm_前綴,可以通過在一個控制器上同時處理多個數據流,從而提高運算速度。

_mm_load_si128函數表示從內存中加載一個128bits值到暫存器,也就是16字節,**注意:**p必須是一個16字節對齊的一個變量的地址。返回可以存放在代表寄存器的變量中的值。
_mm_loadu_si128函數和_mm_load_si128一樣的,但是不要求地址p是16字節對齊。

v6 = v13 - (v13 & 0xF);

這個是先把v13進行對齊,否則無法使用SSE指令處理。

v4 += 16;

這里是取n個16位的v12和xmmword_A34F20進行異或,剩下的不足16位的就和0x25異或。

雙擊查看xmmword_A34F20,發現其就是16位的0x25。

.rdata:00A34F20 xmmword_A34F20 ?xmmword 25252525252525252525252525252525h

所以,就是輸入值進行base64解密后,和0x25異或,最后和you_know_how_to_remove_junk_code字符串比較是否一致。

import base64
s=list("you_know_how_to_remove_junk_code")
encrypted_bytes = bytes(ord(c) ^ 0x25 for c in s)
decoded_bytes = base64.b64encode(encrypted_bytes).decode('ascii')
print(decoded_bytes)

這里還有一個我犯的錯誤點是把字符轉ord異或后,應該轉為byte字節,再進行base64加密,但是我轉的是chr,這會導致一部分數據無法轉為chr,從而導致錯誤。

知識點3:加密、解密、計算哈希、編碼等都應該使用byte字節形式相互轉化。

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

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

相關文章

小白也能看懂,HTTP中的文件上傳與下載到底發生了什么?

HTTP 文件傳輸協議解析&#xff1a;上傳與下載 這份文檔會用最簡單的方式&#xff0c;帶你了解 HTTP 協議是如何處理文件下載和上傳的。我們會專注于協議本身&#xff0c;看看客戶端&#xff08;比如你的瀏覽器&#xff09;和服務端&#xff08;網站服務器&#xff09;之間到底…

快速構建數據集-假數據(生成劃分)

快速構建數據集-假數據1、torch.randn&#xff08;?&#xff09;2、HuggingFace Datasets&#xff08;?&#xff09;&#x1f539;1. 從字典生成&#x1f539;2. 從 pandas.DataFrame 生成&#x1f539;3. 批量生成“業務型”假數據&#xff08;配合 Faker&#xff09;&#…

[修訂版]Xenomai/IPIPE源代碼情景解析

[修訂版]Xenomai/IPIPE源代碼情景解析 第一章&#xff1a;Interrupt Pipeline介紹 1.1 I-pipe與Xenomai1.2 I-pipe核心概念1.3 拉取I-pipe代碼 第二章&#xff1a;I-pipe對ARM64異常的改造 2.1 ARM64中斷機制與異常處理2.2 EL0_IRQ 中斷改造之入口2.3 EL0_IRQ 中斷改造之中斷處…

【Qt開發】按鈕類控件(三)-> QCheckBox

目錄 1 -> 概述 2 -> 核心特性 2.1 -> 狀態管理 2.2 -> 信號機制 2.3 -> 外觀與文本 3 -> 應用場景 4 -> 代碼示例 5 -> 總結 1 -> 概述 QCheckBox 是 Qt 框架中提供的一個基礎控件&#xff0c;用于實現復選框功能。它允許用戶在兩種或三種…

在新發布的AI論文中 pytorch 和tensorflow 的使用比例

根據 2025 年最新的學術動態和行業報告&#xff0c;PyTorch 在 AI 論文中的使用比例已占據絕對主導地位&#xff0c;而 TensorFlow 的占比持續下降。以下是基于多個權威來源的綜合分析&#xff1a; 一、頂級會議中的框架分布 在 NeurIPS、ICML、CVPR 等頂級學術會議中&#xff…

3DXML格式是什么?用什么軟件可以打開?

3DXML 是一種開放標準的數據交換格式&#xff0c;主要用于三維 CAD&#xff08;計算機輔助設計&#xff09;模型的存儲和交換。它是由 Dassault Systmes 開發的一種文件格式&#xff0c;常用于 CATIA V6 和其他支持該格式的應用程序中。3DXML 文件可以包含完整的 3D 模型數據&a…

9月8日星期一今日早報簡報微語報早讀

9月8日星期一&#xff0c;農歷七月十七&#xff0c;早報#微語早讀。1、中國火箭與月亮同框&#xff0c;遙感四十號03組衛星發射成功&#xff1b;2、湖南郴州開發區改革&#xff1a;編制數由815名減至680名&#xff0c;精簡16.6%&#xff1b;3、水利部對廣東、廣西啟動洪水防御Ⅳ…

windows系統搭建MQTT服務器

1、MQTT 協議 MQTT協議&#xff1a;實現MQTT協議需要客戶端和服務器端通訊完成。 三種身份: 發布者(Publish)、代理(Broker)(服務器)、訂閱者(Subscribe)。 消息的發布者和訂閱者都是客戶端&#xff0c;消息代理是服務器&#xff0c;消息發布者可以同時是訂閱者。 MQTT&am…

從 GPT 到 LLaMA:解密 LLM 的核心架構——Decoder-Only 模型

&#x1f525;從 GPT 到 LLaMA&#xff1a;解密 LLM 的核心架構——Decoder-Only 模型 “為什么所有大模型&#xff08;LLM&#xff09;都長一個樣&#xff1f;” 因為它們都有一個共同的“基因”——Decoder-Only 架構。 在前面兩節中&#xff0c;我們學習了&#xff1a; BER…

Codeforces Round 1047 (Div. 3)

由于最近這三天的數學建模&#xff0c;讓我這個精力本來就不多的AI手更加力竭了&#xff0c;沒注意到昨晚的cf&#xff0c;所以今天來補題了。 比賽連接&#xff1a;比賽傳送門 A題&#xff1a; You are doing a research paper on the famous Collatz Conjecture. In your e…

C++經典的數據結構與算法之經典算法思想:貪心算法(Greedy)

貪心算法&#xff08;Greedy Algorithm&#xff09;&#xff1a;通過局部最優達成全局最優的決策策略 貪心算法是一種通過每次選擇局部最優解來期望全局最優解的算法思想。它不考慮未來的影響&#xff0c;僅根據當前信息做出最優選擇&#xff0c;適用于具有貪心選擇性質和最優子…

LangChain實戰(二十一):構建自動化AI客服系統

本文是《LangChain實戰課》系列的第二十一篇,將帶領您構建一個完整的自動化AI客服系統。通過結合對話記憶、工具調用和業務知識庫,我們將創建一個能夠處理復雜客戶查詢的智能客服解決方案。 前言 在現代商業環境中,客戶服務是企業成功的關鍵因素之一。傳統客服系統往往面臨…

一人公司智能管理系統概述

系統概述 項目結構 Al_Compny系統采用前后端分離的全棧架構&#xff0c;項目根目錄下包含兩個主要子目錄&#xff1a;Al_Compny_backend&#xff08;后端服務&#xff09;和Al_Compny_frontend&#xff08;前端應用&#xff09;。核心功能模塊 Al_Compny系統是一個面向"一…

OpenWrt | 在 PPP 撥號模式下啟用 IPv6 功能

文章目錄一、WAN 口配置二、LAN 口配置三、IPv6 測試本文將詳細介紹 將光貓的網絡模式改成橋接之后使用路由器撥號的上網方式的情況下&#xff0c;在 OpenWrt 上使用 PPP 撥號模式上網時&#xff0c;啟用 IPv6 功能的方法。 一、WAN 口配置 首先&#xff0c;我們需要在 網絡 …

Java如何實現一個安全的登錄功能?

安全登錄系統完整教程 &#x1f4cb; 目錄 項目概述技術棧安全特性項目結構核心組件詳解安全實現原理部署和運行安全最佳實踐常見問題解答進階擴展 &#x1f3af; 項目概述 這是一個基于Spring Boot和Spring Security的完整安全登錄系統&#xff0c;專為初學者設計&#xff…

星辰誕愿——生日快樂

前言 今天這篇博客并非技術文章&#xff0c;而是慶祝我可愛的妹妹18歲生日以及介紹我半年以來的學習經歷 祝生網站&#xff1a;星辰誕愿(用戶列表里第一位就是我妹妹&#xff0c;希望大家能獻上自己的祝福&#xff0c;能分享轉發更好&#xff0c;我在此感謝大家。如果使用手機&…

基于STM32單片機的智能糧倉溫濕度檢測藍牙手機APP設計

基于STM32單片機的智能糧倉溫濕度檢測藍牙手機APP設計 1 系統功能介紹 本系統是一款基于STM32單片機的智能糧倉環境監測與控制裝置&#xff0c;核心目標是通過傳感器實時采集糧倉內的溫度和濕度信息&#xff0c;并結合藍牙通信模塊將數據傳輸至手機端&#xff0c;實現對糧倉環境…

簡單視頻轉換器 avi轉mp4

直接上代碼package com.example.videoconverter;import ws.schild.jave.Encoder; import ws.schild.jave.EncoderException; import ws.schild.jave.MultimediaObject; import ws.schild.jave.encode.AudioAttributes; import ws.schild.jave.encode.EncodingAttributes; impor…

Kafka 與 RocketMQ 核心概念與架構對比

Kafka 與 RocketMQ 核心概念與架構對比DeepSeek生成&#xff0c;便于記憶大概邏輯核心概念對比圖 #mermaid-svg-dEbo1XpAjfzOjvUW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dEbo1XpAjfzOjvUW .error-icon{fill…

30分鐘深度壓測cuBLAS:從FP64到INT8全精度性能剖析

在深度學習和高性能計算領域&#xff0c;GPU的矩陣運算性能是衡量系統算力的核心指標之一。NVIDIA的cuBLAS庫作為CUDA平臺上最基礎的線性代數計算庫&#xff0c;其性能表現直接影響著上層應用的運行效率。本文將詳細介紹如何使用cublasmatmulbench工具對多GPU進行全面的性能基準…