Python3执行二进制字符串格式命令时变量赋值不生效如何解决?
问题原因
exec()执行赋值操作有严格的命名空间作用规则:默认在函数内部调用exec()时,所有赋值操作都会作用于该函数的局部命名空间,函数执行结束后局部命名空间会被销毁,因此赋值的变量无法在全局作用域访问到。
解决方案
你可以根据使用场景选择以下任意一种方案:
- 方案1:显式指定
exec使用全局命名空间
给exec()传入第二、第三个参数为全局命名空间字典,让赋值操作直接作用于全局:
执行完成后即可在全局直接访问赋值的变量。def execbin(cmd): # 第二个参数为全局命名空间,第三个参数为局部命名空间,都设为globals()即可 exec(cmd.decode('ascii'), globals(), globals()) conn = remote(url, port) # 来自pwntools库 execbin(conn.recvline(keepends=False)) - 方案2:直接在全局作用域执行
exec,不封装函数
避免函数局部命名空间的影响,适合简单执行场景:conn = remote(url, port) cmd = conn.recvline(keepends=False).decode('ascii') exec(cmd) - 方案3:用自定义字典存储赋值变量,不污染全局命名空间
如果不想和现有全局变量重名冲突,可以单独用字典接收赋值结果:var_pool = {} def execbin(cmd, pool): exec(cmd.decode('ascii'), pool, pool) conn = remote(url, port) execbin(conn.recvline(keepends=False), var_pool) # 后续通过var_pool['b']即可访问到赋值的3156
注意:直接执行从远程端获取的代码存在极高的安全风险,仅可在完全信任远程端的测试、调试场景下使用。
内容的提问来源于stack exchange,提问作者Power_tile
相关产品推荐
相关产品推荐

