经典工具逆向分析(五):Coverity扫描规则逆向分析(一)

举报
开发者学堂小助 发表于 2017/11/21 09:30:47 2017/11/21
【摘要】 今天要逆向分析的经典工具是Coverity扫描规则。

  2017-11-21_092938.jpg

首先来看一下coverity扫描工具有哪些bin文件:

2017-11-21_092109.jpg

  从文件大小和名称上来看,cov-analyze.exe文件应该会有扫描相关逻辑。查壳后发现其不是C#等可直接反编译的程序,因此逆向难度可能较大。

2017-11-21_092127.jpg

  于是采用Strings命令先预查一番(这么大的exe,一上来就反汇编可能不是特别明智),发现里面还是有些内容的。

  (1)json格式的扫描规则:

2017-11-21_092241.jpg


  可以发现主要还是利用taint污染传递技术来分析的,和Fortify的数据流规则很相像。

  我们可以看一个我们关心的OGNL命令注入的扫描规则:

2017-11-21_092329.jpg

  来看其中的一个实例:

2017-11-21_092439.jpg

  也是通过OGNL表达式解析函数来作为sink点检测的,我把这些表达式整理了出来,大家以后挖洞可以借鉴之:

2017-11-21_092545.jpg

  其他的该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数据文件(怀疑的原因:命名+文件大小+后缀名)

2017-11-21_092648.jpg

2017-11-21_092724.jpg

  规则内容上是加密的。具体这些规则如何解密,后续再做分享。


作者:陈辉军

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。