MISC
签到
flag:XYCTF{WELCOME_TO_XYCTF}
关注公众号回复
game
flag:XYCTF{Papers Please}
谷歌识图游戏名
熊博士
flag:XYCTF{liu_ye_mei_you_xiao_jj}
解出小纸条转为atbash码是xyctf{liu_ye_mei_you_xiao_jj}
,根据提示flag头大写,改为大写即可
jpg查到有jphide隐写,但是密码未知,纯nt设计
ez_隐写
flag:XYCTF{159-WSX-IJN-852}
压缩包伪加密,先去除伪加密
得到一个hint.png和加密压缩包
png修复宽高,得到提示:开赛日期
即压缩包密码是20240401,解压得到一个watermark.jpg,用盲水印工具提取,瞪眼法得到flag
ZIP神之套
flag:XYCTF{1A4B8-C9D2F3E-6A4B8C-9D2F3E7F}
zip文件,第一层是exe和一个加密zip,exe运行出xyctf????????ftcyx
,推测掩码攻击,得到密码xyctf20240401ftcyx
解压出两个压缩包,一个加密一个未加密,未加密里有加密压缩包里的文件,推测明文攻击,得到flag.md,搜索XYCTF得到flag
TCPL
flag:FLAG{PLCT_An4_r0SCv_x0huann0}
ELF文件,但是不能直接运行,怀疑文件被修改
ida分析可以看到数据段,根据题目描述flag开头是FLAG{
直接用ida读汇编语言,这里待完善
首先是异或
cipher = [ '444A557F44434D46' , '3E7C5238654B565C' , '627E246C4C645243' , '2A747779' , '61' ]
text = []
for i in cipher :
for j in range ( len ( i ) - 1 , -1 , -2 ) :
text.append ( int ( i [ j - 1 : j + 1 ] , 16 ) )
for i in range ( len ( text ) ) :
print ( chr ( text [ i ] ^ i ) , end = '')
FLAG{TCPL_An4_r1SCv_x1huann1}
然后输出了一个图形,让其中的1变成这个图形,推断出是0
***
* *
* *
***
zzl的护理小课堂
flag:XYCTF{2zL_tEII_you_915a36eb7a38}
web题,burpsuite抓包修改响应,使其提交时直接输出flag即可
真>签到
flag:XYCTF{59bd0e77d13c_1406b23219e_f91cf3a_153e8ea4_77508ba}
zip加密压缩包,但是010editor打开在文件头就发现了flag
Rosk,Paper,Scissors!
flag:XYCTF{ROSk,PapeR,SclsS0R5_01581dd30576}
靶机交互题,与程序进行石头剪刀布,第一次完全随机,后面的99次取决于之前的猜拳情况,根据程序逻辑反推出解即可
这里socket一直连接不上,改用pwntool连接
from pwn import *
from pwn import p64 , p32
from collections import Counter
import random
palyerinputs = []
def most_common_element(arr):
counter = Counter(arr)
most_common = counter.most_common(1)
return most_common[0][0] if most_common else None
def random_ai(palyerinputs):
seed = palyerinputs[:-1]
if len(seed) == 0:
return random.randint(1, 3)
else:
return (most_common_element(seed) - 2) % 3 + 1
IP = '127.0.0.1'
port = 7052
s = remote ( IP , port )
print ( s.recv().decode() )
palyerinputs.append ( 1 )
s.sendline ( b'Rock' )
print ( s.recv().decode() )
cnt = 0
while cnt != 100 :
for i in range ( 1 , 4 ) :
palyerinputs.append ( i )
aiinput = random_ai(palyerinputs)
if ( i == 1 and aiinput != 2 ) or ( i == 2 and aiinput != 3 ) or ( i == 3 and aiinput != 1 ) :
palyerinputs.pop ( )
continue
if aiinput == 1 :
s.sendline ( b'Scissors' )
break
elif aiinput == 2 :
s.sendline ( b'Rock' )
break
elif aiinput == 3 :
s.sendline ( b'Paper' )
break
print ( s.recv().decode() )
cnt += 1
print ( s.recvall().decode() )
Osint1
flag:xyctf{江苏省|南通市|滨海东路|黄海}
小红书识图
EZ_Base1024*2
flag:XYCTF{84ca3a6e-3508-4e34-a5e0-7d0f03084181}
base2048
CRYPTO
Sign1n[签到]
flag:XYCTF{e883e6eb-f8e2-478a-a92d-fff024cc9de6}
将flag转为长整形,然后转为二进制字符串,补全为514位,末尾补零,翻转后再进行加法模运算。逆向即可
from Crypto.Util.number import long_to_bytes
# 给定的加密后的字符串 b
b = "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567891134567780113445779902334577801133467889122346779001245567991223466790012345788902334677801124556899023355788001235568990223566799023445778902335578800133456899012456679011344567991223557880012445788911334677890234456899023355788001244568991133467780113445779902335667900123467889012456679911245578801233467789112355779912234577990233556780113"
# 逆自定义加法
def reverse_custom_add(input_str):
input_list = list(input_str)
length = len(input_list)
for i in range(length):
input_list[i] = str((int(input_list[i]) - i - 1 + 10) % 10)
result = ''.join(input_list)
return result
# 逆位翻转
def reverse_swap_bits(input_str):
input_list = list(input_str)
length = len(input_list)
for i in range(length // 2):
temp = input_list[i]
input_list[i] = input_list[length - 1 - i]
input_list[length - 1 - i] = temp
return ''.join(input_list)
# 执行逆变换
reversed_b = reverse_custom_add(b)
reversed_leak = reverse_swap_bits(reversed_b)
# 移除添加的零
original_leak = reversed_leak.rstrip('0')
# 二进制到整数的转换
original_flag_int = int(original_leak, 2)
# 整数到字节串的转换
original_flag = long_to_bytes(original_flag_int)
print ( original_flag )
Sign1n_Revenge
flag:flag{707a37ba-c623-449d-bebe-9a92728f940a}
同上,只需连接上靶机得到附件的密文即可
REVERSE
聪明的信使
flag:flag{Y0u_KnOw_Crypt0_14_v3ry_Imp0rt@nt!}
凯撒加密,key=9
喵喵喵的flag碎了一地
flag:flag{My_fl@g_h4s_br0ken_4parT_Bu7_Y0u_c@n_f1x_1t!}
根据题目提示,flag分为三部分
- 第一部分,string搜索 flag{My_fl@g_
- 第二部分,函数名搜索 h4s_br0ken_4parT_
- 第三部分,第二部分的函数名引用,分为两块,第一块在putchar Bu7_Y0u_c@n_,第二块在汇编代码里 f1x_1t!}
你是真的大学生吗?
flag:xyctf{you_know_8086}
asm逆向,字符串异或
cipher = [0x76, 0x0E, 0x77, 0x14, 0x60, 0x06, 0x7D, 0x04, 0x6B, 0x1E, 0x41, 0x2A, 0x44, 0x2B, 0x5C, 0x03, 0x3B, 0x0B, 0x33, 0x05]
for i in range ( len ( cipher ) - 1 ) :
cipher [ i ] = cipher [ i ] ^ cipher [ i + 1 ]
for i in range ( len ( cipher ) ) :
print ( chr ( cipher [ i ] ), end = "" )
ez_cube
flag:flag{RuRURURururr}
魔方题,给出一个待还原的魔方,需要还原,这里先分析出魔方的结构
for ( i = 0; i < 9; ++i )
{
zhengmian[i] = "Red";
zuobian[i] = "Blue";
youmian[i] = "Green";
houmian[i] = "Orange";
shangmian[i] = "Yellow";
xiamian[i] = "White";
}
zuobian[1] = "Red";
zhengmian[1] = "Green";
youmian[1] = "Blue";

然后可以知道,程序只允许R、U、r、u
四种操作方法
这个是最基础的还原操作,刚好十二步
RuRURURururr
,得到flag
给阿姨倒一杯卡布奇诺
flag:XYCTF{133bffe401d223a02385d90c5f1ca377}
魔改tea,脚本按照逻辑解密即可
#include <bits/stdc++.h>
using namespace std ;
void encrypt (uint32_t* v, uint32_t* k) {
uint32_t v0 = v[0], v1 = v[1], sum = 0;
uint32_t delta = 1853174124 ;
sum = delta * 32 ;
for ( int i = 31; i >= 0 ; i--) {
v1 -= ((v0<<4) + k[2]) ^ (v0 + sum) ^ ((v0>>5) + k[3]) ^ ( sum + i ) ; // sum + i 魔改
v0 -= ((v1<<4) + k[0]) ^ (v1 + sum) ^ ((v1>>5) + k[1]) ^ ( sum + i ) ;
sum -= delta;
}
v[0] = v0;
v[1] = v1;
}
int main() {
uint32_t k[4] = {1702259047, 1970239839, 1886741343, 1634038879};
int32_t input[8] = {0x9B28ED45,0x145EC6E9,0x5B27A6C3,0xE59E75D5,0xE82C2500,0xA4211D92,0xCD8A4B62,0xA668F440};
//scanf("%32s", input);
uint32_t data1 = 0x5F797274 , data2 = 0x64726168 ;
for (int i = 0; i < 8; i+=2) {
uint32_t v[2] = {*(uint32_t *)&input[i], *(uint32_t *)&input[i+1]} ;
encrypt(v, k);
v [ 0 ] ^= data1 , v [ 1 ] ^= data2 ; //异或魔改
data1 = input [ i ] , data2 = input [ i + 1 ] ;
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 4; k++) {
printf("%c", v[j] & 0xff);
v[j] >>= 8;
}
}
}
return 0;
}
ez_rand
flag:XYCTF{R@nd_1s_S0_S0_S0_easy!}
时间戳爆破题,需要先爆出时间戳,由于给定flag格式为XYCTF{
,所以可以根据这个来爆破
#include <bits/stdc++.h>
using namespace std ;
int main() {
for ( register int i = 0 ; i <= 1000000000000 ; ++i ) {
srand ( i ) ;
int v7 = rand ( ) ;
if ( (unsigned __int8)(v7 + ((((unsigned __int64)(2155905153 * v7) >> 32) & 0x80000000 ) != 0) + ((int)((unsigned __int64)(2155905153 * v7) >> 32) >> 7)) == 5 ) {
v7 = rand ( ) ;
if ( (unsigned __int8)(v7 + ((((unsigned __int64)(2155905153 * v7) >> 32) & 0x80000000 ) != 0) + ((int)((unsigned __int64)(2155905153 * v7) >> 32) >> 7)) == 85 ) {
v7 = rand ( ) ;
if ( (unsigned __int8)(v7 + ((((unsigned __int64)(2155905153 * v7) >> 32) & 0x80000000 ) != 0) + ((int)((unsigned __int64)(2155905153 * v7) >> 32) >> 7)) == 47 ) {
v7 = rand ( ) ;
if ( (unsigned __int8)(v7 + ((((unsigned __int64)(2155905153 * v7) >> 32) & 0x80000000 ) != 0) + ((int)((unsigned __int64)(2155905153 * v7) >> 32) >> 7)) == 190 ) {
v7 = rand ( ) ;
if ( (unsigned __int8)(v7 + ((((unsigned __int64)(2155905153 * v7) >> 32) & 0x80000000 ) != 0) + ((int)((unsigned __int64)(2155905153 * v7) >> 32) >> 7)) == 0 ) {
cout << i << " " ;
}
}
}
}
}
}
return 0;
}
得到种子21308
根据种子进行解密即可
#include <bits/stdc++.h>
using namespace std ;
int data[29] = {
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
};
int main ( ) {
srand ( 21308 ) ;
for ( int i = 0 ; i < 29 ; ++i ) {
int v7 = rand ( ) ;
data [ i ] ^= (unsigned __int8)(v7 + ((((unsigned __int64)(2155905153 * v7) >> 32) & 0x80000000 ) != 0) + ((int)((unsigned __int64)(2155905153 * v7) >> 32) >> 7)) ;
}
for ( int i = 0 ; i < 29 ; ++i ) {
cout << char ( data [ i ] ) ;
}
return 0 ;
}
砸核桃
flag:flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}
手脱壳例题,脱开就能看到flag的异或逻辑,编写脚本解密
key = 'this_is_not_flag'
cipher = [0x12, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00]
for i in range ( 42 ) :
print ( chr ( cipher [ i * 4 ] ^ ord ( key [ i % 16 ] ) ) , end = '' )
ez_enc
flag:flag{!r3ea11y_w4nt@_cu7e_s1$ter}
逻辑分析
for ( i = 0; i < (int)(j_strlen(Str) - 1); ++i )
Str[i] = aImouto[i % 6] ^ (Str[i + 1] + (unsigned __int8)Str[i] % 20);
for ( j = 0; j < (int)j_strlen(Str); ++j )
{
if ( Str[j] != byte_14001E008[j] )
{
sub_1400111A4("Wrong");
return 0;
}
}
这里的核心逻辑是Str[i] = aImouto[i % 6] ^ (Str[i + 1] + (unsigned __int8)Str[i] % 20);
很容易想到dfs倒推,约束条件是前五个字符为flag{
,但是没有成功,遂发现了正推的逻辑,脚本实现
只要推出了第一个是f
,就很好做了,可以挨个进行递推
cipher = [0x27, 0x24, 0x17, 0x0B, 0x50, 0x03, 0xC8, 0x0C, 0x1F, 0x17, 0x36, 0x55, 0xCB, 0x2D, 0xE9, 0x32, 0x0E, 0x11, 0x26, 0x02, 0x0C, 0x07, 0xFC, 0x27, 0x3D, 0x2D, 0xED, 0x35, 0x59, 0xEB, 0x3C, 0x3E, 0xE4, 0x7D]
key = 'IMouto'
flag = []
flag.append ( 'f' )
for i in range ( len ( cipher ) - 1 ) :
flag.append ( chr ( ( cipher [ i ] ^ ord(key [ i % 6 ]) ) - ord ( flag [ i ] ) % 20 ) )
for i in flag :
print ( i , end = '' )
ezmath
flag:XYCTF{q7WYGscUuptTYXjnjKoyUTKtG}
py打包的exe,解包后反编译pyc文件,得到一大串的判断flag语句,拆开分析,主要是两种
sum([flag[i] for _ in range(flag[i])])
sum([flag[i] for _ in range(m)])
容易发现,flag[31]对应最后一个字符,而此处的m为250,正好是125的两倍
查看前五个字符,也正好是XYCTF的两倍,所以提取出来,即可得到flag
import re
with open('D:/桌面/1.txt', 'r') as file:
lines = file.readlines()
# 准备输出的代码
output_code = []
# 正则表达式,用于提取flag索引和范围
pattern = re.compile(r"flag\[(\d+)\] for _ in range\((\d+)\)")
for line in lines:
# 使用正则表达式匹配行
match = pattern.search(line)
if match:
# 提取flag的索引和重复次数
index = match.group(1)
count = match.group(2)
# 创建新的代码行
new_line = f"flag[{index}] = {count} // 2\n"
output_code.append(new_line)
# 将生成的代码写入输出文件
for i in output_code :
print ( i )
flag = [0] * 32
flag[24] = 222 // 2
flag[9] = 178 // 2
flag[29] = 232 // 2
flag[23] = 150 // 2
flag[6] = 226 // 2
flag[7] = 110 // 2
flag[0] = 176 // 2
flag[12] = 198 // 2
flag[3] = 168 // 2
flag[2] = 134 // 2
flag[13] = 170 // 2
flag[10] = 142 // 2
flag[15] = 224 // 2
flag[11] = 230 // 2
flag[1] = 178 // 2
flag[5] = 246 // 2
flag[17] = 168 // 2
flag[21] = 220 // 2
flag[22] = 212 // 2
flag[16] = 232 // 2
flag[4] = 140 // 2
flag[31] = 250 // 2
flag[28] = 150 // 2
flag[14] = 234 // 2
flag[8] = 174 // 2
flag[25] = 242 // 2
flag[30] = 142 // 2
flag[26] = 170 // 2
flag[19] = 176 // 2
flag[27] = 168 // 2
flag[20] = 212 // 2
flag[18] = 178 // 2
for i in flag :
print ( chr ( i ) , end = '' )
何须相思煮余年
flag:XYCTF{5b3e07567a9034d06851475481507a75}
给了字节码,用ida打开一个新的00程序,先覆盖patch进去
import ida_bytes
def simulate_xor_encryption(start_addr, size):
modified_data = [0x55,0x8b,0xec,0x81,0xec,0xa8,0x0,0x0,0x0,0xa1,0x0,0x40,0x41,0x0,0x33,0xc5,0x89,0x45,0xfc,0x68,0x9c,0x0,0x0,0x0,0x6a,0x0,0x8d,0x85,0x60,0xff,0xff,0xff,0x50,0xe8,0x7a,0xc,0x0,0x0,0x83,0xc4,0xc,0xc7,0x85,0x58,0xff,0xff,0xff,0x27,0x0,0x0,0x0,0xc7,0x85,0x5c,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0xeb,0xf,0x8b,0x8d,0x5c,0xff,0xff,0xff,0x83,0xc1,0x1,0x89,0x8d,0x5c,0xff,0xff,0xff,0x83,0xbd,0x5c,0xff,0xff,0xff,0x27,0xf,0x8d,0xed,0x0,0x0,0x0,0x8b,0x95,0x5c,0xff,0xff,0xff,0x81,0xe2,0x3,0x0,0x0,0x80,0x79,0x5,0x4a,0x83,0xca,0xfc,0x42,0x85,0xd2,0x75,0x25,0x8b,0x85,0x5c,0xff,0xff,0xff,0x8b,0x8c,0x85,0x60,0xff,0xff,0xff,0x3,0x8d,0x5c,0xff,0xff,0xff,0x8b,0x95,0x5c,0xff,0xff,0xff,0x89,0x8c,0x95,0x60,0xff,0xff,0xff,0xe9,0xac,0x0,0x0,0x0,0x8b,0x85,0x5c,0xff,0xff,0xff,0x25,0x3,0x0,0x0,0x80,0x79,0x5,0x48,0x83,0xc8,0xfc,0x40,0x83,0xf8,0x1,0x75,0x22,0x8b,0x8d,0x5c,0xff,0xff,0xff,0x8b,0x94,0x8d,0x60,0xff,0xff,0xff,0x2b,0x95,0x5c,0xff,0xff,0xff,0x8b,0x85,0x5c,0xff,0xff,0xff,0x89,0x94,0x85,0x60,0xff,0xff,0xff,0xeb,0x73,0x8b,0x8d,0x5c,0xff,0xff,0xff,0x81,0xe1,0x3,0x0,0x0,0x80,0x79,0x5,0x49,0x83,0xc9,0xfc,0x41,0x83,0xf9,0x2,0x75,0x23,0x8b,0x95,0x5c,0xff,0xff,0xff,0x8b,0x84,0x95,0x60,0xff,0xff,0xff,0xf,0xaf,0x85,0x5c,0xff,0xff,0xff,0x8b,0x8d,0x5c,0xff,0xff,0xff,0x89,0x84,0x8d,0x60,0xff,0xff,0xff,0xeb,0x38,0x8b,0x95,0x5c,0xff,0xff,0xff,0x81,0xe2,0x3,0x0,0x0,0x80,0x79,0x5,0x4a,0x83,0xca,0xfc,0x42,0x83,0xfa,0x3,0x75,0x20,0x8b,0x85,0x5c,0xff,0xff,0xff,0x8b,0x8c,0x85,0x60,0xff,0xff,0xff,0x33,0x8d,0x5c,0xff,0xff,0xff,0x8b,0x95,0x5c,0xff,0xff,0xff,0x89,0x8c,0x95,0x60,0xff,0xff,0xff,0xe9,0xf7,0xfe,0xff,0xff,0x33,0xc0,0x8b,0x4d,0xfc,0x33,0xcd,0xe8,0x4,0x0,0x0,0x0,0x8b,0xe5,0x5d,0xc3]
# 将修改后的数据转换为bytes对象后写回到相同的地址
if not ida_bytes.patch_bytes(start_addr, bytes(modified_data)):
print("Failed to patch bytes.")
else:
print("Encryption simulated successfully.")
# 脚本的入口点
if __name__ == "__main__":
# 函数起始位置
start_address = 0x00
# 数据大小,根据给定的循环次数决定
data_size = 344
# 执行加密模拟
simulate_xor_encryption(start_address, data_size )
然后查看汇编代码,用gpt分析或用ida分析
void function() {
int local_array[42]; // 假设数组大小为42,实际大小取决于A8h的解释
int i = 0;
for (; i < 39; i++) { // 假设循环到39,实际上是对'27h'的解释
int index = i & 3; // 实际上对应汇编中的 'and edx, 80000003h'
if (index == 0) {
local_array[i] += i;
} else if (index == 1) {
local_array[i] -= i;
} else if (index == 2) {
local_array[i] *= i;
} else if (index == 3) {
local_array[i] ^= i;
}
}
}
for ( i = 0; i < 39; ++i )
{
if ( i % 4 )
{
switch ( i % 4 )
{
case 1:
v2[i] -= i;
break;
case 2:
v2[i] *= i;
break;
case 3:
v2[i] ^= i;
break;
}
}
else
{
v2[i] += i;
}
}
根据逻辑逆向即可
enc = [88,88,134,87,74,118,318,101,59,92,480,60,65,41,770,110,73,31,918,39,120,27,1188,47,77,24,1352,44,81,23,1680,46,85,15,1870,66,91,16,4750]
flag = ''
for i in range ( len ( enc ) ) :
index = i & 3
if index == 0 :
enc [ i ] -= i
elif index == 1 :
enc [ i ] += i
elif index == 2 :
enc [ i ] //= i
else :
enc [ i ] ^= i
flag += chr ( enc [ i ] )
print ( flag )
What's this
flag:XYCTF{5dcbaed781363fbfb7d8647c1aee6c}
lua文件,先用unluac反编译
java -jar unluac_2023_11_15.jar what.lua > what_de.lua
得到源码,发现一堆反混淆,提取出关键代码
while true do
local temp = string.byte(flag, i)
temp = string.char(Xor(temp, 8) % 256)
value = value .. temp
i = i + 1
if i > string.len(flag) then
break
end
end
for i = 1, string.len(flag) do
temp = string.byte(value, i)
temp = string.char(temp + 3)
output = output .. temp
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" then
print("You get the flag.")
else
print("F**k!")
end
异或取模 -> 加法 -> base64 -> 字符串的反转替换
cipher = "STN_Qv@onmlpoB3<>A>qmqmBo3A?Bn<lppAnx"
for i in range ( len ( cipher ) ) :
a = chr ( ( ord ( cipher [ i ] ) - 3 ) ^ 8 )
print ( a , end = '' )
舔狗四部曲--简爱
flag:FLAG{vm_is_A_3ecreT_l0Ve_revers}
gra = [2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,2,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,4,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,4,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2]
cipher = 'flag{Love_is_not_one_sided_Love}'
ci = list ( cipher )
c = []
for i in range ( len ( ci ) ) :
c.append ( ord ( ci [ i ] ) )
flag = ''
dex = len ( c ) - 1
for i in gra :
if i == 2 :
dex -= 1
flag += chr ( c [ dex + 1 ] )
elif i == 1 :
c [ dex ] += 1
elif i == 0 :
c [ dex ] -= 1
elif i == 4 :
c [ dex ] = c [ dex ] - c [ dex + 1 ] + 70
else :
c [ dex ] = c [ dex ] + c [ dex + 1 ] - 70
print ( flag[::-1] )