visit_Attribute / visit_Subscript / inject_print_collector 是三个最典型的物化点(8.2 源码,注释为补注):
inject_print_collector 只是 print 改写的第二步;第一步在 visit_Name 里——它把 print / printed 两个名字改写成对局部临时变量 _print 的访问(8.2 源码,注释为补注):
步合起来(用 ast.unparse 还原 8.2 transformer 的实际产物):
def f():
_print = _print_(_getattr_) ← 第二步:函数开头注入的赋值
_print._call_print('hi') ← 第一步:print 名字的改写
这正是 P4 的着力点。_print = _print_(_getattr_) 在函数体执行之前求值:右边的裸名字 _print_ 解析到被 posonly 参数遮蔽的局部绑定(攻击者的 lambda),_getattr_ 在 f 内没有局部绑定、解析到真实的全局受信 hook。于是在受信 hook 一无所知的情况下,它自己作为实参被送进了攻击者的函数——这就是 P4 返回值里 的由来。两个后续细节:攻击者 lambda 的返回值是 None,_print 即为 None,于是 print(...) 触发的 _print._call_print(...) 抛 AttributeError——P4 的 payload 因此用 try/except 包住 print;而 lambda 体内 out.append(...) 这类访问没有局部遮蔽,仍走真实全局 hook(实测 P4 的 access_log 为 [['getattr', 'append']])——所以 P4 的判定条件只要求"捕获到 hook 对象",不要求日志为空。
专业黑客业务:渗透网站/网址 棋牌入侵破解 脚本搭建 ddos攻击/cc攻击 舆论删除/负面删除 BC博彩/投顾/股票/电子签/贷款/各类资料 学信网录入/改分/改档案 盘口改单/不中改中 域名劫持/Dns劫持 Pg赔率/爆率 Gov站点业务
技术小黄鸭🟡:@Xiaohyaa
inject_print_collector 只是 print 改写的第二步;第一步在 visit_Name 里——它把 print / printed 两个名字改写成对局部临时变量 _print 的访问(8.2 源码,注释为补注):
步合起来(用 ast.unparse 还原 8.2 transformer 的实际产物):
def f():
_print = _print_(_getattr_) ← 第二步:函数开头注入的赋值
_print._call_print('hi') ← 第一步:print 名字的改写
这正是 P4 的着力点。_print = _print_(_getattr_) 在函数体执行之前求值:右边的裸名字 _print_ 解析到被 posonly 参数遮蔽的局部绑定(攻击者的 lambda),_getattr_ 在 f 内没有局部绑定、解析到真实的全局受信 hook。于是在受信 hook 一无所知的情况下,它自己作为实参被送进了攻击者的函数——这就是 P4 返回值里 的由来。两个后续细节:攻击者 lambda 的返回值是 None,_print 即为 None,于是 print(...) 触发的 _print._call_print(...) 抛 AttributeError——P4 的 payload 因此用 try/except 包住 print;而 lambda 体内 out.append(...) 这类访问没有局部遮蔽,仍走真实全局 hook(实测 P4 的 access_log 为 [['getattr', 'append']])——所以 P4 的判定条件只要求"捕获到 hook 对象",不要求日志为空。
专业黑客业务:渗透网站/网址 棋牌入侵破解 脚本搭建 ddos攻击/cc攻击 舆论删除/负面删除 BC博彩/投顾/股票/电子签/贷款/各类资料 学信网录入/改分/改档案 盘口改单/不中改中 域名劫持/Dns劫持 Pg赔率/爆率 Gov站点业务
技术小黄鸭🟡:@Xiaohyaa