You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从字节字符串列表中移除空字节与无效单字节元素?

解决.rodata段分割后过滤无效字节串的问题

直接用列表推导式或者filter来一次性过滤,比用remove靠谱多了——remove报错要么是你要删的元素不在列表里,要么是遍历的时候修改列表导致索引混乱,完全没必要用它。

给你几个实用的过滤方案,按需选择:

方案1:过滤空串+仅保留可打印ASCII字节串

这是最常用的场景,只留能正常显示的字符串,过滤空串、单个不可打印控制字符(比如b'\x01'):

from pwn import *

elf = ELF('./your_binary')
# 提取.rodata段的原始数据
rodata_data = elf.get_section_by_name('.rodata').data()
# 分割后过滤
valid_byte_strings = [
    s for s in rodata_data.split(b'\x00') 
    if s  # 先过滤空串b''
    and all(32 <= c <= 126 or c == 9 for c in s)  # 检查每个字节是可打印ASCII(含制表符\t)
]

如果不需要保留制表符,把or c ==9删掉即可。

方案2:仅过滤空串和长度为1的不可打印字节

如果你的场景允许短字符串,但要去掉像b'\x01'这种单个不可打印字符:

valid_byte_strings = [
    s for s in rodata_data.split(b'\x00') 
    if not (len(s) == 1 and s[0] < 32)
]

额外提示:用pwntools内置方法省事儿

其实pwntools已经帮你做好了字符串提取,直接调用elf.strings()就能拿到二进制里所有可打印字符串,不用自己处理.rodata分割:

all_valid_strings = elf.strings()

如果只想提取.rodata段里的字符串,加个参数指定段即可:

rodata_strings = elf.strings(section='.rodata')

内容的提问来源于stack exchange,提问作者Mampenda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:40:33