最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

Cryptohack wp (GENERAL篇)|世界热消息

来源:博客园

本篇是GENERAL篇,以下题目中没提及到的题目均在course的其他篇目中

Encoding Challenge

给了三个文件,一个挑战文件和两个示例文件,主要是pwntools库的运用:挑战代码如下:


(资料图片仅供参考)

#!/usr/bin/env python3from Crypto.Util.number import bytes_to_long, long_to_bytesfrom utils import listener # this is cryptohack"s server-side module and not part of pythonimport base64import codecsimport randomFLAG = "crypto{????????????????????}"ENCODINGS = [    "base64",    "hex",    "rot13",    "bigint",    "utf-8",]with open("/usr/share/dict/words") as f:    WORDS = [line.strip().replace(""", "") for line in f.readlines()]class Challenge():    def __init__(self):        self.challenge_words = ""        self.stage = 0    def create_level(self):        self.stage += 1        self.challenge_words = "_".join(random.choices(WORDS, k=3))        encoding = random.choice(ENCODINGS)        if encoding == "base64":            encoded = base64.b64encode(self.challenge_words.encode()).decode() # wow so encode        elif encoding == "hex":            encoded = self.challenge_words.encode().hex()        elif encoding == "rot13":            encoded = codecs.encode(self.challenge_words, "rot_13")        elif encoding == "bigint":            encoded = hex(bytes_to_long(self.challenge_words.encode()))        elif encoding == "utf-8":            encoded = [ord(b) for b in self.challenge_words]        return {"type": encoding, "encoded": encoded}    #    # This challenge function is called on your input, which must be JSON    # encoded    #    def challenge(self, your_input):        if self.stage == 0:            return self.create_level()        elif self.stage == 100:            self.exit = True            return {"flag": FLAG}        if self.challenge_words == your_input["decoded"]:            return self.create_level()        return {"error": "Decoding fail"}listener.start_server(port=13377)

这是一个Python脚本,定义了一个名为Challenge的类,该类生成涉及各种编码的一系列挑战。

脚本首先导入一些模块:Crypto.Util.number中的bytes_to_long和long_to_bytes,以及Python标准库中的base64和codecs。它还导入一个名为listener的模块,该模块不是Python的一部分,而是专门针对cryptohack平台开发的。

接下来,脚本定义了一个可能的编码列表ENCODINGS。这些编码用于生成挑战。

然后,脚本打开一个名为/usr/share/dict/words的文件,其中包含一个单词列表,并将文件的内容读入一个名为WORDS的列表中。文件的每一行都被去除了任何空白,并且单引号被移除。

Challenge类有两个方法:__init__和challenge。__init__方法初始化了两个实例变量:challenge_words,用于保存当前阶段的挑战词,以及stage,用于跟踪当前挑战的阶段。

create_level方法为当前阶段生成一个新的挑战。它通过递增stage变量,从WORDS列表中随机选择三个单词来形成challenge_words字符串,并从ENCODINGS列表中随机选择一个编码。根据所选择的编码,create_level使用以下方法之一对challenge_words字符串进行编码:

base64.b64encode:将challenge_words字符串编码为base64。encode().hex():将challenge_words字符串编码为十六进制字符串。codecs.encode(challenge_words, "rot_13"):使用ROT13编码challenge_words字符串。hex(bytes_to_long(self.challenge_words.encode())):将challenge_words字符串编码为十六进制格式的大整数。[ord(b) for b in self.challenge_words]:将challenge_words字符串编码为表示字符串中字符的Unicode代码点的整数列表。create_level方法返回一个包含编码类型和编码后挑战词的字典。

challenge方法是主要的函数,它将用户输入作为参数,并返回响应。如果当前阶段为0,challenge通过调用create_level生成一个新的挑战。如果当前阶段为100,challenge将实例变量exit设置为True并返回标志。否则,如果用户输入与解码后的挑战词匹配,challenge通过调用create_level生成一个新的挑战。否则,它返回一个错误消息。

脚本最后通过使用listener模块在端口13377上启动服务器。

脚本的主要目的是生成一系列的编码挑战。每个挑战包括一个编码类型和一个经过特定编码的挑战词。用户需要解码挑战词并将其作为输入提供给脚本,以通过当前的挑战并进入下一个阶段。在挑战的前100个阶段中,用户需要成功解码挑战词才能进入下一个阶段。当达到第100个阶段时,脚本会返回标志。这意味着用户需要连续成功解码100个挑战才能获取完整的flag解密代码如下:

from pwn import *import jsonr = remote("socket.cryptohack.org", 13377, level = "debug")def json_recv():    line = r.recvline()    return json.loads(line.decode())def json_send(hsh):    request = json.dumps(hsh).encode()    r.sendline(request)from binascii import *from base64 import b64decode as ddfrom string import *def rot13(x):    ss = ascii_lowercase    res = ""    for i in x:        if i in ss:            res += ss[(13+ss.index(i))%26]        else:res += i    return resdef dec(tp,c):    if tp == "bigint":        m = unhexlify(c[2:]).decode()    elif tp == "base64":        m = dd(c.encode()).decode()    elif tp == "rot13":        m = rot13(c)    elif tp == "hex":        m = bytes.fromhex(c).decode()    elif tp == "utf-8":        m = "".join(chr(i) for i in c)    return mdef func(received):    print("Received type: ",end="")    print(received["type"])    print("Received encoded value: ",end="")    print(received["encoded"])    c = received["encoded"]    tp = received["type"]    to_send = {"decoded": dec(tp,c)}    print("to_sent:",to_send)    json_send(to_send)    rrr = json_recv()    print(rrr,"================",sep = "\n")    return rrrrcvd = json_recv()for i in range(100):    rcvd = func(rcvd)

Lemur XOR

下载下来是两张图片:lemur.png:flag.png:

两张图片异或

from PIL import Imageimport numpy as np# 打开第一张图像image1 = Image.open("flag.png")# 打开第二张图像image2 = Image.open("lemur.png")# 将图像转换为NumPy数组array1 = np.array(image1)array2 = np.array(image2)# 执行异或运算result_array = np.bitwise_xor(array1, array2)# 创建新的图像对象result_image = Image.fromarray(result_array)# 保存结果图像result_image.save("result.jpg")

得到图像为:

关键词: