pwn(CTF)库的U16函数是如何工作的?

问题描述 投票:0回答:1

我正在尝试用Python解决uni挑战,挑战位于CTF服务器中(使用pwn库连接)。我可以通过发送密钥与服务器交互,例如:1-帮助、2-从数组读取信息等

提交密钥后,服务器要求我还提供序列化数据。 例如,要从数组读取信息,我应该提交以下内容:0100(01是读取的关键),0500(5是行),0400(4是列)。所以,我发送 010005000400。

我可以看到挑战代码,以便了解它在服务器中的工作原理。 输入经过以下操作:

data = input(" > Enter serialized data: ").strip() #input
serialized_input = binascii.unhexlify(data.encode()) #unhexlifying

之后,它获取输入的前两个字节(0100)并检查它是否与操作代码匹配。 (0x0001用于读取)

例如:

if u16(serialized_input[0:2]) == 0x0001: #u16(b'\x01\x00')
        row = u16(serialized_input[2:4]) #u16(b'\x05\x00')
        col = u16(serialized_input[4:6]) #u16(b'\x04\x00')
        print(f"0x{ram.read(row, col):02x}")  

u16 函数是二进制利用和 CTF 挑战背景下的常见实用函数。它通常用于将 2 字节序列(16 位)解释为无符号整数。(来自 ChatGPT)

def u16(data):
    return int.from_bytes(data, byteorder='big') 

这个函数没有在我的代码中定义,它是 pf pwn 库的一部分。

所以,我想执行检查我的工作的操作。此操作的代码是0xcafe。我需要提出一些输入,这将通过此 if 语句:


if u16(serialized_input[0:2]) == 0xcafe:

问题是我什至不确定u16(解包函数)可以返回字母。我更不知道解压后两个字节可能是“咖啡馆”

我尝试使用“cafe”作为输入,并得到输出 65226。我尝试使用 65226 作为输入,但得到 20998 作为输出。我尝试使用 65226 作为二进制,但由于 u16 仅占用 2 个字节,而 65226 的二进制表示长度超过 2 个字节,所以没有成功。

input = 'cafe'
    serialized_input = binascii.unhexlify(input.encode())
    result = u16(serialized_input[0:2]) # u16(b'\xca\xfe')
python hex byte ctf
1个回答
0
投票

我复制了代码并在我的机器上运行它,并使用咖啡馆作为输入对我有用。这是因为它不检查字符串 0xcafe,而是检查十六进制数字。

用Python说

打印(“赢”)如果 0xcafe == 51966 否则打印(“L”)

这张打印的胜利

同时在 python3 终端中输入 0xcafe 将计算为 51966

尽管在此程序中输入 51966 不会计算为 0xcafe,因为如果您将十进制转换为十六进制,无论 u16(serialized_input[0:2]) 计算结果如何,输入都将被非十六进制化,但将其放入十进制到十六进制转换器中将为您提供原始输入

抱歉,如果我遗漏了某些内容或完全错误,请不要投票。

:)

© www.soinside.com 2019 - 2024. All rights reserved.