以Python为例讨论高级编程语言程序的wire format与校验
2010-09-22 11:26:23 来源:WEB开发网程序的wire format不仅强调其在传输/交换时的作用,也强调其“可执行”的属性——接收的一方在获取以wire format为格式的程序后,应该有环境能直接执行该程序;既可以是本地代码的直接执行,也可以是由解释器解释执行。
高级编程语言编写的程序的wire format
高级编程语言(high-level language, HLL)编写的程序在wire format上有许多选择:追求执行效率的语言多选择封装本地代码的格式,如PE或ELF等格式;追求可移植性、同时也注重执行效率的程序会选择封装某种形式的中间代码的格式,如Java的.class/.jar、.NET的PE/PE+、Python的.pyc/.pyo、ActionScript 3的.abc/.swf等格式;脚本语言大多直接选择发布源码,也就是文本格式,如Perl、Python、Ruby、JavaScript等。
Python在这当中是种“少数派”语言:它主要以源码为wire format,同时规范也允许包含编译后的Python字节码的.pyc文件与包含优化编译后的Python字节码的.pyo文件为wire format。上述三种格式都可以由Python解释器执行。后文会围绕这点再展开讨论。
封装本地代码为wire format
封装本地代码的wire format受的限制最少,只要当前用户有相应权限,几乎什么操作都可以做。数据类型基本上就是不同长度的整型、浮点数,外加字符串,本地代码一般不强调“类型安全”。代码与数据间没有明确的界线,代码段中可能混杂着数据。同时,控制流受的限制非常小,有可执行权限的内存页中的任意位置都是潜在的跳转目标;在DEP、ASLR等技术应用之前,这种任意执行代码的能力方便了许多shell coder肆意利用缓存溢出来获取系统的控制权。
若要采用静态方式分析本地代码,则可能遇到“代码发现”问题,也就是静态分析程序无法准确的把程序代码都定位出来的状况。造成该问题的原因有以下几点:
更多精彩
赞助商链接