Python实现Padding Oracle CTF递归函数遇字节串更新方向错误求助
代码核心问题梳理
- 全局变量误用:函数内部直接调用全局
iv做切片,切片长度始终基于初始iv计算,不会随递归层数变化,所以你观察到iv[0:x]的切片长度没有按预期缩小。 - 单字节构造逻辑错误:通过十六进制字符串转字节的方式冗余且容易出错,i<16时补0的逻辑完全可以用更简单的
bytes([i])替代,避免构造出无效字节导致newbyte出现大量\x00前缀。 - 递归参数传递错误:递归调用时没有传入当前层已经算出的正确前缀,始终用全局
iv的切片作为前缀,导致字节更新方向不符合从后往前的预期。 - 缺少Padding更新逻辑:找到当前位置的正确字节后,没有将已破解的后缀与下一轮的Padding值做异或更新,无法正确触发下一轮的Padding校验。
- 无终止与返回逻辑:找到正确字节后没有终止循环,也没有将破解结果回传给上层递归,会出现多余遍历甚至结果被覆盖的问题。
修复后的参考实现
# 假设xor函数已经实现,输入两个等长字节串返回异或结果 def test_new_bytes(known_suffix, c_prev, block_size=16): # known_suffix是已经从后往前破解出来的正确后缀字节串 if len(known_suffix) == block_size: return known_suffix # 计算当前需要的padding长度 padding_len = len(known_suffix) + 1 # 前缀部分先填充0,长度是块大小减去当前padding长度 prefix = b'\x00' * (block_size - padding_len) # 把已知后缀先和padding_len异或,构造出能触发正确padding的基础后缀 prepared_suffix = bytes([b ^ padding_len for b in known_suffix]) for i in range(0, 256): # 构造当前尝试的iv_new iv_try = prefix + bytes([i]) + prepared_suffix if checkPadding(xor(iv_try, c_prev) + c_prev): # 找到正确的字节,计算出明文的对应字节 plain_byte = i ^ padding_len ^ c_prev[-(padding_len)] # 递归破解前一个字节,把新找到的字节加到已知后缀的前面 return test_new_bytes(bytes([plain_byte]) + known_suffix, c_prev, block_size) # 调用示例,破解第一个块用iv,破解第二个块用c0 plain_block1 = test_new_bytes(b"", iv) plain_block2 = test_new_bytes(b"", c0)
注意事项
- 递归终止条件为已知后缀长度等于块大小(通常是16),直接返回完整的明文块
- 每次找到正确字节后立刻返回,避免多余遍历
- 全程不依赖全局变量,所有上下文都通过参数传递,切片长度会随着递归层数自动调整
内容的提问来源于stack exchange,提问作者Arwa Lucky
相关产品推荐
相关产品推荐

