77百科网
当前位置: 首页 生活百科

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

    推荐阅读
  • AI少女工作室4K截图方法介绍 AI少女工作室截图

    AI少女工作室高分辨率图片怎么保存?想来很多朋友都还不是很了解吧,所以呢小编给大家带来的就是AI少女工作室4K截图方法介绍,有需求的玩家赶紧来看看吧。AI少女工作室4K截图方法介绍捏人界面或者工作室按f1出现插件列表,找到Screencap插件。大部分人分辨率应该有问题,改成3840和2160就行。没有背景是因为快捷键冲突。f11包含工作室截图,加上插件截图,相当于同时截了两张。右下角的fps数字,插件找到fps里面设置一下就可以了。

  • 生态一日游手绘画(创意绘画以物换物)

    7月2日上午,为了让垃圾分类成为市民的新习惯、新时尚,柳州市生活垃圾分类办和柳江区分类办借助百朋荷花节契机,共同举办了一场垃圾分类文创市集活动,利用形式新颖、互动性强的宣传活动,助力柳州市生态文明建设进入快车道。第一个活动环节是:环保创意绘画,现场数十名“小画家”用主办方提供的画笔和颜料,在环保布袋、小帐篷上进行彩绘。

  • 贝壳类海鲜怎么保存(海鲜怎么保鲜保质呢)

    接下来我们就一起去了解一下吧!贝壳类海鲜怎么保存如果需要保鲜死了的海鲜,可以加上少许的盐,放在冰箱下面低温保存,但是要用保温泡沫包裹住,避免温度过低,冻伤肉,导致品质下降。鲜活的贝类想要保存,需要把海鲜放入泡沫箱中,上面铺层棉布,然后放入海鲜,海鲜四周放入冰袋,最后盖上盖子,这样既可以保证海鲜存活,又可以保鲜保质。

  • 结账时英语口语(英语口语perdiem)

    英语口语:perdiem“差旅包干““实报实销”英语表达1)PerdiemPerdiem是拉丁语perday,eachday的意思,即每天封顶的开支,也就是我们所说的“费用包干”。Whencompanieswanttoholdalineincosts(控制成本),对于employeestravelingonbusiness(出差员工)差旅费采用aperdiempay(包干支付)方式:1.Ihave

  • 香港风水大师暴毙(富婆御用风水师骗取21亿)

    在遇上龚如心以前,陈振聪因冒充医生,申请4张信用卡,骗取9万多块,而遭到起诉。92年,陈振聪透过立法局前议员梁锦濠,向龚如心传话,声称知道她丈夫王德辉的下落。华懋慈善基金会立即提起诉讼,双方随即对簿公堂。为了赢得法官信任,陈振聪自爆他和龚如心长达14年的地下情。最后,法庭驳回上诉,维持原判。成为过街老鼠的陈振聪被判入狱12年。虽然陈振聪得到应有惩罚,但龚如心的一世英名,算是毁于一旦。

  • 2022武汉新能源汽车补贴申请需要什么材料?

    申请方式:补贴期限内,在武汉市购买符合条件的新能源汽车,并在市内注册登记和上牌的个人消费者,申领资料审核确认后,即可在汽车经销商处获得优惠礼包。

  • 原始荒岛奇遇小说免费(女子意外穿越野人窝可咋办)

    一咬牙,阿姆终是下了决心。于是,在阿姆的再三叮嘱下,她和妫娜一起走出了峡谷。此刻的陆小蛮根本不知道,她即将面临的,会是怎样的危险!想到荀祁魁梧的身材,陆小蛮害羞死了。看样子,她不认识蒲公英。妫娜脚程很快,抱着陆小蛮也丝毫不费力。让人意外的是,在小溪边缘,陆小蛮发现了很多大大小小的陷阱。陆小蛮仔细看了看,发现这些陷阱做的很粗糙,小的动物关不住,大的也不牢靠。

  • 江苏省青少年体育5621计划是什么意思?

    通过一体化设计项目教学计划和培养方案、一体化推进实施和系统培养,形成共同体的优势、特色运动项目。到2025年,江苏全省建成500个以上运动项目共同体,涵盖田径、游泳、快乐体操、球类等基本运动大项,青少年运动技能和竞技体育整体水平明显提升,高水平后备人才不断涌现。

  • 如何选购空气净化器(选购空气净化器的方法)

    接下来我们就一起去了解一下吧!如何选购空气净化器CADR值是否够高。当颗粒物净化能效值达到2时,此时为合格级,当比值达到5时,此时为高效级;对于甲醛净化能效,当比值达到0.5时,为合格级,当比值达到1时,为高效级。好的空气净化器不仅要有效,也要节能省电。CADR值越来越高,机器内部风扇必定要提高转速,这样噪音就会随之升高,一台真正有效的空气净化器不仅要净化效率和能力强,噪音也要越低越好。