文学起点网
当前位置: 首页 文学百科

go语言切片长度和容量(goby指纹提取与yara逆向.md)

时间:2023-07-12 作者: 小编 阅读量: 1 栏目名: 文学百科

goby识别指纹的功能很不错,想试试能不能把goby指纹识别里面的指纹提取出来,移植到自己的扫描器中,结果后面到了逆向虚拟机的程度。。于是搜索YARA关键字,就能再次定位到goby的指纹规则部分。yara编译后文件的规则真是多变,并且每个版本的规则还不兼容。。yara虚拟机整个虚拟机执行在exec.c文件的yr_execute_code函数上,在上面打上断点。OP_HALT是中断标志,这个opcode出现代表执行完毕。接下来就是理解这些yara指令了。

goby识别指纹的功能很不错,想试试能不能把goby指纹识别里面的指纹提取出来,移植到自己的扫描器中,结果后面到了逆向虚拟机的程度。。

goby的crules

在goby 最初的版本中,翻看了一些感兴趣的资源文件后看到有个crules文件。

它的文件头是yara文件

并且里面包含了它的指纹

通过文本提取,可以把指纹规则提取出来,但是多个指纹规则之间有and、or之类的逻辑关系,并不清楚。

新版的crules提取

现在goby使用了最新的go版本1.16

在go1.16,嵌入资源有个官方实现,叫go embed,可以根据在二进制中搜索embed.FS来确认是否使用了这个特性。

然后我自己测试了一下,看看go embed内嵌资源是如何实现的,结果发现资源直接在二进制中明文显示。

于是搜索YARA关键字,就能再次定位到goby的指纹规则部分。

yara结构分析

因为不知道指纹规则之间的逻辑关系如何提取,所以只能看yara代码是怎么做的。

看到goby使用了这个库https://github.com/hillu/go-yara,应该就是用来解析规则的,看这个库的实现,它只是c版本yara源码的封装,所以还是要去看yara的代码。

官方仓库是 https://github.com/VirusTotal/yara

我下载了2.0 3.0 和4.x最新版的源码,发现里面的文件版本和这个都对不上。一度怀疑是魔改的yara?

yara编译后文件的规则真是多变,并且每个版本的规则还不兼容。。这上面踩了一下坑。

最后我在yara-3.10.0找到了可以符合goby crules文件头的代码

yara加载编译后的文件

在yr_arena_load_stream,可以看到读取magic为yara的标记以及版本判断相关代码。

crules文件开头对应的数据结构如下

typedef struct _ARENA_FILE_HEADER{charmagic[4];uint32_tsize;uint32_tversion;} ARENA_FILE_HEADER;

之后读取指定长度的字节后,剩余的字节都是用于重定向地址用

再之后在 yr_rules_load_stream,先通过一个结构映射头

typedef struct _YARA_RULES_FILE_HEADER{DECLARE_REFERENCE(YR_RULE*, rules_list_head);DECLARE_REFERENCE(YR_EXTERNAL_VARIABLE*, externals_list_head);DECLARE_REFERENCE(const uint8_t*, code_start);DECLARE_REFERENCE(YR_AC_MATCH_TABLE, match_table);DECLARE_REFERENCE(YR_AC_TRANSITION_TABLE, transition_table);} YARA_RULES_FILE_HEADER;

然后再解析出每个节的地址。

new_rules->code_start = header->code_start;new_rules->externals_list_head = header->externals_list_head;new_rules->rules_list_head = header->rules_list_head;new_rules->match_table = header->match_table;new_rules->transition_table = header->transition_table;

得到每个表的位置。yara编译后的文件加载过程到此完成。

简单来说,文件头前面一部分是映射为_ARENA_FILE_HEADER的结构,再之后的结构就是一些表的地址。

yara结构总结

说的可能比较抽象,得自己看yara代码,不断去调试,大概就知道yara是怎么处理和加载编译后的yara文件的了。

yara的编译机制就是把内存中的yara数据结构保存为一个文件,然后对一些重定向内容做一些处理。

加载过程也是同理,之后程序运行位置交到new_rules->code_start这个地址上,它将会运行yara的虚拟机程序,虚拟机对所有规则做出判断。

yara虚拟机

整个虚拟机执行在exec.c文件的yr_execute_code函数上,在上面打上断点。

此时的调用堆栈

单步运行下来,发现这是一个栈式虚拟机,从地址获取opcode,根据opcode执行。

OP_HALT是中断标志,这个opcode出现代表执行完毕。

exec.h定义了各种opcode和int的关系

经过调试,发现每次规则开始的时候,都会调用OP_INIT_RULE,

这个执行地址后面的地址就是RULE的数据结构,记录了meta等信息。

typedef struct _YR_INIT_RULE_ARGS{DECLARE_REFERENCE(YR_RULE*, rule);DECLARE_REFERENCE(const uint8_t*, jmp_addr);} YR_INIT_RULE_ARGS;

typedef struct _YR_RULE{int32_t g_flags;// Global flagsint32_t t_flags[MAX_THREADS];// Thread-specific flagsDECLARE_REFERENCE(const char*, identifier);DECLARE_REFERENCE(const char*, tags);DECLARE_REFERENCE(YR_META*, metas);DECLARE_REFERENCE(YR_STRING*, strings);DECLARE_REFERENCE(YR_NAMESPACE*, ns);// Used only when PROFILING_ENABLED is definedclock_t clock_ticks;} YR_RULE;

typedef struct _YR_META{int32_t type;YR_ALIGN(8) int64_t integer;DECLARE_REFERENCE(const char*, identifier);DECLARE_REFERENCE(char*, string);} YR_META;

通过对虚拟机整个执行过程的理解,可以编写一个yara反编译器了。

搜索了下github,有一个开源的 https://github.com/jbgalet/yaradec,但是不支持这个版本,需要自己改改。

所以我根据yara源码和这个开源的反编译器,编写了一个yara反编译器。

反编译

运行反编译器,将yara的opcode转换为指令的形式,我的反编译器运行后输出如下

有的opcode会和一些字符串作关联,所以我把它读取出来放到注释部分,opcode就是yara定义的opcode,最前面的数字代表当前执行的位置,因为有的语句会跳转到其他位置,方便看。

接下来就是理解这些yara指令了。

一个简单的例子

205 : OP_INIT_RULE;{"flags": 0, "identifier": "rule_2", "metadata": {"rule_id": "2", "level": "5", "softhard": "2", "product": "CNPOWER-OA(OA8000)", "company": "CNPOWER", "category": "OA", "parent_category": "Enterprise Application"}, "ns": "default:"}222 : OP_OBJ_LOAD 5050743 ;fofa231 : OP_OBJ_FIELD 5050748 ;body_contains240 : OP_PUSH 5050762 ;/oaapp/webobjects/oaapp.woa249 : OP_CALL 5050801 ;s258 : OP_OBJ_VALUE;259 : OP_MATCH_RULE 260 ;

OP_INIT_RULE 是初始化这个规则的meta信息

OP_OBJ_LOAD 是载入fofa模块

OP_OBJ_FIELD是模块的字段,即 body_contains

OP_PUSH 将/oaapp/webobjects/oaapp.woa压入堆栈

之后OP_CALL调用函数,OP_OBJ_VALUE 获取结果,OP_MATCH_RULE匹配完成。

所以,可以想象这一段指令对应的原先规则为

fofa.body_contains("/oaapp/webobjects/oaapp.woa")

规则逻辑的反编译

上述是一个简单匹配过程,如果一些规则含有逻辑运算,是怎样的呢?

例如下面的例子

445 : OP_INIT_RULE;{"flags": 0, "identifier": "rule_5", "metadata": {"rule_id": "5", "level": "3", "softhard": "2", "product": "MongoDB", "company": "MongoDB, Inc", "category": "Database System", "parent_category": "Software System"}, "ns": "default:"}462 : OP_OBJ_LOAD 5051424 ;fofa471 : OP_OBJ_FIELD 5051429 ;body_contains480 : OP_PUSH 5051443 ;<a href="/_replset">replica set status</a></p>489 : OP_CALL 5051501 ;s498 : OP_OBJ_VALUE;499 : OP_JTRUE 642 ;if sucess508 : OP_OBJ_LOAD 5051503 ;fofa517 : OP_OBJ_FIELD 5051508 ;protocol_contains526 : OP_PUSH 5051526 ;mongodb535 : OP_CALL 5051545 ;s544 : OP_OBJ_VALUE;545 : OP_JTRUE 640 ;if sucess554 : OP_OBJ_LOAD 5051547 ;fofa563 : OP_OBJ_FIELD 5051552 ;body_contains572 : OP_PUSH 5051566 ;you are trying to access mongodb581 : OP_CALL 5051610 ;s590 : OP_OBJ_VALUE;591 : OP_JTRUE 638 ;if sucess600 : OP_OBJ_LOAD 5051612 ;fofa609 : OP_OBJ_FIELD 5051617 ;title_contains618 : OP_PUSH 5051632 ;mongod.exe627 : OP_CALL 5051654 ;s636 : OP_OBJ_VALUE;637 : OP_OR;638 : OP_NOP;639 : OP_OR;640 : OP_NOP;641 : OP_OR;642 : OP_NOP;643 : OP_MATCH_RULE 644 ;

从这段指令可以精简为

验证规则1验证规则2验证规则3验证规则4ororor

可以看出这是一个后缀表达式(逆波兰表达式)处理的逻辑关系。

要提取逻辑表达式的话,就是把这段后缀表达式转换为可读的中缀表达式。

我写了一个python脚本来完成这个操作

def zhuanh(l: list):l.reverse()s = []fuhao = ['OP_AND', 'OP_OR', 'OP_NOT']while len(l) > 0:x = l.pop()if x not in fuhao:s.append(x)else:r1 = s.pop()if x == 'OP_NOT':s.append("!{}".format(r1))else:r2 = s.pop()x = x.replace("OP_AND", "and")x = x.replace("OP_OR", "or")s.append(f"({r1} {x} {r2})")if len(s) != 1:raise Exception("错误")return s[0]if __name__ == '__main__':a = [1, 2, 3, 4, 'OP_OR', 'OP_OR', 'OP_OR']s = zhuanh(a)print(s)

1,2,3,4代表这四个规则,最后输出结果即

接下来找一个规则复杂一些的尝试一下

1229: OP_INIT_RULE;{"flags": 0, "identifier": "rule_9", "metadata": {"rule_id": "9", "level": "5", "softhard": "2", "product": "TongDa-OA", "company": "TongTa", "category": "OA", "parent_category": "Enterprise Application"}, "ns": "default:"}1246: OP_OBJ_LOAD 5052822 ;fofa1255: OP_OBJ_FIELD 5052827 ;body_contains1264: OP_PUSH 5052841 ;/static/templates/2013_01/index.css/1273: OP_CALL 5052889 ;s1282: OP_OBJ_VALUE;1283: OP_JTRUE 1810 ;if sucess1292: OP_OBJ_LOAD 5052891 ;fofa1301: OP_OBJ_FIELD 5052896 ;body_contains1310: OP_PUSH 5052910 ;javascript:document.form1.uname.focus()1319: OP_CALL 5052961 ;s1328: OP_OBJ_VALUE;1329: OP_JTRUE 1808 ;if sucess1338: OP_OBJ_LOAD 5052963 ;fofa1347: OP_OBJ_FIELD 5052968 ;body_contains1356: OP_PUSH 5052982 ;href="/static/images/tongda.ico"1365: OP_CALL 5053026 ;s1374: OP_OBJ_VALUE;1375: OP_JTRUE 1806 ;if sucess1384: OP_OBJ_LOAD 5053028 ;fofa1393: OP_OBJ_FIELD 5053033 ;body_contains1402: OP_PUSH 5053047 ;<link rel="shortcut icon" href="/images/tongda.ico" />1411: OP_CALL 5053113 ;s1420: OP_OBJ_VALUE;1421: OP_JTRUE 1804 ;if sucess1430: OP_OBJ_LOAD 5053115 ;fofa1439: OP_OBJ_FIELD 5053120 ;body_contains1448: OP_PUSH 5053134 ;oa提示:不能登录oa1457: OP_CALL 5053171 ;s1466: OP_OBJ_VALUE;1467: OP_JFALSE 1514 ;if sucess1476: OP_OBJ_LOAD 5053173 ;fofa1485: OP_OBJ_FIELD 5053178 ;body_contains1494: OP_PUSH 5053192 ;紧急通知:今日10点停电1503: OP_CALL 5053236 ;s1512: OP_OBJ_VALUE;1513: OP_AND;1514: OP_NOP;1515: OP_JTRUE 1802 ;if sucess1524: OP_OBJ_LOAD 5053238 ;fofa1533: OP_OBJ_FIELD 5053243 ;title_contains1542: OP_PUSH 5053258 ;office anywhere 20131551: OP_CALL 5053290 ;s1560: OP_OBJ_VALUE;1561: OP_JTRUE 1800 ;if sucess1570: OP_OBJ_LOAD 5053292 ;fofa1579: OP_OBJ_FIELD 5053297 ;title_contains1588: OP_PUSH 5053312 ;office anywhere 20151597: OP_CALL 5053344 ;s1606: OP_OBJ_VALUE;1607: OP_JTRUE 1798 ;if sucess1616: OP_OBJ_LOAD 5053346 ;fofa1625: OP_OBJ_FIELD 5053351 ;body_contains1634: OP_PUSH 5053365 ;tongda.ico1643: OP_CALL 5053387 ;s1652: OP_OBJ_VALUE;1653: OP_JFALSE 1748 ;if sucess1662: OP_OBJ_LOAD 5053389 ;fofa1671: OP_OBJ_FIELD 5053394 ;title_contains1680: OP_PUSH 5053409 ;oa1689: OP_CALL 5053423 ;s1698: OP_OBJ_VALUE;1699: OP_JTRUE 1746 ;if sucess1708: OP_OBJ_LOAD 5053425 ;fofa1717: OP_OBJ_FIELD 5053430 ;title_contains1726: OP_PUSH 5053445 ;办公1735: OP_CALL 5053463 ;s1744: OP_OBJ_VALUE;1745: OP_OR;1746: OP_NOP;1747: OP_AND;1748: OP_NOP;1749: OP_JTRUE 1796 ;if sucess1758: OP_OBJ_LOAD 5053465 ;fofa1767: OP_OBJ_FIELD 5053470 ;body_contains1776: OP_PUSH 5053484 ;>新oa办公系统1785: OP_CALL 5053528 ;s1794: OP_OBJ_VALUE;1795: OP_OR;1796: OP_NOP;1797: OP_OR;1798: OP_NOP;1799: OP_OR;1800: OP_NOP;1801: OP_OR;1802: OP_NOP;1803: OP_OR;1804: OP_NOP;1805: OP_OR;1806: OP_NOP;1807: OP_OR;1808: OP_NOP;1809: OP_OR;1810: OP_NOP;1811: OP_MATCH_RULE 1812 ;

优化为的后缀表达式

123456and7891011orand12orororororororor

后缀表达式转中缀表达式结果

((((((((12 or ((11 or 10) and 9)) or 8) or 7) or (6 and 5)) or 4) or 3) or 2) or 1)

就这样,能将所有规则之间的逻辑关系处理了。

中缀表达式处理程序有一个小问题,就是表达式的括号会很多,这个自行优化下吧 = -

最后

我将规则处理为了json格式,方便阅读和扫描器引用,类似如下

goby因为只需要访问一次首页,剩下的由yara规则进行识别,所以速度会很快。用yara识别web指纹学习到了。

如果要自己写扫描器引入fofa指纹的话,还需要写个表达式解析器来解析各种规则,这个我以前也写过了 https://x.hacking8.com/post-383.html

那么能不能直接用yara调用goby的指纹呢?

理论上是可以的,只是需要自己写一个名称为fofa的模块,实现所有判断的方法,在编译到yara中。

申明:本文仅供技术交流,请自觉遵守网络安全相关法律法规,切勿利用文章内的相关技术从事非法活动,如因此产生的一切不良后果与文章作者无关 本文原创作者:w9ay

    推荐阅读
  • 苏州旅游攻略景点必去(苏州旅游必去景点有哪些)

    位于苏州市东北街一百七十八号,始建于明朝正德年间。虎丘是AAAAA级景区及全国文明单位,首批十佳文明风景旅游区示范点。中午,周庄最为欢闹,游人穿梭熙熙攘攘,船儿来回摇摇荡荡,各地的游客与热情的商铺融为一体,热闹非凡,安静的古镇着实多了些欢闹的气息。狮子林为苏州四大名园之一,位于苏州市市城东北园林路。

  • 买的玉米种子是瘪的(去年买的玉米种子剩了很多)

    去年买的陈玉米种子建议不要用针对去年的陈玉米种子,大多情况下不建议再次使用,会影响到玉米后期的生长和产量情况。陈年的因为保管的问题,可能会出现很多因素影响玉米的出苗率或者后期的生长。陈玉米种子隔了一年后再种植,种子自身水分含量降低,水分降低严重的情况下,影响播种的效率和玉米的后期生长,由于活性降低,即使能出芽,也不一定能出苗。

  • 173.2亿!国庆消费火爆 国庆消费市场

    今年国庆、重阳两节叠加,全省消费市场呈现平衡较快增长态势,服装、家电、汽车等商品消费亮点突出,大众餐饮、旅行休闲、文体娱乐等主要服务消费备受青睐。根据商务部业务统一平台生存必需品监测系统显示,国庆黄金周期间,全省生存必需品市场供应充沛,价格总体平衡。除了买买买,国庆还是婚庆、团圆、会友高峰,各地亲友聚餐、婚寿宴等大众化餐饮生意兴隆。

  • 吴承恩是怎么写出的西游记(吴承恩怎么写出的西游记)

    吴承恩怎么写出的西游记诸葛长青:吴承恩写西游记诸葛长青:吴承恩怎么写出的《西游记》西游记,广泛流传西游记,作者吴承恩西游记,包含了儒释道大智慧那么,吴承恩是怎么写出的《西游记》呢?诸葛长青把自己对吴承恩写《西游记》,研究成。

  • 李逵扮演者(大家一起来看看吧)

    我们一起去了解并探讨一下这个问题吧!李逵扮演者赵小锐的李逵应该算是很多人印象当中的经典所在了,他的李逵也是很粗犷,但是这种粗犷当中却带着细腻,也是因为这个角色,他开始受到了不少的观众的关注和喜爱。其实之前的他也有出演过一些电视剧的,但是可惜的是一直都没能够真正的红起来,是李逵这个角色,让他一夜成名爆火了。

  • 汽车空间大小怎么看轴距(什么因素会影响车内空间)

    大众速腾,长度4655mm,轴距2651mm。看外观就明白了,因为宝马320i是后驱车,发动机采用纵置布局;而大众速腾是前驱车,发动机采用横置布局。而且由于发动机纵置,后驱设计,对于车内空间侵占较为严重,所以宝马320的长轴距实际上对于空间的帮助是“虚高”的。前面我们就提到了,宝马3系采用了后驱,大众速腾采用了前驱。回到我们的主题,通常来说,麦弗逊与扭力梁对于车辆空间的侵占是最小的,而多连杆和双叉臂对于车辆空间侵占是要更大的。

  • 湖南省医保局2015年工作思路与安排 湖南省医疗保障局领导班子组成人员

    督促指导各统筹地区核实提高缴费基数,强化保险费足额征收。继续加强工伤认定参与,把好工伤入口关。认真核实、积极处理群众举报问题,始终保持高压态势。加强生育医疗服务管理,规范生育津贴发放。二是启动实施工伤保险信息系统改造升级,改进工伤职工异地就医联网结算,方便工伤职工救治。三是加强财务、业务数据清理,提高数据质量;通报全省“三险”基金运行分析,指导市州加强基金运行风险管控。

  • 民国最渣四大渣男(民国著名4大渣男)

    当时很多文人在接受自由恋爱的思想时,家中已经有了父母为之安排的妻子。郁达夫一生有过三位妻子,一位同居情人。郁达夫后来还是和王映霞离婚,1940年在新加坡认识了比他小20岁的播音员李莜英,两人很快就同居了。第二任妻子佐藤富子,是个日本女人,为了和郭沫若在一起,不仅改名为“郭安娜”,还和父母断绝了关系。1937年,郭沫若抛弃妻子回国,和女明星于立群同居,两人于2年后再重庆结婚。

  • 电脑怎么连打印机教程(教会你快速学会电脑如何连接打印机的安装使用方法)

    最近很多网友都在私信给小编,小编也无法一一回复,有些问题也无法简约介绍,所以只能在头条文章内与大家共享。

  • 爱吃鸡蛋的注意了这3种鸡蛋不能买(这些鸡蛋没你想的那么好)

    营养均衡的孩子没必要补这种元素;真正缺乏硒,靠富硒蛋补,根本起不了多大作用。这类蛋再好,也别给孩子吃那就是全生或半熟的蛋,比如溏心蛋。一般溏心蛋的加热时间短,不能完全杀死细菌,生蛋液根本没有处理细菌,对于抵抗力低、易感染的宝宝来说,非常容易被细菌感染。