XY_RE复现(五)

一,给阿姨倒一杯卡布奇诺

是一道魔改TEA加密

给出了一些初始化,然后输入的flag拆分,两两一组,通过for循环放入encrypt加密函数

#include <stdio.h>
#define uint32_t unsigned intvoid decrypt(uint32_t *v, uint32_t *key)
{static uint32_t data1 = 0x5F797274;static uint32_t data2 = 0x64726168;int i;   // [rsp+20h] [rbp-10h]uint32_t sum; // [rsp+24h] [rbp-Ch]uint32_t v1;  // [rsp+28h] [rbp-8h]uint32_t v0;  // [rsp+2Ch] [rbp-4h]sum = 0x6E75316C * 32;uint32_t data1_tmp = v[0];uint32_t data2_tmp = v[1];v0 = v[0];v1 = v[1];for (i = 31; i >= 0; i--){v1 -= ((v0 >> 5) + key[3]) ^ (v0 + sum) ^ (key[2] + 16 * v0) ^ (sum + i);v0 -= ((v1 >> 5) + key[1]) ^ (v1 + sum) ^ (key[0] + 16 * v1) ^ (sum + i);sum -= 0x6E75316C;}v[0] = v0 ^ data1;v[1] = v1 ^ data2;data1 = data1_tmp;data2 = data2_tmp;
}int main()
{uint32_t key[4];   // [rsp+60h] [rbp-40h] BYREFuint32_t array[8]; // [rsp+70h] [rbp-30h]array[0] = 0x9B28ED45;array[1] = 0x145EC6E9;array[2] = 0x5B27A6C3;array[3] = 0xE59E75D5;array[4] = 0xE82C2500;array[5] = 0xA4211D92;array[6] = 0xCD8A4B62;array[7] = 0xA668F440;key[0] = 0x65766967;key[1] = 0x756F795F;key[2] = 0x7075635F;key[3] = 0x6165745F;for (int i = 0; i <= 7; i += 2){decrypt(array + i, key);}for(int i=0; i<32; i++){printf("%c", ((char*)array)[i]);}return 0;
}// 133bffe401d223a02385d90c5f1ca377

二,ez_rand

int __cdecl main(int argc, const char **argv, const char **envp)
{unsigned __int64 v3; // rbx ,无符号64位整数型unsigned __int16 v4; // ax  , 无符号16位整数型int v5; // edi__int64 v6; // rsiint v7; // eaxint v9[7]; // [rsp+20h] [rbp-50h]char v10; // [rsp+3Ch] [rbp-34h]__int16 v11; // [rsp+3Dh] [rbp-33h]__int128 v12; // [rsp+40h] [rbp-30h]__int64 v13; // [rsp+50h] [rbp-20h]int v14; // [rsp+58h] [rbp-18h]__int16 v15; // [rsp+5Ch] [rbp-14h]char v16; // [rsp+5Eh] [rbp-12h]v13 = 0i64;v12 = 0i64;v14 = 0;v15 = 0;v16 = 0;print((char *)&Format);scanf("%s");v9[0] = -362017699;v11 = 0;v3 = -1i64;v9[1] = 888936774;v9[2] = 119759538;v9[3] = -76668318;v9[4] = -1443698508;v9[5] = -2044652911;v9[6] = 1139379931;v10 = 77;do++v3;while ( *((_BYTE *)&v12 + v3) );v4 = time64(0i64);srand(v4);v5 = 0;if ( v3 ){v6 = 0i64;do{v7 = rand();if ( (*((_BYTE *)&v12 + v6) ^ (unsigned __int8)(v7+ ((((unsigned __int64)(2155905153i64 * v7) >> 32) & 0x80000000) != 0i64)+ ((int)((unsigned __int64)(2155905153i64 * v7) >> 32) >> 7))) != *((_BYTE *)v9 + v6) ){print("Error???\n");exit(0);}++v5;++v6;}while ( v5 < v3 );}print("Right???\n");system("pause");return 0;
}

就是随机数v7与v9异或

随机数种子是通过time来取的,C语言中的srand(time)是伪随机,直接爆破,题目描述给出了flag头为"XYCTF",根据这个信息去爆破随机数种子,即我们将v9的前5位与生成的前五位随机数做异或,如果结果与“XYCTF”相同,则那个随机数种子就是我们需要求的结果 

#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{unsigned char str[5] = { 0x5D, 0x0C, 0x6C, 0xEA, 0x46 };unsigned char random[6] = { 0 };unsigned char flag[6] = { 'X', 'Y', 'C', 'T', 'F', '\0' };for (int i = 0xFFFF; i >= 0; i--) {srand(i);for (int j = 0; j < 5; j++) {random[j] = rand() % 0xFF;}bool found = true;for (int j = 0; j < 5; j++) {if ((random[j] ^ str[j]) != flag[j]) {found = false;break;}}if (found) {cout << "Found! It is: " << i << endl;break;}elsecout << "Not " << i << " Nope" << endl;}return 0;
}
//Found! It is: 21308

 爆破出随机数种子:21308

#include<iostream>
#include<cstdlib>
using namespace std;int main()
{srand(21308);for (int i = 0; i < 29; i++) {int num = rand();cout << num << ",";}return 0;
}
//得到随机数4085,19210,5147,22630,16830,25853,6039,15416,9400,1281,32764,16374,8177,18485,16126,29528,5590,4777,18044,26256,25694,24259,10836,5327,13701,7138,5244,22538,13308,

 

随机数是16位的: 可以int num = rand() % 0xFF ;

得到:16位key

v9=[ 0x5D, 0x0C, 0x6C, 0xEA, 0x46, 0x19, 0xFC, 0x34, 0xB2, 0x62,0x23, 0x07, 0x62, 0x22, 0x6E, 0xFB, 0xB4, 0xE8, 0xF2, 0xA9,0x91, 0x12, 0x21, 0x86, 0xDB, 0x8E, 0xE9, 0x43, 0x4D]
key=[5,85,47,190,0,98,174,116,220,6,124,54,17,125,61,203,235,187,194,246,194,34,126,227,186,253,144,98,48]
flag=''
for i in range(len(v9)):flag+=chr(v9[i]^key[i])
print(flag)
#XYCTF{R@nd_1s_S0_S0_S0_easy!}

为什么就是v12^v7!=v9(?)

三,ez_cube

__int64 sub_140012930()
{int i; // [rsp+44h] [rbp+24h]char v2; // [rsp+64h] [rbp+44h]int v3; // [rsp+84h] [rbp+64h]sub_140011384(&unk_1400240A2);for ( i = 0; i < 9; ++i ){top[i] = &unk_14001CC24;                    // redunder[i] = "Blue";right[i] = "Green";left[i] = "Orange";advance[i] = "Yellow";below[i] = "White";}under[1] = &unk_14001CC24;top[1] = "Green";right[1] = "Blue";while ( 1 ){dov2 = getchar();while ( v2 == 10 );switch ( v2 ){case 'R':sub_140011375();break;case 'U':sub_1400113BB();break;case 'r':sub_140011366();break;case 'u':sub_14001115E();break;}++dword_14001F1C0;v3 = j_check();if ( v3 == 1 )break;if ( v3 == 2 )goto LABEL_19;}print(aGreatYouAreAGo);
LABEL_19:system("pause");return 0i64;
}

'R' 'U' 'r' 'u'操作每一步

_QWORD *sub_1400117F0()
{_QWORD *result; // rax__int64 v1; // [rsp+28h] [rbp+8h]__int64 v2; // [rsp+48h] [rbp+28h]__int64 v3; // [rsp+68h] [rbp+48h]__int64 v4; // [rsp+88h] [rbp+68h]__int64 v5; // [rsp+A8h] [rbp+88h]sub_140011384(&unk_1400240A2);v1 = top[2];v2 = top[5];v3 = top[8];top[2] = below[2];top[5] = below[5];top[8] = below[8];below[2] = left[6];below[5] = left[3];below[8] = left[0];left[0] = advance[8];left[3] = advance[5];left[6] = advance[2];advance[2] = v1;advance[5] = v2;advance[8] = v3;v4 = right[1];right[1] = right[3];right[3] = right[7];right[7] = right[5];right[5] = v4;v5 = right[0];right[0] = right[6];right[6] = right[8];right[8] = right[2];result = right;right[2] = v5;return result;
}

嗯,自己玩分析可能有点麻烦,想想应该可以直接写脚本。(自己用c++写了一下,不知道怎么搞四个字符操作那里,有点麻烦)先借一下别人的脚本吧

爆破的脚本还是需要再学一下。

四,What's this

Lua bytecode

可以找一个lua在线反编译网站。Lua 工具箱 (luatool.cn)

应该先变字符然后base64解密 ,发现不对,前面应该还有一些操作

function Xor(num1, num2)local tmp1 = num1local tmp2 = num2local str = ""repeatlocal s1 = tmp1 % 2local s2 = tmp2 % 2if s1 == s2 thenstr = "0" .. strelsestr = "1" .. strendtmp1 = math.modf(tmp1 / 2)tmp2 = math.modf(tmp2 / 2)until tmp1 == 0 and tmp2 == 0return tonumber(str, 2)
endvalue = ""
output = ""
i = 1
while true dolocal temp = string.byte(flag, i)temp = string.char(Xor(temp, 8) % 256)value = value .. tempi = i + 1if i > string.len(flag) thenbreakend
end
for _ = 1, 1000 dox = 3y = x * 3z = y / 4w = z - 5if w == 0 thenprint("This line will never be executed")end
end
for i = 1, string.len(flag) dotemp = string.byte(value, i)temp = string.char(temp + 3)output = output .. temp
end
result = output:rep(10)
invalid_list = {1,2,3
}
for _ = 1, 20 dotable.insert(invalid_list, 4)
end
for _ = 1, 50 doresult = result .. "A"table.insert(invalid_list, 4)
end
for i = 1, string.len(output) dotemp = string.byte(output, i)temp = string.char(temp - 1)
end
for _ = 1, 30 doresult = result .. string.lower(output)
end
for _ = 1, 950 dox = 3y = x * 3z = y / 4w = z - 5if w == 0 thenprint("This line will never be executed")end
end
for _ = 1, 50 dox = -1y = x * 4z = y / 2w = z - 3if w == 0 thenprint("This line will also never be executed")end
end
require("base64")
obfuscated_output = to_base64(output)
obfuscated_output = string.reverse(obfuscated_output)
obfuscated_output = string.gsub(obfuscated_output, "g", "3")
obfuscated_output = string.gsub(obfuscated_output, "H", "4")
obfuscated_output = string.gsub(obfuscated_output, "W", "6")
invalid_variable = obfuscated_output:rep(5)
if obfuscated_output == "==AeuFEcwxGPuJ0PBNzbC16ctFnPB5DPzI0bwx6bu9GQ2F1XOR1U" thenprint("You get the flag.")
elseprint("F**k!")
end

先异或8后+3

import  base64
enc='==AeuFEcwxGPuJ0PBNzbC16ctFnPB5DPzI0bwx6bu9GQ2F1XOR1U'
print(enc[::-1])
str=list(enc[::-1])
for i in range(len(str)):if str[i]=='3':str[i]='g'elif str[i]=='4':str[i]='H'elif str[i]=='6':str[i]="W"
print(''.join(str))
ant='U1ROX1F2QG9ubWxwb0IzPD5BPnFtcW1CbzNBP0JuPGxwcEFueA=='
date=base64.b64decode(ant)
flag = ""
for i in date:flag += chr((i - 3) ^ 8)
print(flag)
#XYCTF{5dcbaed781363fbfb7d8647c1aee6c}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32F407+CUBEMX+FreeRTOS+lwIP netconn UDP TCP记录】

STM32F407CUBEMXFreeRTOSlwIP netconn UDP TCP记录 注意UDPUDP1UDP2 TCPTCP clientTCP server图片 注意 1、超时 #include “lwipopts.h” #define LWIP_SO_RCVTIMEO 12、先保证能ping通 3、关于工程创建可参考 【STM32F407CUBEMXFreeRTOSlwIP之UDP记录】 4、…

数据仓库Data Warehouse

数据仓库Data Warehouse 数仓是一种思想,数仓是一种规范,数仓是一种解决方案 1. 数据处理方式 数据处理大致可以分成两大类: 联机事务处理OLTP(on-line transaction processing)联机分析处理OLAP(On-Line Analytical Processing)1.1. OLTP OLTP的全称是On-line Transa…

【C++】详解string类

目录 简介 框架 构造 全缺省构造函数 ​编辑 传对象构造函数 拷贝构造 析构函数 容量 size() capacity&#xff08;&#xff09; empty() clear() reserve() ​编辑 resize() 遍历 检引用符号"[ ]"的重载 迭代器 begin() end() rbegin() rend(…

使用Mybatis映射时间 DateTime ==> LocalDateTime

首先查看&#xff0c;数据库字段&#xff1a; 书写映射实体类对象VO&#xff1a; Data public class OrderListVO implements Serializable {private Integer orderId;private String memberName;private String orderNumber;private BigDecimal orderPrice;private String l…

在单细胞分辨率下预测细胞对新型药物扰动的反应

scRNA-seq能够在单个细胞分辨率下研究细胞异质性对扰动的响应。然而&#xff0c;由于技术限制&#xff0c;扩大高通量筛选&#xff08;HTSs&#xff0c;highthroughput screens&#xff09;来测量许多药物的细胞反应仍然是一个挑战。因此&#xff0c;目前依然需要借助常规的bul…

excel表格在筛选状态下,怎样从指定数字开始填充序列?

分两种情况分开来说吧&#xff1a; 一、表格根据需要做数据筛选&#xff0c;指定列的序号始终保持0012开始的连续序号。 B2TEXT(AGGREGATE(3,5,B$1:B1)11,"0000") 然后向下填充公式。 当C列数据做了筛选以后&#xff0c;B列仍旧保持连续的序号&#xff0c;改变筛选…

MySQL连表查询

MySQL简介&#xff0c;我们为什么要学习各种join MySQL是SQL的一种&#xff0c;SQL意为结构化查询语言(Structure Query Language)&#xff0c;MySQL可以应用于现实世界的各种结构化数据。 SQL&#xff08;结构化查询语言&#xff09;&#xff0c;处理结构化数据的查询语言&a…

房产中介小程序高效开发攻略:从模板到上线一站式服务

对于房产中介而言&#xff0c;拥有一个高效且用户友好的小程序是提升业务、增强客户黏性的关键。而采用直接复制模板的开发方式&#xff0c;无疑是实现这一目标的最佳途径&#xff0c;不仅简单快捷&#xff0c;而且性价比极高。 在众多小程序模板开发平台中&#xff0c;乔拓云网…

Java项目:基于SSM框架实现的高校专业信息管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文+PPT+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的高校专业信息管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

前端vite+rollup前端监控初始化——封装基础fmp消耗时间的npm包并且发布npm beta版本

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐初始化npm项目&#x1f496;type为module&#x1f496;rollup.config.js ⭐封装fmp耗时计算的class&#x1f496;npm build打包class对象 ⭐发布npm的beta版本&#x1f496; npm发布beta版本 ⭐安装web-performance-tool的beta版本…

5G前传光纤传输的25G光模块晶振SG2016CAN

一款适用于5G前传光纤传输网络中的25G光模块的5G晶振SG2016CAN。随着5G时代的到来&#xff0c;5G晶振的重要性也不言而喻&#xff0c;小体积宽温晶振SG2016CAN可以用于5G前传的25G光模块&#xff0c;具有高稳定性、小体积、宽温等优势。在5G前传光纤传输网络中&#xff0c;25G光…

Mac 上安装多版本的 JDK 且实现 自由切换

背景 当前电脑上已经安装了 jdk8; 现在再安装 jdk17。 期望 完成 jdk17 的安装&#xff0c;并且完成 环境变量 的配置&#xff0c;实现自由切换。 前置补充知识 jdk 的安装路径 可以通过查看以下目录中的内容&#xff0c;确认当前已经安装的 jdk 版本。 cd /Library/Java/Java…

【大前端】ECharts 绘制立体柱状图

立体柱状图分为&#xff1a; 纯色立体柱状图渐变立体柱状图 常用实现方式 纯色立体柱状图 纯色立体柱状图&#xff0c;使用MarkPoint和颜色渐变就实现&#xff0c;如下代码 import * as echarts from "echarts";var chartDom document.getElementById("main&…

AI大模型探索之路-训练篇9:大语言模型Transformer库-Pipeline组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

Android View事件分发面试问题及回答

问题 1: 请简述Android中View的事件分发机制是如何工作的&#xff1f; 答案: 在Android中&#xff0c;事件分发机制主要涉及到三个主要方法&#xff1a;dispatchTouchEvent(), onInterceptTouchEvent(), 和 onTouchEvent(). 当一个触摸事件发生时&#xff0c;首先被Activity的…

展会资讯 | 现场精彩回顾 阿尔泰科技参展2024第23届中国国际(西部)光电产业!

2024第23届中国国际&#xff08;西部&#xff09;光电产业博览会&#xff0c;在成都世纪城新国际会展中心圆满落幕&#xff01;来自各地的光电领域设备及材料厂商汇聚一堂&#xff0c;展示前沿技术及创新成果。 展会现场&#xff0c;来自全国各地的500余家企业就精密光学、信息…

ChatGPT 网络安全秘籍(四)

原文&#xff1a;zh.annas-archive.org/md5/6b2705e0d6d24d8c113752f67b42d7d8 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第八章&#xff1a;事故响应 事故响应是任何网络安全策略的关键组成部分&#xff0c;涉及确定、分析和缓解安全漏洞或攻击。 及时和有效地…

Linux深入学习内核 - 中断与异常(下)

软中断&#xff0c;Tasklet和Work Queue 由内核执行的几个任务之间有一些不是紧急的&#xff0c;他们可以被延缓一段时间&#xff01;把可延迟的中断从中断处理程序中抽出来&#xff0c;有利于使得内核保持较短的响应时间&#xff0c;所以我们现在使用以下面的这些结构&#x…

通用漏洞评估系统CVSS4.0简介

文章目录 什么是CVSS&#xff1f;CVSS 漏洞等级分类历史版本的 CVSS 存在哪些问题&#xff1f;CVSS 4.0改进的“命名法”改进的“基本指标”考虑“OT/IOT”新增的“其他指标”CVSS 4.0存在的问题 Reference: 什么是CVSS&#xff1f; 在信息安全评估领域&#xff0c;CVSS为我们…

2024五一数学建模C题Python代码+结果表数据教学

2024五一数学建模竞赛&#xff08;五一赛&#xff09;C题保姆级分析完整思路代码数据教学 C题 煤矿深部开采冲击地压危险预测 第一问 导入数据 以下仅展示部分&#xff0c;完整版看文末的文章 import numpy as np import pandas as pd import matplotlib.pyplot as plt imp…