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.mzph.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;服务器不会中断事务而该去执行其他客户端的命令请求。 就像下面这样&#…