長城杯鐵人三項初賽-REVERSE復現

前言

記錄記錄

1.LoginToMe

int __fastcall main(int argc, const char **argv, const char **envp)
{unsigned int v3; // eaxchar s[96]; // [rsp+10h] [rbp-70h] BYREFint v6; // [rsp+70h] [rbp-10h]int v7; // [rsp+78h] [rbp-8h]int i; // [rsp+7Ch] [rbp-4h]memset(s, 0, sizeof(s));v6 = 0;printf("input:");__isoc99_scanf("%s", s);if ( strlen(s) == 20 ){v3 = time(0LL);srand(v3);v7 = rand() % 100;for ( i = 0; i < v7; ++i );if ( *(unsigned __int16 *)s * *(unsigned __int16 *)&s[2] == 342772773&& *(unsigned __int16 *)s + *(unsigned __int16 *)&s[2] == 39526&& *(_DWORD *)&s[4] - *(_DWORD *)&s[8] == 1005712381&& *(unsigned __int16 *)&s[4] + *(unsigned __int16 *)&s[6] == 56269&& *(unsigned __int16 *)&s[8] - *(unsigned __int16 *)&s[10] == 15092&& s[4] * s[8] == 10710&& s[6] * s[10] == 12051&& s[7] + s[11] == 172&& *(unsigned __int16 *)&s[12] * *(unsigned __int16 *)&s[14] == 171593250&& *(unsigned __int16 *)&s[12] + *(unsigned __int16 *)&s[14] == 26219&& *(unsigned __int16 *)&s[16] * *(unsigned __int16 *)&s[18] == 376306868&& *(unsigned __int16 *)&s[16] + *(unsigned __int16 *)&s[18] == 40341 ){puts("check ok~!");}else{puts("check failed~!");}}return 1;
}

分析可知這是一個驗證程序輸入的問題,如果多輪程序輸入的與條件一樣則是會檢查正確,會進入該輪的下一輪,否則會輸出錯誤,逆向的話要對其爆破一個唯一解,這里可以用z3庫進行操作

import libnum
from z3 import *for i in (range(33, 128)):x = Solver()ans = []s = [BitVec(('%d' % i), 32) for i in range(5)]x.add(s[0] & 0xff == i)x.add((s[0] & 0xffff) * (s[0] >> 16) == 342772773, (s[0] & 0xffff) + (s[0] >> 16) == 39526, s[1] - s[2] == 1005712381, (s[1] & 0xffff) + (s[1] >> 16) == 56269, (s[2] & 0xffff) - (s[2] >> 16) == 15092, ((s[1]) & 0xff) * ((s[2]) & 0xff) == 10710, ((s[1] >> 16) & 0xff) * ((s[2] >> 16) & 0xff) == 12051, ((s[1]) >> 24) + ((s[2]) >> 24) == 172, (s[3] & 0xffff) * (s[3] >> 16) == 171593250, (s[3] & 0xffff) + (s[3] >> 16) == 26219, (s[4] & 0xffff) * (s[4] >> 16) == 376306868, (s[4] & 0xffff) + (s[4] >> 16) == 40341)if x.check() == sat:model = x.model()for j in s:print(libnum.n2s(model[j].as_long())[::-1].decode(), end='')print()

然后輸出就會爆出一個唯一解

由于比賽有環境,賽后沒有環境,所以這道題就這樣了

2.茶(tea)

主函數

int __fastcall main(int argc, const char **argv, const char **envp)
{char Str[64]; // [rsp+20h] [rbp-70h] BYREFchar v5[39]; // [rsp+60h] [rbp-30h]char v6[3]; // [rsp+87h] [rbp-9h] BYREFint i; // [rsp+8Ch] [rbp-4h]_main(argc, argv, envp);v5[0] = -119;v5[1] = -48;v5[2] = -121;v5[3] = 54;v5[4] = -55;v5[5] = 69;v5[6] = -39;v5[7] = -48;v5[8] = 113;v5[9] = 59;v5[10] = 54;v5[11] = -109;v5[12] = 24;v5[13] = -65;v5[14] = 1;v5[15] = 99;v5[16] = -87;v5[17] = 54;v5[18] = 126;v5[19] = -9;v5[20] = -1;v5[21] = 32;v5[22] = 25;v5[23] = -126;v5[24] = -51;v5[25] = 119;v5[26] = 123;v5[27] = -118;v5[28] = 18;v5[29] = 48;v5[30] = 34;v5[31] = 80;v5[32] = -106;v5[33] = -87;v5[34] = -53;v5[35] = 92;v5[36] = 43;v5[37] = 33;v5[38] = -109;qmemcpy(v6, "ta}", sizeof(v6));printf("plz input your flag:");scanf("%42s", Str);if ( strlen(Str) != 42 ){printf("wrong length");exit(0);}for ( i = 0; i <= 39; i += 8 )encrypt((unsigned int *)&Str[i], key);for ( i = 0; i <= 41; ++i ){if ( Str[i] != v5[i] ){printf("error");exit(0);}}printf("win");return 0;
}

加密流程

DWORD *__fastcall encrypt(unsigned int *a1, _DWORD *a2)
{_DWORD *result; // raxunsigned int i; // [rsp+20h] [rbp-10h]int v4; // [rsp+24h] [rbp-Ch]unsigned int v5; // [rsp+28h] [rbp-8h]unsigned int v6; // [rsp+2Ch] [rbp-4h]v6 = *a1;v5 = a1[1];v4 = 0;for ( i = 0; i <= 0x1F; ++i ){v4 -= 1640531527;v6 += (v5 + v4) ^ (*a2 + 16 * v5) ^ ((v5 >> 5) + a2[1]);v5 += (v6 + v4) ^ (a2[2] + 16 * v6) ^ ((v6 >> 5) + a2[3]);}*a1 = v6;result = a1 + 1;a1[1] = v5;return result;
}

key

0x78, 0x56, 0x34, 0x12, 0x0D, 0xF0, 0xAD, 0x0B, 0x14, 0x13, 
0x20, 0x05, 0x21, 0x43, 0x65, 0x87

腳本

#include <stdio.h>int main() {// Encrypted data blocks, each block is 8 bytes (two unsigned integers)unsigned int a1[] = {0x3687d089, 0xd0d945c9,0x93363b71, 0x6301bf18,0xf77e36a9, 0x821920ff,0x8a7b77cd, 0x50223012,0x5ccba996, 0x7493212b};// Key used for encryption/decryptionunsigned int a2[4] = { 0x12345678, 0x0BADF00D, 0x5201314, 0x87654321 };// Decrypt each block of datafor (int i = 0; i <= 9; i += 2) {int j = 0;unsigned int delta = 0xc6ef3720;unsigned int v5 = a1[i + 1];unsigned int v6 = a1[i];// Perform the decryption roundsdo {++j;v5 -= (v6 + delta) ^ (a2[2] + 16 * v6) ^ ((v6 >> 5) + a2[3]);v6 -= (v5 + delta) ^ (*a2 + 16 * v5) ^ ((v5 >> 5) + a2[1]);delta += 1640531527;} while (j <= 31);// Store the decrypted values back into the arraya1[i + 1] = v5;a1[i] = v6;}// Print the decrypted data as charactersfor (int i = 0; i <= 9; i++) {for (int j = 0; j <= 3; j++) {printf("%c", (a1[i] >> (j * 8)) & 0xFF);}}return 0;
}

輸出

flag{7b06c572-d317-49cf-8ff2-8e402e1ea53}

3.VM

加密是固定的單字節加密,動調程序獲取數據后進行簡單解密即可

#include <stdio.h>
#include <stdint.h>int main() {// Encrypted data arrayuint8_t codee[] = {0x05, 0x82, 0x02, 0x01,0x41, 0xA5, 0xE6, 0x00,0x2D, 0xA0, 0xDF, 0x00,0x16, 0xCB, 0x81, 0x00,0x8F, 0xBC, 0xA6, 0x00,0xF6, 0xC0, 0xA3, 0x00,0x6D, 0xB0, 0xD2, 0x00,0xA4, 0x9D, 0xE7, 0x00,0xB9, 0xD2, 0x7A, 0x00,0x7B, 0xB4, 0xB3, 0x00,0xF3, 0xCA, 0x8C, 0x00,0x4C, 0xC2, 0x87, 0x00,0xC7, 0xEE, 0x26, 0x00,0x53, 0x8B, 0x06, 0x01,0x41, 0x91, 0x0E, 0x01,0xA1, 0xB7, 0x9D, 0x00,0xD6, 0xD3, 0x77, 0x00,0x54, 0xAE, 0xCF, 0x00,0x2D, 0x99, 0xF6, 0x00,0xAE, 0xBA, 0xA9, 0x00,0x67, 0xA7, 0xD2, 0x00,0x31, 0xA6, 0xF2, 0x00,0xA1, 0xEE, 0x26, 0x00,0xE4, 0x87, 0x15, 0x01,0x4A, 0xF2, 0x1D, 0x00,0x82, 0xC3, 0xA3, 0x00,0x21, 0x90, 0x02, 0x01,0x4B, 0xB9, 0xB5, 0x00,0xA0, 0xCB, 0x6D, 0x00,0x7D, 0x86, 0x2E, 0x01,0x70, 0xA5, 0xEF, 0x00,0xE3, 0xC7, 0x85, 0x00,0xDB, 0xF0, 0x26, 0x00};// Process the encrypted data and print characters in reverse orderfor (int i = sizeof(codee) / sizeof(codee[0]) - 4; i >= 0; i -= 4) {uint16_t low_word = (codee[i + 1] << 8) | codee[i];uint16_t high_word = (codee[i + 3] << 8) | codee[i + 2];printf("%c", (0xffff ^ low_word) / high_word);}// Another set of data to be printed in reverse orderint aa[] = {125, 101, 110, 106, 105, 100, 97, 109, 96, 109, 98, 118, 122, 114, 105, 119,96, 101, 107, 106, 108, 95, 123, 111, 129, 96, 111, 101, 124, 103, 97, 109, 108};printf("\n\n\n");  // Print three newlines// Print the reversed data from 'aa'for (int i = 0; i < sizeof(aa) / sizeof(aa[0]); ++i) {printf("%c ", aa[sizeof(aa) / sizeof(aa[0]) - i - 1]);}// Print additional characters based on bitwise operationsprintf("%c", (0xffff ^ 0xf0db) / 0x26);printf("%c", (0xffff ^ 0xc7e3) / 0x85);printf("%c", (0xffff ^ 0xa570) / 0xef);return 0;
}

輸出

flag{do_you_like_virtual_machine}

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

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

相關文章

DNS實驗

DNS原理 客戶端發起請求&#xff1a;客戶端向本地 DNS 服務器發送域名解析請求&#xff0c;這是流程的起始點。本地 DNS 服務器查詢根域名服務器&#xff1a;若本地 DNS 服務器緩存中無對應記錄&#xff0c;它向根域名服務器發起查詢&#xff0c;根域名服務器是 DNS 系統頂層&a…

SQLMesh 通知系統深度解析:構建自動化監控體系

SQLMesh 是一款強大的數據編排工具&#xff0c;其內置的靈活通知系統可顯著提升團隊協作效率。本文將系統解讀 SQLMesh 的通知機制&#xff0c;涵蓋配置方法、事件觸發邏輯及高級定制技巧。 一、通知系統的核心架構 1. 通知目標&#xff08;Notification Targets&#xff09; …

精益數據分析(20/126):解析經典數據分析框架,助力創業增長

精益數據分析&#xff08;20/126&#xff09;&#xff1a;解析經典數據分析框架&#xff0c;助力創業增長 在創業和數據分析的學習道路上&#xff0c;每一次深入探索都可能為我們帶來新的啟發。今天&#xff0c;依舊帶著和大家共同進步的想法&#xff0c;我們一起深入研讀《精…

【OSG學習筆記】Day 8: 紋理貼圖——賦予模型細節

在 OSG(Open Scene Graph)中,紋理貼圖是為模型添加細節的關鍵技術,主要涉及紋理加載、UV 映射和多重紋理疊加三部分。 基礎理論 紋理加載 紋理的作用,就是將2D圖像映射到3D模型表面,增強視覺細節。 紋理類型與格式支持: OSG 支持多種圖像格式,包括常見的 .jpg/.jpe…

基于事件驅動的云原生后端架構設計:從理念到落地

??個人主頁??:慌ZHANG-CSDN博客 ????期待您的關注 ???? 一、引言:微服務之后,事件驅動正在成為新范式 隨著業務復雜度的提升,傳統同步式微服務調用模式逐漸暴露出瓶頸:服務間耦合度高、并發能力有限、出錯鏈路復雜。而在互聯網業務、金融交易、物聯網等場景中…

vue3:十一、主頁面布局(修改頂部導航欄樣式-右側:用戶信息+退出登錄+全屏顯示)

一、效果 完成效果,增加頂部導航欄,右側用戶信息(其中個人中心需要后續進行頁面開發,這里只寫了退出登錄功能),以及全屏功能 二、搭建并引入右側組件 將右側內容封裝到單獨的組件,直接引入(像左側導航條等內容也是可以做成這種形式) 1、新建右側組件的頁面 在layout中…

沁恒CHV203中斷嵌套導致修改線程棧-韋東山

調試專題bug實例 2025年01月09日20點場 處理辦法1&#xff1a;就是關閉中斷嵌套 處理辦法2&#xff1a; 使用原來的棧

Qt本地化 - installTranslator不生效

bool QCoreApplication::installTranslator(QTranslator *translationFile)注意這里輸入的是QTranslator對象指針&#xff0c;如果QTranslator是局部變量&#xff0c;一旦離開其作用域就會導致翻譯失效 錯誤代碼示范&#xff1a; void ApplyTranslator(const QString& qmf…

Qt UDP組播實現與調試指南

在Qt中使用UDP組播(Multicast)可以實現高效的一對多網絡通信。以下是關鍵步驟和示例代碼: 一、UDP組播核心機制 組播地址:使用D類地址(224.0.0.0 - 239.255.255.255)TTL設置:控制數據包傳播范圍(默認1,同一網段)網絡接口:指定發送/接收的物理接口二、發送端實現 /…

PCB封裝主要組成元素

PCB&#xff08;Printed Circuit Board&#xff0c;印刷電路板&#xff09;封裝是指將電子元件固定在 PCB 上&#xff0c;并實現電氣連接的方式。主要包括以下幾類。 1. 焊盤&#xff08;Pad&#xff09; 作用&#xff1a;焊盤是 PCB 封裝中最重要的元素之一&#xff0c;它是…

前端基礎之《Vue(8)—內置組件》

一、Vue2.0中的內置組件 1、<slot> 插槽 2、<keep-alive> 動態組件 被keep-alive所包裹的組件&#xff1a; &#xff08;1&#xff09;不會被銷毀。 &#xff08;2&#xff09;還會多兩個生命周期鉤子&#xff1a;activated()、deactivated()。 &#xff08;3&a…

某大型電解鋁廠電解系統諧波治理裝置改造沃倫森電氣

電解鋁行業諧波治理解決方案——無源濾波裝置優化升級&#xff0c;保障穩定運行 在電解鋁生產過程中&#xff0c;諧波污染問題嚴重影響電網電能質量&#xff0c;甚至可能導致濾波裝置損壞&#xff0c;引發群爆事故。河南登封某大型電解鋁廠通過無源濾波裝置智能化改造&#xff…

在 Ubuntu 環境為 Elasticsearch 引入 `icu_tokenizer

1. 為什么需要 ICU 分析插件 Elasticsearch 默認的 standard tokenizer 遵循 UAX #29 規則&#xff0c;但在 CJK&#xff08;中、日、韓&#xff09;等亞洲語言上僅能按字符切分&#xff0c;無法識別詞邊界&#xff1b;對包含重音符號、大小寫或多腳本混排的文本也缺乏統一歸一…

避免事件“穿透”——Vue 中事件冒泡的理解與解決方案

一、事件冒泡是什么&#xff1f; 事件冒泡指的是&#xff1a;當某個元素上的事件被觸發后&#xff0c;事件會從該元素向其父級、祖先元素一直“冒泡”傳遞&#xff0c;直到 document。這意味著&#xff0c;如果父元素綁定了點擊事件&#xff0c;子元素觸發點擊時也可能順帶觸發…

【Java面試筆記:進階】17.一個線程兩次調用start()方法會出現什么情況?

1. 線程啟動與異常 線程啟動:Java 線程只能啟動一次,通過調用 Thread 對象的 start() 方法。多次啟動的后果:如果嘗試第二次調用 start() 方法,會拋出 IllegalThreadStateException 運行時異常。(1) 代碼示例 public class ThreadStartDemo {public static void main(Stri…

Flask + ajax上傳文件(一)

一、概述 本教程將教你如何使用Flask后端和AJAX前端實現文件上傳功能,包含完整的代碼實現和詳細解釋。 二、環境準備 1. 所需工具和庫 Python 3.xFlask框架jQuery庫Bootstrap(可選,用于美化界面)2. 安裝Flask pip install flask三、項目結構 upload_project/ ├── a…

NHANES指標推薦:TyG-WHtR

文章題目&#xff1a;Can cardiovascular health and its modifiable healthy lifestyle offset the increased risk of all-cause and cardiovascular deaths associated with insulin resistance? DOI&#xff1a;10.1186/s12933-025-02674-z 中文標題&#xff1a;心血管健康…

OpenHarmony 開源鴻蒙北向開發——hdc工具使用及常用命令(持續更新)

hdc&#xff08;OpenHarmony Device Connector&#xff09;是為開發人員提供的用于設備連接調試的命令行工具&#xff0c;該工具需支持部署在 Windows/Linux/Mac 等系統上與 OpenHarmony 設備&#xff08;或模擬器&#xff09;進行連接調試通信。簡單來講&#xff0c;hdc 是 Op…

MCP servers源碼詳細解析

MCP servers詳細解析 Model Context Protocol (MCP) 是一個標準化協議&#xff0c;用于讓大型語言模型&#xff08;LLMs&#xff09;通過結構化服務器安全地與工具和數據源交互。項目提供了 參考實現、官方集成和社區貢獻的服務器&#xff0c;支持數據庫、API、文件系統等場景…

美樂迪電玩大廳加載機制與 RoomList 配置結構分析

本篇為《美樂迪電玩全套系統搭建》系列的第三篇&#xff0c;聚焦大廳與子游戲的動態加載機制&#xff0c;深入解析 roomlist.json 的數據結構、解析流程、入口配置方式與自定義接入擴展技巧。通過本篇內容&#xff0c;開發者可實現自由控制子游戲接入與分發策略。 一、RoomList…