初始Cython(代码分析+Cython语言实现)
题目:
from encrypt import encrypt_message
def bytes_to_hex(byte_data):
return "".join(format(byte, "02x") for byte in byte_data)
def main():
message = "xxxxxxxxxxxxxxxxxxx"
length = len(message)
# 调用Cython加密函数
encrypted_message = encrypt_message(message.encode("utf-8"), length)
# 转换为十六进制字符串
encrypted_hex = bytes_to_hex(encrypted_message)
# 保存加密后的消息到文件
with open("message.enc", "w") as f:
f.write(encrypted_hex)
if __name__ == "__main__":
main()
cdef extern from "math.h":
double sin(double x)
double cos(double x)
cdef extern from "stdlib.h":
void* malloc(size_t size)
void free(void* ptr)
def encrypt_message(char* message, int length):
cdef int i
cdef unsigned char* encrypted = <unsigned char*>malloc(length * sizeof(unsigned char))
for i in range(length):
encrypted[i] = (message[i] ^ int(sin(i) * 666) ^ int(cos(i) * 999)) & 0xFF
return encrypted
## 解密挑战
我们使用了一种自定义的加密算法来加密消息。算法使用了Cython语言实现。你的任务是补全代码解密这条消息。
## 文件说明
- `encrypt.pyx`:Cython实现的加密算法源码。
- `encrypt_message.py`:加密消息的脚本。
- `decrypt_message.py`:你需要补充的解密脚本。
- `message.enc`:加密后的消息。
- `setup.py`:编译Cython代码的脚本。
## 目标
编写 `decrypt_message.py` 脚本,解密 `message.enc` 文件中的消息。
提示:解密得到的内容使用32位md5小写加密提交flag。
script:
import math
from math import *
def hex_to_bytes(hex_data):
return bytes.fromhex(hex_data)
def decrypt_message(x):
flag = ""
# print("len>>>", len(x))
for i in range(len(x)):
# flag += chr((x[i] ^ int(sin(i) * 666) ^ int(cos(i) * 999)) & 0xFF)
flag += chr((x[i] ^ int(cos(i) * 999) ^ int(sin(i) * 666)) & 0xFF)
# print((x[i] ^ int(cos(i) * 999) ^ int(sin(i) * 666)))
# print((x[i] ^ int(cos(i) * 999) ^ int(sin(i) * 666)) & 0xFF)
# print(chr(x[i] & 0xFF))
# print(chr(x[i]))
return flag
# def encrypt_message(x):
# flag = ""
# test = ""
# print("len>>>", len(x))
# for i in range(len(x)):
# # flag += chr((x[i] ^ int(sin(i) * 666) ^ int(cos(i) * 999)) & 0xFF)
# flag += chr((x[i] ^ int(cos(i) * 999) ^ int(sin(i) * 666)) & 0xFF)
# # print((x[i] ^ int(cos(i) * 999) ^ int(sin(i) * 666)))
# test += hex((x[i] ^ int(cos(i) * 999) ^ int(sin(i) * 666)) & 0xFF)[2:].rjust(
# 2, "0"
# )
# print(test)
# return flag
def main():
with open(r"C:\Temp\202407MISC_难_PolarD&N_CTF_初识Cython\message.enc", "r") as f:
encrypted_hex = f.read()
print(encrypted_hex)
byte = hex_to_bytes(encrypted_hex)
print(byte)
flag = decrypt_message(byte)
print(flag)
# str = "ilovepolar"
# print(encrypt_message(str.encode()))
# print("\xc2".decode())
if __name__ == "__main__":
main()