我正在尝试用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')
我复制了代码并在我的机器上运行它,并使用咖啡馆作为输入对我有用。这是因为它不检查字符串 0xcafe,而是检查十六进制数字。
用Python说
打印(“赢”)如果 0xcafe == 51966 否则打印(“L”)
这张打印的胜利
同时在 python3 终端中输入 0xcafe 将计算为 51966
尽管在此程序中输入 51966 不会计算为 0xcafe,因为如果您将十进制转换为十六进制,无论 u16(serialized_input[0:2]) 计算结果如何,输入都将被非十六进制化,但将其放入十进制到十六进制转换器中将为您提供原始输入
抱歉,如果我遗漏了某些内容或完全错误,请不要投票。
:)