SHCTF-REVERSE

前言

之前寫的,一直沒發,留個記錄吧,萬一哪天記錄掉了起碼在csdn有個念想

1.ezapk

反編譯

快速定位關鍵函數

package com.mycheck.ezjv;import adrt.ADRTLogCatReader;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.nio.charset.StandardCharsets;
import java.util.Base64;/* loaded from: classes.dex */
public class MainActivity extends Activity {byte[] key = {(byte) 12, (byte) 15, (byte) 25, (byte) 30, (byte) 36};@Override // android.app.Activityprotected void onCreate(Bundle bundle) {ADRTLogCatReader.onContext(this, "com.aide.ui.mgai");super.onCreate(bundle);setContentView(R.layout.activity_main);Check(this);}public static String Encode(String str, byte[] bArr) {StringBuilder sb = new StringBuilder();for (int i = 0; i < str.length(); i++) {sb.append((char) (((char) (((char) (str.charAt(i) ^ bArr[i % bArr.length])) + 6)) * 2));}return Base64.getEncoder().encodeToString(sb.toString().getBytes(StandardCharsets.UTF_8));}public void Check(Context context) {((Button) findViewById(R.id.Button1)).setOnClickListener(new View.OnClickListener(this, (EditText) findViewById(R.id.test1), context) { // from class: com.mycheck.ezjv.MainActivity.100000000private final MainActivity this$0;private final Context val$context;private final EditText val$myedit;{this.this$0 = this;this.val$myedit = r9;this.val$context = context;}@Override // android.view.View.OnClickListenerpublic void onClick(View view) {if (!MainActivity.Encode(this.val$myedit.getText().toString(), this.this$0.key).equals("woLDgMOgw7hEwoJQw7zDtsKow7TDpMOMZMOow75QxIbDnsKmw6Z4UMK0w7rCklDCrMKqwqbDtMOOw6DDsg==")) {Toast.makeText(this.val$context, "Wrong! Try again~", 1).show();} else {Toast.makeText(this.val$context, "You Win!!", 1).show();}}});}
}

解密邏輯

  1. 字符串中的每個字符與一個循環使用的字節數組進行異或(XOR)操作。
  2. 對得到的結果加6。
  3. 將結果乘以2。
  4. 最后使用Base64編碼。

解密腳本

import base64# 加密時使用的密鑰
key = [12, 15, 25, 30, 36]def decode(encoded_str, key):# Base64 解碼decoded_bytes = base64.b64decode(encoded_str)decoded_str = decoded_bytes.decode('utf-8')# 解密過程result = []for i in range(len(decoded_str)):ch = ord(decoded_str[i])ch = chr((ch // 2) - 6)ch = chr(ord(ch) ^ key[i % len(key)])result.append(ch)return ''.join(result)if __name__ == "__main__":encoded_str = "woLDgMOgw7hEwoJQw7zDtsKow7TDpMOMZMOow75QxIbDnsKmw6Z4UMK0w7rCklDCrMKqwqbDtMOOw6DDsg=="print("Decoded string:", decode(encoded_str, key))

7Ush87-akjxcy2Ju-dwia9;JSO-IQixnsm

驗證一下

SHCTF{7Ush87-akjxcy2Ju-dwia9;JSO-IQixnsm}

2.rc4

看看sub_1200,再看看sub_12e2函數

很明顯這是一個RC4

加密這里又異或了個0x66,這是魔改的一部分

寫出解密腳本

def swap_bytes(a, b):return b, adef sub_1200(key, sbox_size=256):"""Initialize the S-box using the key."""sbox = list(range(sbox_size))j = 0for i in range(sbox_size):j = (j + sbox[i] + key[i % len(key)]) % sbox_sizesbox[i], sbox[j] = swap_bytes(sbox[i], sbox[j])return sboxdef decrypt(encrypted_data, sbox):"""Decrypt the data using the initialized S-box."""i, j = 0, 0decrypted_data = bytearray(len(encrypted_data))for k in range(len(encrypted_data)):i = (i + 1) % 256j = (j + sbox[i]) % 256sbox[i], sbox[j] = swap_bytes(sbox[i], sbox[j])temp = sbox[(sbox[i] + sbox[j]) % 256]decrypted_data[k] = encrypted_data[k] ^ temp ^ 0x66return decrypted_datadef main():# 加密后的 flag 數據 (從 v4 數組中獲取)encrypted_flag = [0x5B3C8F65423FAB21,0x691AE7846E05170C,0x111F7077C3]# 將加密后的 flag 轉換為字節數組encrypted_data = bytearray()for value in encrypted_flag:encrypted_data.extend(value.to_bytes(8, byteorder='little'))# 密鑰 (從 v5 數組中獲取)key = [0x212179654B6E6546]# 將密鑰轉換為字節數組key_bytes = bytearray()for value in key:key_bytes.extend(value.to_bytes(8, byteorder='little'))# 初始化 S-boxsbox = sub_1200(key_bytes)# 解密 flagdecrypted_flag = decrypt(encrypted_data, sbox)# 打印解密后的 flagprint("Decrypted Flag: ", end="")for byte in decrypted_flag:if 32 <= byte <= 126:  # Printable charactersprint(chr(byte), end="")else:print(f"\\x{byte:02x}", end="")print()if __name__ == "__main__":main()

輸出一下

SHCTF{rc4_nice_ez!!!}

3.ezxor

查殼,發現無殼

拖進ida64位中,快速定位主函數

data = [-61, 105, 114, -60, 103, 74, -24, 17, 67, -49, 111, 0, -13, 68, 110, -8, 89, 73, -24, 78, 94, -30, 83, 67, -79, 92]

圖中的數據提取出來

圖中的解密邏輯

根據這個寫出解密腳本

def decrypt_data():# 初始數據數組,根據提供的數據填充data = [-61, 105, 114, -60, 103, 74, -24, 17, 67, -49, 111, 0, -13, 68, 110, -8, 89, 73, -24, 78, 94, -30, 83, 67, -79, 92]# 逆向執行異或操作for i in range(26):mod_val = i % 3if mod_val == 1:data[i] ^= 0x21elif mod_val == 2:data[i] ^= 0x31else:data[i] ^= 0x90# 將解密后的字節轉換為可讀字符串decrypted_str = ''.join([chr(b if b >= 0 else b + 256) for b in data])print("Decrypted string:", decrypted_str)if __name__ == "__main__":decrypt_data()

SHCTF{x0r_N1ce_hxxxoorrr!}

4.gamegame

查殼,發現無殼,丟進ida64中,且發現是數獨

模擬寫出數獨腳本

def is_safe(grid, row, col, num):"""Check if it's safe to place the number in the given position."""# Check the rowfor x in range(9):if grid[row][x] == num:return False# Check the columnfor x in range(9):if grid[x][col] == num:return False# Check the 3x3 subgridstart_row = row - row % 3start_col = col - col % 3for i in range(3):for j in range(3):if grid[i + start_row][j + start_col] == num:return Falsereturn Truedef print_grid(grid):"""Print the Sudoku grid."""for row in grid:print(" ".join(str(num) if num != 0 else '.' for num in row))def is_valid_sudoku(grid):"""Check if the Sudoku grid is valid."""for i in range(9):row_set = set()col_set = set()box_set = set()for j in range(9):if grid[i][j] != 0:if grid[i][j] in row_set:return Falserow_set.add(grid[i][j])if grid[j][i] != 0:if grid[j][i] in col_set:return Falsecol_set.add(grid[j][i])box_row = 3 * (i // 3)box_col = 3 * (i % 3)num = grid[box_row + j // 3][box_col + j % 3]if num != 0:if num in box_set:return Falsebox_set.add(num)return Truedef main():# Initialize an empty 9x9 Sudoku gridgrid = [[0 for _ in range(9)] for _ in range(9)]# Simulate user input of 51 numbersinputs = [5, 3, 4, 6, 7, 8, 9, 1, 2, 6, 7, 2, 1, 9, 5, 3, 4, 8, 1, 9, 8, 3, 4, 2, 5, 6, 7,8, 5, 9, 7, 6, 1, 4, 2, 3, 4, 2, 6, 8, 5, 3, 7, 9, 1, 7, 1, 3, 9, 2, 4, 8, 5, 6,9, 6, 1, 5, 3, 7, 2, 8, 4, 2, 8, 7, 4, 1, 9, 6, 3, 5, 3, 4, 5, 2, 8, 6, 1, 7, 9]v8 = 0while v8 < len(inputs):num = inputs[v8]placed = Falsefor i in range(9):for j in range(9):if grid[i][j] == 0:if is_safe(grid, i, j, num):grid[i][j] = numplaced = Truebreakif placed:breakif not placed:print("no")breakv8 += 1print(f"Placed {num} at position {v8}")print_grid(grid)if is_valid_sudoku(grid):print("yes,\nflag is your input")else:print("no")if __name__ == "__main__":main()

另外一個腳本

import copynon_puzzle = [[5, 3, 0, 0, 7, 0, 0, 0, 0],[6, 0, 0, 1, 9, 5, 0, 0, 0],[0, 9, 8, 0, 0, 0, 0, 6, 0],[8, 0, 0, 0, 6, 0, 0, 0, 3],[4, 0, 0, 8, 0, 3, 0, 0, 1],[7, 0, 0, 0, 2, 0, 0, 0, 6],[0, 6, 0, 0, 0, 0, 2, 8, 0],[0, 0, 0, 4, 1, 9, 0, 0, 5],[0, 0, 0, 0, 8, 0, 0, 7, 9]
]puzzle = copy.deepcopy(non_puzzle)def is_valid_move(puzzle, row, col, num):if num in puzzle[row]:return Falseif num in [puzzle[r][col] for r in range(9)]:return Falsestart_row, start_col = 3 * (row // 3), 3 * (col // 3)for i in range(3):for j in range(3):if puzzle[start_row + i][start_col + j] == num:return Falsereturn Truedef solve_sudoku(puzzle):for row in range(9):for col in range(9):if puzzle[row][col] == 0:for num in range(1, 10):if is_valid_move(puzzle, row, col, num):puzzle[row][col] = numif solve_sudoku(puzzle):return Truepuzzle[row][col] = 0return Falsereturn Truesolve_sudoku(puzzle)for i in range(len(non_puzzle)):for j in range(len(non_puzzle[i])):if non_puzzle[i][j] == 0:print(puzzle[i][j],end="")

然后我們輸出我們剛剛打印的

468912723481342575971422657913948591537428763345261

468912723481342575971422657913948591537428763345261

shctf{468912723481342575971422657913948591537428763345261}

5.babytea

進入主函數

點進去函數

被魔改了一部分的XTEA算法

IDA字符串搜索找到主函數

密鑰和密文都很明顯。XTEA算法

下面對照給出解密腳本

#include <stdio.h>
#include <stdint.h>void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {unsigned int i;uint32_t v0=v[0], v1=v[1], delta=0x61C88747, sum=delta*num_rounds+0x8DDE2E40;for (i=0; i < num_rounds; i++) {   v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]) ^ v1;sum -= delta;v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]) ^ v0;}v[0]=v0; v[1]=v1;
}
int main()
{uint32_t enflag[] = {0x18C2E339, 0xE9550982, 0x108A30F7, 0x018430DD, 0xD5DE57B0, 0xD43E0740, 0xF42FDDE4, 0x968886E8,0xE5D77B79,0x685D758F};uint32_t key[4] = {1,1,2,3};for(int i=0;i<10;i+=2){uint32_t temp[2];        temp[0] = enflag[i];temp[1] = enflag[i+1];decipher(64,temp,key);printf("%c%c%c%c%c%c%c%c",*((char*)&temp[0]+0),*((char*)&temp[0]+1),*((char*)&temp[0]+2),*((char*)&temp[0]+3),*((char*)&temp[1]+0),*((char*)&temp[1]+1),*((char*)&temp[1]+2),*((char*)&temp[1]+3));}return 0;
}

delta=0x61C88747, sum=delta*num_rounds+0x8DDE2E40;

這是魔改的

shctf{962fd-464d-8f4f-f1fd-a6a0c987c569}

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

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

相關文章

安卓觸摸事件分發機制分析

1. 前言 &#x1f3af; 一句話總結&#xff1a; 觸摸事件&#xff08;TouchEvent&#xff09;會從 Activity 層開始&#xff0c;按從外到內的方式傳遞給每一個 ViewGroup/View&#xff0c;直到某個 View 消費&#xff08;consume&#xff09; 它&#xff0c;事件傳遞就會停止…

Spring MVC 多個攔截器的執行順序

一、流程總覽 該流程圖描述了一個多層攔截器鏈的業務處理流程&#xff0c;核心邏輯為&#xff1a; 前置攔截&#xff1a;通過 predHandler1 和 predHandler2 逐層校驗請求合法性。核心處理&#xff1a;通過校驗后執行核心業務邏輯 handler()。后置處理與清理&#xff1a;按反…

django filter 排除字段

在Django中&#xff0c;當你使用filter查詢集&#xff08;QuerySet&#xff09;時&#xff0c;通常你會根據模型的字段來過濾數據。但是&#xff0c;有時你可能想要排除某些特定的字段&#xff0c;而不是過濾這些字段。這里有幾種方法可以實現這一點&#xff1a; 使用exclude方…

ByeCode,AI無代碼開發平臺,拖拽式操作構建應用

ByeCode是什么 ByeCode 是一款先進的 AI 無代碼平臺&#xff0c;旨在幫助企業迅速創建數字名片、網站、小程序、應用程序及內部管理系統&#xff0c;無需繁雜的編碼或開發工作。ByeCode 采用直觀的可視化界面和拖拽式操作&#xff0c;使得非技術用戶能夠輕松上手。同時&#x…

AI日報 - 2025年04月28日

&#x1f31f; 今日概覽(60秒速覽) ▎&#x1f916; 能力進展 | Gemini 2.5 Pro成功挑戰《口袋妖怪紅》8道館&#xff1b;AI推理器具備自我糾錯能力&#xff1b;LLM在游戲、多模態理解、代碼遷移等方面展現新能力。 ▎&#x1f4bc; 商業動向 | Google回應DOJ反壟斷案&#xff…

在Java中實現List按自定義順序排序的幾種方案

在Java中實現List按自定義順序排序的幾種方案 在實際開發中&#xff0c;我們經常需要對集合中的對象按照特定字段進行排序。當排序規則不是簡單的字母或數字順序&#xff0c;而是自定義的順序時&#xff0c;我們需要采用特殊的方法。本文將以一個List<Person>按省份特定…

微服務架構在云原生后端的深度融合與實踐路徑

??個人主頁??:一ge科研小菜雞-CSDN博客 ????期待您的關注 ???? 一、引言:后端架構的演變,走向云原生與微服務融合 過去十余年,后端架構經歷了從單體應用(Monolithic)、垂直切分(Modularization)、到微服務(Microservices)的演進,每一次變化都是為了解決…

Python中的Walrus運算符分析

Python中的Walrus運算符&#xff08;:&#xff09;是Python 3.8引入的一個新特性&#xff0c;允許在表達式中同時賦值和返回值。它的核心作用是減少重復計算&#xff0c;提升代碼簡潔性。以下是其適用的典型場景及示例&#xff1a; 1. 在循環中避免重復計算 當循環條件需要多次…

用Node.js施展文檔比對魔法:輕松實現Word文檔差異比較小工具,實現Word差異高亮標注(附完整實戰代碼)

引言&#xff1a;當「找不同」遇上程序員的智慧 你是否經歷過這樣的場景&#xff1f; 法務同事發來合同第8版修改版&#xff0c;卻說不清改了哪里 導師在論文修改稿里標注了十幾處調整&#xff0c;需要逐一核對 團隊協作文檔頻繁更新&#xff0c;版本差異讓人眼花繚亂 傳統…

前端瀏覽器窗口交互完全指南:從基礎操作到高級控制

瀏覽器窗口交互是前端開發中構建復雜Web應用的核心能力&#xff0c;本文深入探討23種關鍵交互技術&#xff0c;涵蓋從傳統API到最新的W3C提案&#xff0c;助您掌握跨窗口、跨標簽頁的完整控制方案。 一、基礎窗口操作體系 1.1 窗口創建與控制 // 新窗口創建&#xff08;現代瀏…

Git和Gitlab的部署和操作

一。GIT的基本操作 1.GIT的操作和查看內容 [rootmaster ~]# yum install git -y [rootmaster ~]# git config --list&#xff1a;查看所有配置 2.GIT倉庫初始化 [rootmaster ~]# mkdir /gittest&#xff1a;創建目錄 [rootmaster ~]# cd /gittest/&#xff1a;進入目錄 [rootm…

Linux中線程池的簡單實現 -- 線程安全的日志模塊,策略模式,線程池的封裝設計,單例模式,餓漢式單例模式,懶漢式單例模式

目錄 1. 對線程池的理解 1.1 基本概念 1.2 工作原理 1.3 線程池的優點 2. 日志與策略模式 2.1 日志認識 2.2 策略模式 2.2.1 策略模式的概念 2.2.2 工作原理 2.2 自定義日志系統的實現 3. 線程池設計 3.1 簡單線程池的設計 3.2 線程安全的單例模式線程池的設計 3…

量子力學:量子通信

量子通信是利用量子力學原理對信息進行編碼、傳輸和處理的新型通信方式&#xff0c;以下是其詳細介紹及業界發展現狀&#xff1a; 基本原理 量子疊加態 &#xff1a;量子系統可以處于多個狀態的疊加&#xff0c;如光子的偏振方向可以同時處于水平和垂直方向的疊加態&#xff…

企業架構之旅(1):TOGAF 基礎入門

大家好&#xff0c;我是沛哥兒。今天我們簡單聊下TOGAF哈。 文章目錄 一、TOGAF 是什么定義與核心定位發展歷程與行業地位與其他架構框架的區別 二、TOGAF 核心價值企業數字化轉型助力業務與 IT 的協同作用降本增效與風險管控 三、TOGAF 基礎術語解析架構域&#xff08;業務、…

CSS 內容超出顯示省略號

CSS 內容超出顯示省略號 文章目錄 CSS 內容超出顯示省略號**1. 單行文本省略&#xff08;常用&#xff09;****2. 多行文本省略&#xff08;如 2 行&#xff09;****3. 對非塊級元素生效****完整示例****注意事項** 在 CSS 中實現內容超出顯示省略號&#xff0c;主要通過控制文…

路由器重分發(OSPF+RIP),RIP充當翻譯官,OSPF充當翻譯官

路由器重分發&#xff08;OSPFRIP&#xff09; 版本 1 RIP充當翻譯官 OSPF路由器只會OSPF語言&#xff1b;RIP路由器充當翻譯官就要會OSPF語言和RIP語言&#xff1b;則在RIP中還需要將OSPF翻譯成RIPOSPF 把RIP路由器當成翻譯官&#xff0c;OSPF路由器就只需要宣告自己的ip&am…

AlexNet網絡搭建

AlexNet網絡模型搭建 環境準備 首先在某個盤符下創建一個文件夾&#xff0c;就叫AlexNet吧&#xff0c;用來存放源代碼。 然后新建一個python文件&#xff0c;就叫plot.py吧&#xff0c;往里面寫入以下代碼&#xff0c;用于下載數據集&#xff1a; # FashionMNIST里面包含了…

【計算機網絡】網絡基礎概念

&#x1f4da; 博主的專欄 &#x1f427; Linux | &#x1f5a5;? C | &#x1f4ca; 數據結構 | &#x1f4a1;C 算法 | &#x1f152; C 語言 | &#x1f310; 計算機網絡 這是博主計算機網絡的第一篇文章&#xff0c;本文由于是基礎概念了解&#xff0c;引用了大…

在Spring Boot項目中實現Word轉PDF并預覽

在Spring Boot項目中實現Word轉PDF并進行前端網頁預覽&#xff0c;你可以使用Apache POI來讀取Word文件&#xff0c;iText或Apache PDFBox來生成PDF文件&#xff0c;然后通過Spring Boot控制器提供文件下載或預覽鏈接。以下是一個示例實現步驟和代碼&#xff1a; 1. 添加依賴 …

圖解 Redis 事務 ACID特性 |源碼解析|EXEC、WATCH、QUEUE

寫在前面 Redis 通過 MULTI、EXEC、WATCH 等命令來實現事務功能。Redis的事務是將多個命令請求打包&#xff0c;然后一次性、按照順序的執行多個命令的機制&#xff0c;并且在事務執行期間&#xff0c;服務器不會中斷事務而該去執行其他客戶端的命令請求。 就像下面這樣&#…