如何从字节字符串列表中移除空字节与无效单字节元素?
解决.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
相关产品推荐
相关产品推荐

