2023-Moectf-wp
不包含web; misc;pwn;web misc太基础;pwn不会!!我是菜鸡
一:古典密码
1、ezrot
考点:ROT系列
题解:
(1)题目
@64E7LC@Ecf0:D0;FDE020D:>!=60=6EE6C0DF3DE:EFE:@?04:!96C0tsAJdEA6d;F}%0N
rot系列解密得到flag
oectf{rot47_is_just_a_simPle_letter_substitution_ciPher_EDpy5tpe5juNT_}
2、vigenere
考点:vigenere
题解:
(1)题目
scsfct{wOuSQNfF_IWdkNf_Jy_o_zLchmK_voumSs_zvoQ_loFyof_FRdiKf_4i4x4NLgDn}
开头是moectf;可以推测出密钥为goodjob
moectf{vIgENErE_CIphEr_Is_a_lIttlE_hardEr_thaN_caEsar_CIphEr_4u4u4EXfXz}
3、不是“皇帝的新密码”
考点:vigenere
题解:
(1)题目:
scsfct{wOuSQNfF_IWdkNf_Jy_o_zLchmK_voumSs_zvoQ_loFyof_FRdiKf_4i4x4NLgDn}
(2)还是vigenere
4、可可的新围墙
考点:栅栏密码
题解:
moectf{F3nc3_ciph3r_shiFTs_3ach_l3TT3r_By_a_Giv3n_nuMB3r_oF_plac3s_Ojpj}
5、猫言喵语
考点:
题解:
(1)题目
喵喵? 喵喵喵喵喵喵喵喵喵喵喵喵 喵喵喵 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵? 喵喵?喵喵喵喵喵? 喵喵喵喵喵? 喵喵喵喵喵?喵喵? 喵喵喵喵喵? 喵喵喵喵喵喵 喵喵喵喵喵喵 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵? 喵喵?喵喵喵喵喵?喵喵喵 喵喵喵喵喵? 喵喵? 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵? 喵喵?喵喵喵喵喵喵喵喵喵 喵喵喵喵喵喵喵喵? 喵喵? 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵? 喵喵?喵喵喵喵喵喵喵喵喵 喵喵喵 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵? 喵喵?喵喵喵喵喵?喵喵喵 喵喵喵喵喵? 喵喵喵喵喵?喵喵喵喵喵喵 喵喵喵喵喵?喵喵喵喵喵喵 喵喵喵 喵喵?喵喵喵喵喵喵 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵? 喵喵?喵喵?喵喵喵 喵喵?喵喵?喵喵? 喵喵喵喵喵喵喵喵? 喵喵?喵喵?喵喵喵喵喵喵 喵喵喵喵喵喵 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵? 喵喵?喵喵喵喵喵喵喵喵喵 喵喵?喵喵喵喵喵?喵喵? 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵? 喵喵喵喵喵?喵喵喵 喵喵?喵喵喵喵喵喵喵喵?
(2)Morse code”,是摩斯密码;斯密码只有两种符号,所以得把文件内容根据特征划分成两块。内容中的空格相当于分隔符,根据观察,可以看出”喵喵?”是一组,”喵喵喵”是一组,根据这个规律进行转换,得到如下内容
./----/-/--..-./.-./-./-../-./--/--/--..-./.-.-/-././--..-./.---/--././--..-./.---/-/--..-./.-.-/-./-.--/-.--/-/.--/--..-./..-/.../--./..--/--/--..-./.---/.-../--..-./-.-/.--.
moectf{THE_KAWAII_CAT_BUT_BE_CALLED_GOUZI_BY_RX}
二:Reverse
1、“天网”
考点:so文件提取分析
参考链接: https://blog.csdn.net/ULGANOY/article/details/136780906
2、ANDROID
考点:APK逆向
题解:
(1)签到题目
用户输入一个字符串;然后与key进行异或操作之后与enc进行比较
enc = [25, 7, 0, 14, 27, 3, 16, ord('/'), 24, 2, ord('\t'), ord(':'), 4, 1, ord(':'), ord('*'), 11, 29, 6, 7, ord('\f'), ord('\t'), ord('0'), ord('T'), 24, ord(':'), 28, 21, 27, 28, 16]
key = ['t', 'h', 'e', 'm', 'o', 'e', 'k', 'e', 'y']
def decrypt(enc, key):
result = []
key_length = len(key)
for i in range(len(enc)):
# 对每个字符进行 XOR 操作
decrypted_char = enc[i] ^ ord(key[i % key_length])
result.append(chr(decrypted_char))
return ''.join(result)
decrypted_text = decrypt(enc, key)
print("解密后的字符串:", decrypted_text)
3、Base64
考点:bse64魔改 pyc在线反编译
题解:
(1)pyc文件;首先在线反编译拿到源码
import base64
from string import *
str1 = 'yD9oB3Inv3YAB19YynIuJnUaAGB0um0='
string1 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/'
string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
flag = input('welcome to moectf\ninput your flag and I wiil check it:')
enc_flag = base64.b64encode(flag.encode()).decode()
enc_flag = enc_flag.translate(str.maketrans(string2, string1))
if enc_flag == str1:
print('good job!!!!')
else:
print('something wrong???')
exit(0)
(2)简单的一个换表base64;用户输入字符串之后base64加密与目标值进行对比;解密str1就行
import base64
str1 = 'yD9oB3Inv3YAB19YynIuJnUaAGB0um0='
string1 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/'
string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
translation_table = str.maketrans(string1, string2)
replaced_str = str1.translate(translation_table)
try:
flag = base64.b64decode(replaced_str).decode()
print("解密后的 flag:", flag)
except Exception as e:
print("解密失败:", e)
4、EQUATION
考点:Z3求解
5、GUI
考点:签到题目:只是增加了一个反调试而已
data= [0x0F, 0x3E, 0x30, 0x27, 0x13,0x01, 0x7D, 0x70, 0x70, 0x03,0x7D, 0x38, 0x0E, 0x7A, 0x23,0x7C, 0x0B, 0x1A, 0x3C, 0x7D,0x39, 0x7F, 0x3C, 0x4D, 0x4D,0x4D, 0x29]
for i in data:
print(chr((i ^ 0x51) + 5), end='')
6、RRRRRc4
考点:RC4
题解:
(1)题目
sub_7FF710DF3581("welcome to moectf!!!");
sub_7FF710DF3581("This is a very common algorithm ");
sub_7FF710DF3581("show your flag:");
sub_7FF710DF27F8("%s", input); // 输入
if ( sumlen(input) == 37 ) // 验证输入长度
{
RC4((int)v5, (int)v6, (int)input, 38, (__int64)v7, 10);// RC4加密
for ( j = 0; (unsigned __int64)j < 0x26; ++j )
{
if ( enc[j] == (unsigned __int8)input[j] )// RC4加密之后与enc内容比较
++v8;
}
}
if ( v8 == 37 )
sub_7FF710DF3973("right!flag is your input!");
else
sub_7FF710DF3973("try again~");
sub_7FF710DF4BCF(v3, &unk_7FF710EE2100);
return 0i64;
用户就是输入字符串之后然后进行RC4加密;然后在与enc进行比较;现在就需要找到密钥就行,密文已经知道;简单调试以下就知道密钥是v7
然后直接RC4解密
def rc4_decrypt(ciphertext, key):
S = list(range(256)) # 初始化 S-box
j = 0
key_length = len(key)
for i in range(256):
j = (j + S[i] + key[i % key_length]) % 256
S[i], S[j] = S[j], S[i] # 交换 S[i] 和 S[j]
i = j = 0
plaintext = []
for byte in ciphertext:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i] # 交换 S[i] 和 S[j]
k = S[(S[i] + S[j]) % 256] # 生成伪随机字节
plaintext.append(byte ^ k) # 异或解密
return bytes(plaintext)
enc = [
27, 155, 251, 25, 6, 106, 181, 59, 124, 186,
3, 243, 145, 184, 182, 61, 138, 193, 72, 46,
80, 17, 231, 199, 79, 177, 39, 207, 243, 174,
3, 9, 178, 8, 251, 220, 34
]
key = b"moectf2023"
plaintext = rc4_decrypt(enc, key)
print("解密结果:", plaintext.decode('utf-8', errors='ignore'))
7、RUST
考点:XOR
题解:
(1)首先搜索定位main函数
(2)分析main函数;发现了数据和异或操作;输入的值和0x88进行异或操作
v25 = [
-27, -25, -19, -21, -4, -18, -13, -38, -3, -5,
-4, -41, -6, -19, -2, -41, -1, -31, -28, -28,
-41, -22, -19, -41, -23, -1, -18, -3, -71, -11
]
v25_unsigned = [x & 0xFF for x in v25]
xor_key = 0x88
decrypted = []
for byte in v25_unsigned:
decrypted.append(byte ^ xor_key)
flag = ''.join([chr(b) for b in decrypted])
print("解密结果:", flag)
8、Reverse入门指北
考点:签到;flag直接放你脸上了
moectf{F1rst_St3p_1s_D0ne}
9、SMC
考点:动态调试 SMC
(1)main函数
sub_401087(aPlzInputYourFl, v4);
sub_401023(aS, (char)v6);
sub_4011E0();//SMC函数
if ( sub_401050(v6) )
sub_401087(aGood, v5);
else
sub_401087(aTryAgainPlease, v5);
return 0;
}
发现SMC函数对sub_401050函数进行了加密;无法查看sub_401050函数;需要先调试对sub_401050函数解密;然后再看解密逻辑;发现就一个异或的逻辑;解密就行
10、UPX!
考点:upx脱壳
题解:
(1)首先脱壳处理;定位main函数
很简单;输入内容;然后与0x67异或;最后和enc比较;提取enc内容逆向
enc = [
10, 8, 2, 4, 19, 1, 28, 87, 15, 56,
30, 87, 18, 56, 44, 9, 87, 16, 56, 47,
87, 16, 56, 19, 8, 56, 53, 2, 17, 84,
21, 20, 2, 56, 50, 55, 63, 70, 70, 70,
26
]
xor_key = 0x67
decrypted = []
for byte in enc:
decrypted.append(byte ^ xor_key)
flag = ''.join([chr(b) for b in decrypted])
print("解密结果:", flag)
11、Xor
考点:XOR
enc = [
84, 86, 92, 90, 77, 95, 66, 96, 86, 76,
102, 82, 87, 9, 78, 102, 81, 9, 78, 102,
77, 9, 102, 97, 9, 107, 24, 68
]
xor_key = 0x39
decrypted = []
for byte in enc:
decrypted.append(byte ^ xor_key)
flag = ''.join([chr(b) for b in decrypted])
print("解密结果:", flag)
12、ezandroid
考点:APK逆向 迷宫问题 so文件
题解:
(1)定位代码:提示Try to reverse the native lib!
(2)将apk修改为zip找so文件;将so文件进行逆向
while ( 2 )
{
v3 = 0;
if ( *a1 )
v3 = *v4 != 42;
if ( v3 )
{
v1 = a1++;
switch ( *v1 )
{
case 'a':
--v4;
continue;
case 'd':
++v4;
continue;
case 's':
v4 += 15;
continue;
case 'w':
v4 -= 15;
continue;
default:
v6 = 0;
break;
}
}
else
{
v6 = *v4 == 35;
}
break;
}
return v6;
}
找到了迷宫和迷宫函数;那么正确的路径就是flag (15个一行)ssaassssdddddwwddddssss
13、junk_code
考点:花指令
题解:
(1)sub_45A9A0((int)Str, 18)
和sub_459EBF((int)v7, 18)
加密函数被加了花指令;无法反汇编;首先nop掉花指令
(2)nop花指令
(3)分析sub_459EBF函数发现是简单的XOR操作
for ( i = 0; i < MaxCount; ++i )
Str2[i] ^= 0x66u;
还原得到一部分flag _th3_junk_c0d3!!!}
encrypted_data = [
57, 18, 14, 85, 57, 12, 19, 8, 13, 57,
5, 86, 2, 85, 71, 71, 71, 27
]
xor_key = 0x66
decrypted_data = []
for byte in encrypted_data:
decrypted_data.append(byte ^ xor_key)
flag = ''.join([chr(b) for b in decrypted_data])
print("解密结果:", flag)
分析sub_45A9A0函数逆向还原得到第二部分flag
# 密文数组
encrypted_data = [
0x68, 0x6A, 0x60, 0x5E, 0x6F, 0x61, 0x76, 0x74, 0x2B, 0x70,
0x5A, 0x6D, 0x60, 0x68, 0x2B, 0x71, 0x2E, 0x5F
]
decrypted_data = []
for byte in encrypted_data:
decrypted_data.append(byte + 5)
flag = ''.join([chr(b) for b in decrypted_data])
print("解密结果:", flag)
14、unwind
考点:tea加密 反调试
题解:
(1)根据题目提示是tea加密和SEH;定位main函数
发现有混淆的操作和反调试;我先将MEMORY[0] = 0;的汇编代码nop掉就可以去除混淆操作了
nop掉这一段
然后nop掉mov;去除反调试函数
可以看出是TEA加密;提取一下密文
#include <stdint.h>
#include<stdio.h>
#include<iostream>
using namespace std;
void tea_decrypt(uint32_t* v, uint32_t* k) {
uint32_t sum = 0xC6EF3720;
uint32_t delta = 0x9e3779b9;
uint32_t v0 = v[0], v1 = v[1];
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
for (int i = 0; i < 32; i++) {
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
sum -= delta;
}
v[0] = v0;
v[1] = v1;
}
void fun(uint32_t *plaintext, uint32_t *key,int ok ) {
tea_decrypt(plaintext, key);
for (int i = 0 ; i < 2 ; i ++ ) {
int tmp = plaintext[i];
while (tmp) {
if(ok)
printf("%c", tmp % 0x100);
tmp /= 0x100;
}
}
}
int main() {
//0x55, 0x1A, 0x27, 0x6D, 0xEA, 0x8E, 0x4C, 0x5A
unsigned int byte_B8A000[16] = {
3832275802u,
1325565702u,
3251494723u,
3681261687u,
2571319439u,
3038942179u,
481361187u,
3471762405u,
732765487u,
4187493796u,
4196789208u,
1924604267u,
775095225u,
2079018201u,
4182288373u,
4231568784u,
};
uint32_t key[18] = {959666244, 13872, 0, 0, 1952673636u, 3371631u, 0u, 0u, 827872582u,
1431916353u,
78u,
0u,
1702245202u,
1919248754u,
0u,
0u,
};
int cd = 0;
for (int i = 0 ; i < 8 ; i += 2) {
fun(byte_B8A000 + i, key + cd , 1);
cd += 4;
}
cd = 0;
for (int i = 8 ; i < 16 ; i += 2) {
fun(byte_B8A000 + i, key + cd , 0);
cd += 4;
}
cd= 0;
for (int i = 8 ; i < 16 ; i += 2 , 1) {
fun(byte_B8A000 + i, key + cd,1);
cd += 4;
}
}
moectf{WoOo00Oow_S0_interesting_y0U_C4n_C41l_M3tW1c3_BY_Unw1Nd~}
三:Crypto
1、ABC
考点:二进制转二维码
题解:
(1)题目给出了a.npy b.npy c.npy Code in My Matrix A∗B∗CA∗B∗C;题目要求计算矩阵的乘积 A×B×CA×B×C,其中 AA、BB、CC 是从 .npy
文件中加载的矩阵
import numpy as np
# 从 .npy 文件中加载矩阵
A = np.load('a.npy')
B = np.load('b.npy')
C = np.load('c.npy')
# 计算矩阵乘积 A * B * C
result = np.dot(np.dot(A, B), C)
# 输出结果
print("Result of A * B * C:")
print(result)
得到了一个矩阵只包含 -1 1;猜测是二进制转二维码
import numpy as np
# 给定的二进制矩阵
binary_matrix = np.array([
[0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0],
[0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0],
[0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1],
[0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0],
[1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1],
[0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0],
[0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1],
[1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0],
[0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1],
[0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0],
[0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1],
[1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0],
[0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0],
[0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0],
[0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
[0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
[0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1]
])
# 将二进制矩阵转换为二进制字符串
binary_string = ''.join(str(bit) for row in binary_matrix for bit in row)
print("Binary String:", binary_string)
然后二进制转二维码(在线)
扫码得到flag
moectf{U_C4n_D0_uR_AipH4_B_See_2023}
2、Crypto 入门指北
考点:rsa
题解:
(1)题目给了一个python脚本;运行就是flag
moectf{weLCome_To_moeCTf_CRypTo_And_enjoy_THis_gAme!_THis_is_yoUR_fLAg!}
3、baby_e
考点:RSA—小e攻击(低解密指数攻击)
题解:
(1)属于比较弱智的题目:直接上脚本
from gmpy2 import iroot
import libnum
e=
n=
k = 0
while 1:
res=iroot(c+k*n,7)
if(res[1]==True):
print(libnum.n2s(int(res[0])))
break
k=k+1
3、bad_E
考点:RSA-e phi有限域不互素
from gmpy2 import *
from Crypto.Util.number import *
e = 65537
p=
q=
c=
n = p * q
phi_n = (p - 1) * (q - 1)
print(gcd(e, p - 1))
d = invert(e, (q - 1))
m = pow(c, d, q)
print(long_to_bytes(m))
4、bad_random
考点:MD5爆破
from itertools import product
import string
import hashlib
target_hash = "83990600a2ddb3a57dd150050df128f3"
suffix = "ZhZe"
# 生成所有4位字母+数字组合(共36^4=1,679,616种)
charset = string.digits + string.ascii_letters # 0-9 + a-z + A-Z
for chars in product(charset, repeat=4):
candidate = ''.join(chars) + suffix
if hashlib.md5(candidate.encode()).hexdigest() == target_hash:
print(f"Found: {''.join(chars)}")
exit()
5、crypto指北
考点:RSA
from Crypto.Util.number import * # 一个非常好用的crypto库
p = 0xe82a76eeb5ac63e054128e040171630b993feb33e0d3d38fbb7c0b54df3a2fb9b5589d1205e0e4240b8fcb4363acaa4c3c44dd6e186225ebf3ce881c7070afa7
q = 0xae5c2e450dbce36c8d6d1a5c989598fc01438f009f9b4c29352d43fd998d10984d402637d7657d772fb9f5e4f4feee63b267b401b67704979d519ad7f0a044eb
c = 0x4016bf1fe655c863dd6c08cbe70e3bb4e6d4feefacaaebf1cfa2a8d94051d21e51919ea754c1aa7bd1674c5330020a99e2401cb1f232331a2da61cb4329446a17e3b9d6b59e831211b231454e81cc8352986e05d44ae9fcd30d68d0ce288c65e0d22ce0e6e83122621d2b96543cec4828f590af9486aa57727c5fcd8e74bd296
e = 65537
n = p*q
phi = (p-1) * (q-1) # 你知道什么是 欧拉函数吗 [1]
d = pow(e, -1, phi) # 什么是乘法逆元? [2]
m = pow(c,d,n)
print(long_to_bytes(m))
6、ez_chain
考点:AES加密
题解:不会!
7、factor_signin
考点:RSA分解n
8、factorize_me!
题解:RSA
(1)题目
from Crypto.Util.number import getPrime
from math import prod
from sympy import nextprime
from random import choices
with open('flag.txt', 'rb') as fs:
flag = fs.read().strip()
primes = [getPrime(512) for _ in range(9)]#生成9个512素数
print(f"{prod(primes) = }")#输出素数的乘积
print(f"{prod(p - 1 for p in primes) = }")#每个素数减1的成绩
primes2 = [nextprime(p) for p in choices(primes, k=3)]#选取三个素数
n = prod(primes2)#三个素数的成绩
e = 65537
c = pow(int.from_bytes(flag, 'big'), e, n)
print(f'n = {n}')
print(f'e = {e}')
print(f'c = {c}')
(2)解密:很简单的一个逻辑
from Crypto.Util.number import *
e = 65537
c = 841335863342518623856757469220437045493934999201203757845757404101093751603513457430254875658199946020695655428637035628085973393246970440054477600379027466651143466332405520374224855994531411584946074861018245519106776529260649700756908093025092104292223745612991818151040610497258923925952531383407297026038305824754456660932812929344928080812670596607694776017112795053283695891798940700646874515366341575417161087304105309794441077774052357656529143940010140
p = 6991223361118904775931217829045348785013077549030883418924453538830605687999480005714979700653172534877541317997174968789510984315425270755055110913347349
q = 9987009117206906203158749743824168660291275882852229158070368815160479543708376165641735042845357978292384303332559592302507789120810447986634662721490849
r = 12876877424944854147075816504195994138450356002779004886384584287813869165469217718717854027672044903401715370348223932937626725119320180795716270261309141
n = p * q * r
phi = (p-1)*(q-1)*(r-1)
d = pow(e,-1,phi)
m = pow(c,d,n)
print(long_to_bytes(m))
#moectf{you_KNow_how_to_faCtorize_N_right?_9?WPIBung6?WPIBung6?WPIBund6?}
9、feistel
考点:DES Feistel算法
题解:(1)有点类似于==梅森旋转算法==
题目:
from Crypto.Util.number import *
round = 2
flag = open("./secret", "rb").read().strip()
def f(m, key):
m = m ^ (m >> 4)
m = m ^ (m << 5)
m = m ^ (m >> 8)
m ^= key
m = (m * 1145 + 14) % 2**64
m = (m * 1919 + 810) % 2**64
m = (m * key) % 2**64
return m
def enc(m, key, round):
key = bytes_to_long(key)
left = bytes_to_long(m[:8])
right = bytes_to_long(m[8:])
for i in range(round):
left, right = right, f(right, key) ^ left
left, right = right, left
return long_to_bytes(left).rjust(8, b"\x00") + long_to_bytes(right).rjust(8, b"\x00")
def padding(m):
mlen = len(m)
pad = 16 - mlen % 16
return m + pad * bytes([pad])
def ecb_enc(m, key):
m = padding(m)
mlen = len(m)
c = b""
for i in range(mlen // 16):
c += enc(m[i * 16 : i * 16 + 16], key, round)
return c
print(ecb_enc(flag, b"wulidego"))
# b'\x0b\xa7\xc6J\xf6\x80T\xc6\xfbq\xaa\xd8\xcc\x95\xad[\x1e\'W5\xce\x92Y\xd3\xa0\x1fL\xe8\xe1"^\xad'
feistel加密结构,加解密过程一样,就是轮密钥相反;而这里每轮密钥都是wulidego,所以说这个加解密是完全一样的
moectf{M@g1cA1_Encr1tion!!!}
10、feistel_promax
考点:DES Feistel算法
题解:
(1)相比于上一题,这题key不知,仅根据此条件根本无从下手,不过观察仔细的话会发现最后一行,加密的主体是padding(flag)
,而加密过程中又进行了一次padding
,所以说进行了两次padding
from Crypto.Util.number import *
round = 2
def f(m, key):
m = m ^ (m >> 4)
m = m ^ (m << 5)
m = m ^ (m >> 8)
m ^= key
m = (m * 1145 + 14) % 2**64
m = (m * 1919 + 810) % 2**64
m = (m * key) % 2**64
return m
def dec(m, key, round):
key = bytes_to_long(key)
left = bytes_to_long(m[:8])
right = bytes_to_long(m[8:])
for i in range(round):
left, right = right, f(right, key) ^ left
left, right = right, left
return long_to_bytes(left).rjust(8, b"\x00") + long_to_bytes(right).rjust(8, b"\x00")
def ecb_dec(c, key):
clen = len(c)
m = b""
for i in range(clen // 16):
m += dec(c[i * 16 : i * 16 + 16], key, 2)
return m
m = b'\x10\x10\x10\x10\x10\x10\x10\x10'
ct = b'B\xf5\xd8gy\x0f\xaf\xc7\xdf\xabn9\xbb\xd0\xe3\x1e0\x9eR\xa9\x1c\xb7\xad\xe5H\x8cC\x07\xd5w9Ms\x03\x06\xec\xb4\x8d\x80\xcb}\xa9\x8a\xcc\xd1W\x82[\xd3\xdc\xb4\x83P\xda5\xac\x9e\xb0)\x98R\x1c\xb3h'
c = bytes_to_long(ct[-8:]) ^ bytes_to_long(m)
bin_c = bin(c)[2:].rjust(64,'0') # = f(M[8:],key),其中M = m * 2
k1 = [b'']
for i in range(1,5):
k2 = []
for KEY in k1:
for j in range(2**16):
key1 = long_to_bytes(j) + KEY
cc = f(bytes_to_long(m),bytes_to_long(key1)) # = f(M[8:],key)
bin_cc = bin(cc)[2:].rjust(64,'0')
if bin_cc[-16*i:] == bin_c[-16*i:]:
k2.append(key1)
k1 = k2
# print(k1)
# k1= [b'4t*zFD\xac\xb4', b'\xb4t*zFD\xac\xb4', b'\\q\x0f\x00w\xeb\xc1"', b'\xdcq\x0f\x00w\xeb\xc1"']
for KEY in k1:
flag = ecb_dec(ct,KEY)
print(flag)
# moectf{F_func_1s_n1t_Ve5y_$EcU%e}
11、giant_e
考点:rsa-维纳攻击
题解:
(1)题目给出的e很大;猜测可能是维纳攻击
12、minipack
考点:
13、n&n
考点:RSA—共模攻击
import gmpy2
from Crypto.Util.number import getPrime,long_to_bytes
e1 =
e2 =
n =
c1 =
c2 =
_,s1, s2 = gmpy2.gcdext(e1, e2)
m = pow(c1, s1, n) * pow(c2, s2, n) % n
print(long_to_bytes(m))
14、rsa_signin
考点:RSA—广播攻击
题解:
(1)题目给出了多组nc ;可能是广播攻击或者中国剩余定理;最后发现是广播攻击
from Crypto.Util.number import *
from gmpy2 import *
e = 65537
n1 = 17524722204224696445172535263975543817720644608816706978363749891469511686943372362091928951563219068859089058278944528021615923888948698587206920445508493551162845371086030869059282352535451058203615402089133135136481314666971507135484450966505425514285114192275051972496161810571035753943880190780759479521486741046704043699838021850105638224212696697865987677760179564370167062037563913329993433080123575434871852732981112883423565015771421868680113407260917902892944119552200927337996135278491046562185003012971570532979090484837684759828977460570826320870379601193678304983534424368152743368343335213808684523217
c1 = 6870605439714128574950893771863182370595667973241984289208050776870220326525943524507319708560433091378319367164606150977103661770065561661544375425887970907060665421562712515902428061727268441585629591525591001533188276465911918724808701356962871139957343861919730086334623932624184172272488406793955068827527130338853980609365042071290967556159598511667974987218999253443575482949258292953639729393456515185185102248985930422080581185292420347510600574229080211050520146551505605537486989306457793451086767402197128573781597156939709237045132856159368959981648969874765462190363842275826077556314448408825308218451
n2 = 24974121071274650888046048586598797033399902532613815354986756278905133499432183463847175542164798764762683121930786715931063152122056911933710481566265603626437742951648885379847799327315791800670175616973945640322985175516271373004547752061826574576722667907302681961850865961386200909397231865804894418194711076667760169256682834206788730947602211228930301853348503098156592000286467190760378847541148772869356389938999094673945092387627113807899212568399028514283219850734634544982646070106811651490010946670117927664594365986238107951837041859682547029079035013475238052160645871718246031144694712586073789250183
c2 = 10324627733161143472233272675096997859064721978612320424254305978486200326061730105384511258706433940176741256952824288120499229240005823611541292676234913505775165761543820764046537413943393325463602612485849366939102550336256797820440347815027443410399157963547486098366749815425187247171697678576246606105486928212486117878157055321965270364583625270716186820068538749425299073309429589410882809098930213978117176627031795312102177342499674234163614021182116065492884880492891668658240362567156235958605768725892407536211503981819707919444725863397622629226309480836486427388484176463279384813974310500625102568341
n3 = 14215826065753265334521416948225868542990756976323308408298887797364519400310818641526401662106853573185085731682502059761982246604277475488691297554851873224516934619888327644352138127883043558424300092247604877819821625587944308487310522092440517150600171819145803937177931473336108429889165189521078678397694303305705260759351843006130968234071638035667854938070597400634242396852782331461576526836227336952718230741560369621645218729592233657856104560425642219241082727756696967324334634822771842625681505869025740662258929200756109704988223034840699133778958569054445520305361142302393767439478256174414187983763
c3 = 415916446053083522663299405080903121619846594209033663622616979372099135281363175464579440520262612010099820951944229484417996994283898028928384268216113118778734726335389504987546718739928112684600918108591759061734340607527889972020273454098314620790710425294297542021830654957828983606433731988998097351888879368160881316237557097381718444193741788664735559392675419489952796677690968481917700683813252460912749931286739585465657312416977086336732056497161860235343155953578618273940135486362350057858779130960380833359506761436212727289297656191243565734621757889931250689354508999144817518599291078968866323093
n4 = 12221355905532691305226996552124162033756814028292708728711809229588190407700199452617060657420166395065565154239801465361510672853972152857415394695376825120759202857555325904640144375262531345320714166285999668052224661520834318497234299585219832943519644095197479639328120838919035625832361810964127485907587199925564724081163804724975965691571850962714258888527902920462746795712011579424322515292865504642938090200503979483095345893697972170153990274670257331483858538617460680462369680572833191232126527727222302641204529110948993583190295067970240051042000918629138767209918572311469915774910003970381965123241
c4 = 2248834602646305164283014556051672824689884721514190813323189875541899566338153534858709617544459297836048770439230174669883719627734394673012731609952869246171300132019334542245094425654362711870373095782083791160029789553806741967408922001051006100049326921742208757147339981269528740944842177729701945606827918253016001436218891580980192743564642120923356793292885805519110411357830040053435569937296612987581482128241218218550319154933831743819546558930918761162723110000328532730751591375727881221199739397698390594797621758011191224528339478784930214820615602510460640307707682865125229937141010351138099874025
n5 = 18152103454920389919231636321286527841833809319334215885641536161086810144890443857211776387914779781628740172079478910188540146498426564211851629962338413488555121865779016981727229209606498886170396500155102635962395243364899026418106378234307821492609778555173516000309435730752571818439328803899462791834490025768785383592935046996428331508608555503567191807692523852530836008436655164751054189301721070209363416058642811329040202582026786024825518381761299547703962502636888833428457116986351812252188468878701301184044948733274488264320930936362549028124581962244201377136969591119942276742760215403738913067567
c5 = 2797812094994121597295362327809389195134238119144547570610194659000554967367804835006774413888965325870488368112707535584687083342412367127561646136089638402907513075405746055834487062923240856950047936297155455745928810738711368950139327254040579266046642851362228893522740216519732851152162928545416236075387903789535000820423985522550638100049857678600662008021574841083416323980817348573062083159710189689337626277009675683473560325178417766400002763719953723259300977655801234386662217462862844994462505601804422871991694828697337752697234180117437785537788728412520613916334045368736691714704501962513954509705
n6 = 22877887459293720334652698748191453972019668578065068224653972884599636421200068659750242304040301306798039254241668648594556654589309801728248683586229288074709849246660525799452637187132633064172425677552176203292787732404537215347782229753837476655088638984496409603054524994383358547132112778403912563916886533181616856401929346567686400616307916690806467019665390260267596320840786982457521423178851498130935577260638269429250197050326097193841333205073650802709022947551398142692735680419453533128176592587955634333425401930362881423044363132586170013458300714163531162544301477356808388416864173949089028317961
c6 = 12271947322974809255127222556723394446467844330408506340843897575503534175121932185624776713618037572593449207329510171212097269297133492090526270770286000839978630002819714376964416081198925899119135271459404333829811516667576167576916805217016117373027245648473458331936273975110163065432285322832123169216976420362833557809289561705091817949915218278430834098156335989014645979633658818904753942786129126233956314517292746008579152368541316795082120147520597254020266752859205131887527661767589367756335766220841483940854397440079467053684289006956034944336788288196391829411432383541473132962783883758561108297747
n7 = 19844333358004073542783728196775487079202832688982038135532362073659058674903791697765527614270399097276261983744620537925712167578187109058145015032736796457938148615396547198728652435169126585595701228287449135664667959433491335769206692390262797325133960778920452511673878233190120432257482339068405290918739453464061987163074129048150451046315248186376609350095502130018696275764450248681787926130463463923862832714969425813770847493135627599129546112143050369344208092649256659330284904392961574494907186727388685504929586018639846040474616307662546605623294842316524163106100888851228858194942825157286544846177
c7 = 9531264751315473345056673937611382755236533664089452852716992791452558274873158812669513178040971923528201631609089069182049526587423864397527252061341857426422965190913745048414029690931254119437249218321954899956104589066479231204536856131403590472063496956452030342299863907499976917750846369802185896519725837163530049157920978007252920334447236842959033879772444475877613295594785710745889554296655932909212643500877218304116451889820444820534937901427158918411546484157737612926382420354101675658160847653151539420222526999426483473829341628599881460824765758346670633385844187252696874025582747177333702736465
n8 = 16956880944655068255446705024149899655327230949463546092744762226005904114738078692036960935391303255804754787864713189658290361949509917704853428701870609882427423574672772606814823959758208695540116440342488334213300943604780971422918744381486937517952553797134323570131582724393100092308466968491068503301604506186521656059375518680612292667310641047190088814753025794048591445267711939066523165042651430468971452726568222388482323097260496415484997546126185688914792795834046855221759289007609518312601640548469651358391745947588643697900883634533872314566389446271647587564348026861264979727062157272541149018781
c8 = 16110326928338602237561005337578085623028116490564329920738844771341250444164294693848130674347672763073995755532723894042946521372321947507527854966013459795492930736187058535665041545095683801386814190612817128504426590828954205050425979880047802547011117626354405687170961272200066258220699329112978151044633994329352673342582175349200008181837211288847301836681860817044391028992501763375849046751094019224570802498414368189170656992427042010362385494565216988561215657424755648213390551881450141899860811844684546992754530755092358644968088017107313907435586729574798046187046145596726569637758312033849476689378
n9 = 16472195897077185060734002588086375750797253422014472876266294484788862733424113898147596402056889527985731623940969291811284437034420929030659419753779530635563455664549165618528767491631867637613948406196511848103083967995689432928779805192695209899686072900265108597626632371718430059561807147486376536203800038054012500244392964187780217667805308512187849789773573138494622201856638931435423778275004491853486855300574479177472267767506041000072575623287557610576406578525902565241580838652860552046216587141709709405062150243990097835181557208274750462554811004137033087430556692966525170882625891516050207318491
c9 = 11867731823522211833301190385669833752050387304375114576570892885641949969365352586215693183003550684262313893105989683214739695968039039944442567581277252581988489020834299896625977474857889570528169919064941042132119301236852358823696947330423679033138054012027878783478922023431469564210485180679933264749281963405243082505688901662659030897104957499953192201440290084373968716271056483463909282407034181891901928790601973222643210525000717355062752079302291729448234374709852429885984987094307177760741403086538949190424454337896501402430653783597070178968921411867485584517214777073301007918941216316241784521708
n10 = 13890749889361612188368868998653029697326614782260719535555306236512452110708495623964530174188871342332417484996749651846510646453983388637377706674890018646246874688969342600780781646175634455109757266442675502522791531161284420286435654971819525519296719668701529481662071464145515727217108362496784024871976015116522898184301395037566514980846499856316532479656908169681719288258287756566886281183699239684997698487409138330229321935477734921670373632304542254938831218652340699024011371979519574576890581492623709896310465567043899767342676912434857372520308852745792360420376574037705943820090308501053778144141
c10 = 6250115196713939477947942995075509357173312813431601073354390451609559579925704891503987992181988654989477525811826607070378476102616752398280691012244301950194800995432882828020405062344160270290542566163969692748126314259624623341922057435728127596172871894887055305291345372720594481096374310285437492746765510292863238933163142677773310305789984897974266961231555124787205980411992251387207335655129551950825339766848166539671565212408741432649813058363660321480995187545006718837863674527475323414266732366507905974800565463011676462244368010182725161416783875646259625352308599198614681446394427674340328493047
n11 = 21457499145521259498911107987303777576783467581104197687610588208126845121702391694574491025398113729462454256070437978257494064504146718372095872819969887408622112906108590961892923178192792218161103488204912792358327748493857104191029765218471874759376809136402361582721860433355338373725980783308091544879562698835405262108188595630215081260699112737457564998798692048522706388318528370551365364702529068656665853097899157141017378975007689790000067275142731212069030175682911154288533716549782283859340452266837760560153014200605378914071410125895494331253564598702942990036163269043699029806343766286247742865671
c11 = 6269656777204332618433779865483197625538144405832409880710764183039800286008967127279281167109250083159801218370191973055663058165456565194979210256278526713608759141588082614531352489547674696723140599892318118960648862531538435596775798128845789504910467783731144808685373807716609662688064728614003904579841055786083326311313295311152563668422289435606771091246147867715987583149743032723028324394173498623642539175178996531881058274717907066845565199058931743481410454382746158558886667761300257488769795092777021292335562818583719708133179974425584610403335487082478848975656282384575767178925517257692365828720
for i in range(1, 12):
for j in range(i + 1, 12):
ni = eval("n" + str(i))
nj = eval("n" + str(j))
p = gcd(ni, nj)
if p > 1:
c = eval("c" + str(i))
q = ni // p
d = invert(e, (p - 1) * (q - 1))
flag = long_to_bytes(pow(c, d, ni))
print(flag)
14、|p-q|
考点:rsa p q很接近
题解:
(1)核心代码
p = getPrime(2048)
q = next_prime(p)
发现p 和q 很接近;直接对n进行开方得到p;然后计算下一个素数可以算出p
from Crypto.Util.number import *
from gmpy2 import *
flag = 307746143297103281117512771170735061509547958991947416701685589829711285274762039205145422734327595082350457374530975854337055433998982493020603245187129916580627539476324521854057990929173492940833073106540441902619425074887573232779899379436737429823569006431370954961865581168635086246592539153824456681688944066925973182272443586463636373955966146029489121226571408532284480270826510961605206483011204059402338926815599691009406841471142048842308786000059979977645988396524814553253493672729395573658564825709547262230219183672493306100392069182994445509803952976016630731417479238769736432223194249245020320183199001774879893442186017555682902409661647546547835345461056900610391514595370600575845979413984555709077635397717741521573798309855584473259503981955303774208127361309229536010653615696850725905168242705387575720694946072789441481191449772933265705810128547553027708513478130258801233619669699177901566688737559102165508239876805822898509541232565766265491283807922473440397456701500524925191214292669986798631732639221198138026031561329502985577205314190565609214349344303324429408234237832110076900414483795318189628198913032900272406887003325858236057373096880675754802725017537119549989304878960436575670784578550
n = 329960318345010350458589325571454799968957932130539403944044204698872359769449414256378111233592533561892402020955736786563103586897940757198920737583107357264433730515123570697570757034221232010688796344257587359198400915567115397034901247038275403825404094129637119512164953012131445747740645183682571690806238508035172474685818036517880994658466362305677430221344381425792427288500814551334928982040579744048907401043058567486871621293983772331951723963911377839286050368715384227640638031857101612517441295926821712605955984000617738833973829140899288164786111118033301974794123637285172303688427806450817155786233788027512244397952849209700013205803489334055814513866650854230478124920442832221946442593769555237909177172933634236392800414176981780444770542047378630756636857018730168151824307814244094763132088236333995807013617801783919113541391133267230410179444855465611792191833319172887852945902960736744468250550722314565805440432977225703650102517531531476188269635151281661081058374242768608270563131619806585194608795817118466680430500830137335634289617464844004904410907221482919453859885955054140320857757297655475489972268282336250384384926216818756762307686391740965586168590784252524275489515352125321398406426217
q = next_prime(isqrt(n))
p = n // q
assert p*q == n
e = 0x10001
phi = (p - 1)*(q - 1)
d = inverse(e, phi)
m = pow(flag, d, n)
print(long_to_bytes(m))
不包含web; misc;pwn;web misc太基础;pwn不会!!我是菜鸡