经典工具逆向分析(五):Coverity扫描规则逆向分析(一)
首先来看一下coverity扫描工具有哪些bin文件:
从文件大小和名称上来看,cov-analyze.exe文件应该会有扫描相关逻辑。查壳后发现其不是C#等可直接反编译的程序,因此逆向难度可能较大。
于是采用Strings命令先预查一番(这么大的exe,一上来就反汇编可能不是特别明智),发现里面还是有些内容的。
(1)json格式的扫描规则:
可以发现主要还是利用taint污染传递技术来分析的,和Fortify的数据流规则很相像。
我们可以看一个我们关心的OGNL命令注入的扫描规则:
来看其中的一个实例:
也是通过OGNL表达式解析函数来作为sink点检测的,我把这些表达式整理了出来,大家以后挖洞可以借鉴之:
其他的该json规则详情可以查看附件。
(2)直接通过正则匹配敏感的API
这部分在二进制Strings中发现的不多:
^System\.Web\.UI\.WebControls\.(.*)$
^System\.Data\.SqlClient\.(.*)$
^System\.Data\.OracleClient\.(.*)$
^System\.Data\.OleDb\.(.*)$
^System\.Data\.Odbc\.(.*)$
^System\.Data\.Linq\.(.*)$
^System\.Data\.IDbCommand(.*)$
^System\.Data\.EntityClient\.(.*)$
^System\.Diagnostics\.Process(.*)$
^java\.lang\.ProcessBuilder\.command\(java\.lang\.String\[\]\)java\.lang\.ProcessBuilder$
^java\.lang\.ProcessBuilder\.\(java\.lang\.String\[\]\)java\.lang\.ProcessBuilder$
^java\.lang\.ProcessBuilder\.command\(java\.util\.List\)java\.lang\.ProcessBuilder$
^java\.lang\.ProcessBuilder\.\(java\.util\.List\)java\.lang\.ProcessBuilder$
^java\.lang\.ProcessBuilder(.*)$
^java\.lang\.Runtime\.exec\(java\.lang\.String\[\](.*)$
^java\.lang\.Runtime\.exec\(java\.lang\.String(,|\))(.*)$
^java\.lang\.Runtime(.*)$
^org\.springframework\.orm\.jpa\.JpaTemplate\.(.*)$
^org\.springframework\.orm\.jpa\.(.*)$
^org\.springframework\.orm\.hibernate3\.(.*)$
^org\.springframework\.jdbc\.(.*)$
^javax\.persistence\.Criteria(.*)$
^javax\.persistence\.(.*)createNativeQuery$
^javax\.persistence\.(.*)createQuery$
^javax\.persistence\.(.*)$
^(org|net)\.hibernate\.(.*)SQL(.*)$
^(org|net)\.hibernate\.(.*)(Query|Session)(.*)$
^(org|net)\.hibernate\.(.*)createQuery$
^(org|net)\.hibernate\.(.*)Criteri(a|on)(.*)$
^(org|net)\.hibernate\.(.*)$
^SQLite\.JDBCDriver(.*)$
^org\.sqlite(.*)$
^com\.almworks\.sqlite4java(.*)$
^com\.microsoft\.sqlserver\.jdbc(.*)$
^com\.oracle\.jdbc(.*)$
^com\.mysql\.jdbc(.*)$
^org\.postgresql\.(.*)$
^java\.sql\.Connection\.prepareStatement$
^java(x)?\.sql\.PreparedStatement(.*)$
^java(x)?\.sql\.(.*)$
^org\.apache\.jasper\.runtime\.PageContextImpl\.proprietaryEvaluate(.*)$
^javax\.el\.ELContext(.*)$
^org\.apache\.el\.(.*)$
^org\.apache\.jsp\.(.*)$
^org\.apache\.taglibs\.standard\.functions\.(.*)
^javax\.servlet\.jsp\.jstl\.(.*)
^org\.springframework\.web\.servlet\.tags\.(.*)
^org\.springframework\.web\.util\.(.*)
^org\.apache\.commons\.lang(\d+)?(.*)
(3)匹配代码语法中的一些模式:
^([^\s]+)$
^([+/@#%^&{}|`?^-]+)
^([<>=~!]+)
^([;:()\[\],\.])
^([a-zA-Z_][a-zA-Z0-9_]*)
^(\[.*[^\]]\])
^(""|".*?[^\\]")
^(''|'.*?[^\\]')
^([-]?[0-9]+)
^([-]?[0-9]*\.[0-9]+)
^([-]?0x[0-9a-fA-F]+)
^([a-zA-Z_][a-zA-Z0-9_\.\$]*(?=\$\.[(]))
^(@[a-zA-Z_][a-zA-Z0-9_\.\$]+)
^((\?{1,2}))
^([$\?:%\$][a-zA-Z0-9_]+)
^(?
|[^
])*
^(`(``|[^`])*`)
^(\$?([a-zA-Z_][a-zA-Z0-9_]*)?\$)
^(CREATE( OR REPLACE)?\b)
^(NOT NULL\b)
^(END( IF| LOOP)?\b)
^(LEFT |RIGHT )?(INNER |OUTER )?JOIN\b
^(VALUES)
^(CASE\b)
^([\*])
^(::)
^(:=)
^(/\*([^\*/]*))$
^(/\*([^\*]|[
]|(\*+([^\*/]|[
])))*\*+/)
^(\s+)
^(\s+)$
^(--.*?)$
^(--.*?(
(4)加密算法相关的匹配:
require_symmetric:*/*/*/*
require_symmetric:DES/*/*/*
require_symmetric:RC4/*/*/*
require_symmetric:AES/*/*/*
require_symmetric:DES/*/*/*;require_symmetric:RC4/*/*/*
require_symmetric:*/CBC/*/*
require_symmetric:DES/*/*/*;require_symmetric:*/ECB/*/*
require_symmetric:DES/CBC/*/*
require_symmetric:DES/ECB/*/*
require_symmetric:*/*/NOPD/*
require_symmetric:*/*/PKCS5/*
require_symmetric:DES/*/NOPD/*
require_symmetric:DES/*/PKCS5/*
require_symmetric:*/CBC/NOPD/*
require_symmetric:*/ECB/PKCS5/*
require_symmetric:DES/CBC/NOPD/*
require_symmetric:DES/ECB/PKCS5/*
require_symmetric:*/*/*/64
require_symmetric:*/*/*/128
require_symmetric:DES/*/*/64
require_symmetric:*/ECB/*/64
require_symmetric:*/*/NOPD/64
require_asymmetric:*/*/*/*
require_asymmetric:RSA/*/*/*
require_asymmetric:*/*/NOPD/*
require_asymmetric:RSA/*/*/*;require_asymmetric:*/*/NOPD/*
require_asymmetric:RSA/*/NOPD/*
require_asymmetric:*/*/PKCS5/*
require_asymmetric:RSA/*/PKCS5/*
require_asymmetric:*/*/*/64
require_asymmetric:*/*/*/128
require_asymmetric:*/*/PKCS5/64
require_asymmetric:RSA/*/PKCS5/64
require_hash:*/*/*/*
require_hash:MD5/*/*/*
require_hash:SHA256/*/*/*
require_hash:MD5/*/*/*;require_hash:SHA256/*/*/*
allow:*/*/*/*
allow:DES/*/*/*
allow:DES
allow:AES/*/*/*
allow:AES
allow:AES/*/*/*;allow:DES/*/*/*
allow:AES|DES
allow:AES;allow:DES
allow:RC4/*/*/*
allow:MD5/*/*/*
allow:MD5
allow:*/ECB/*/*
allow:ECB
allow:*/CBC/*/*
allow:CBC
allow:DES/ECB/*/*
allow:AES/ECB/*/*
allow:AES;allow:ECB
allow:DES/CBC/*/*
allow:AES/CBC/*/*
allow:*/*/NOPD/*
allow:NOPD
allow:*/*/PKCS5/*
allow:PKCS5
allow:DES/*/NOPD/*
allow:AES/*/PKCS5/*
allow:DES/ECB/NOPD/*
allow:AES/ECB/PKCS5/*
allow:DES/CBC/NOPD/*
allow:AES/CBC/PKCS5/*
allow:*/*/*/64
allow:*/*/*/128
forbid:*/*/*/*
forbid:DES/*/*/*
forbid:DES
forbid:AES/*/*/*
forbid:AES
forbid:AES/*/*/*;forbid:DES/*/*/*
forbid:AES|DES
forbid:AES;forbid:DES
forbid:RSA
forbid:RC4/*/*/*
forbid:MD5/*/*/*
forbid:MD5
forbid:*/ECB/*/*
forbid:ECB
forbid:*/CBC/*/*
forbid:CBC
forbid:DES/ECB/*/*
forbid:AES/ECB/*/*
forbid:AES;forbid:ECB
forbid:DES/CBC/*/*
forbid:AES/CBC/*/*
forbid:*/*/NOPD/*
forbid:NOPD
forbid:*/*/PKCS5/*
forbid:PKCS5
forbid:DES/*/NOPD/*
forbid:AES/*/PKCS5/*
forbid:DES/ECB/NOPD/*
forbid:AES/ECB/PKCS5/*
forbid:DES/CBC/NOPD/*
forbid:AES/CBC/PKCS5/*
forbid:*/*/*/64
forbid:*/*/*/128
allow:MD5|DES
allow:DES;forbid:AES
其他还有些内部的正则,大家可以通过使用strings命令实际手动操作一下,相信会收获不少。
经过进一步的分析,初步怀疑扫描规则模型位于builtin-models.db文件中,文件格式给sqlite数据文件(怀疑的原因:命名+文件大小+后缀名)
规则内容上是加密的。具体这些规则如何解密,后续再做分享。
作者:陈辉军
- 点赞
- 收藏
- 关注作者
评论(0)