/images/jhin.png

Jhinxs

机器学习小记

监督学习 MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [['$$','$$'], ['\[','\]']], processEscapes: true, processEnvironments: true, skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'], TeX: { equationNumbers: { autoNumber: "AMS" }, extensions: ["AMSmath.js", "AMSsymbols.js"] } } }); MathJax.Hub.Queue(function() { // Fix tags after MathJax finishes running. This is a // hack to overcome a shortcoming of Markdown. Discussion at // https://github.com/mojombo/jekyll/issues/199 var all = MathJax.Hub.getAllJax(), i; for(i = 0; i 监督学习从已有的数据集来建议一种模式(函数),来预测新的值,而数据是已有label的。

安全架构-零信任初识

背景 个人理解,传统的企业网络安全架构中,主要存在内外网界限划分的概念,而且大部分时间,防护重点主要放在对抗来自外网的威胁,凡是来自外部的请求默认会被判定为恶意。但是在内网,虽然会使用一定的安全设备和策略进行一定的防护,但是大部分情况下,对来自内部的请求默认是可信的,不会像外网那样设置多重的如身份认证,鉴权等细化的防护策略。所以以往,入侵者进去内网之后,利用获取到的部分凭证,大部分情况下,可随意进行内网渗透,获取更多的数据和权限。而零信任的诞生,则是为了彻底杜绝这种情况,逻辑上舍弃传统的内外网划分(并不一定是在网络架构上放弃内外网的网络架构,完全推倒重来),以多种维度为认证属性的身份作为认证的标准,将身份和权限作为新的边界。 零信任的技术标准 这里主要简单介绍一下国际云安全联盟CSA发布的SDP(软件定义边界)以及美国国家标准技术研究所(NIST)发布的的零信任标准。 SDP CSA在2014年发布了SDP技术标准,软件定义边界是指通过在每个用户的设备上安装客户端软件,也即Agent,用作身份校验。通过验证则可以访问对应的资源,这样在逻辑上形成一种网络边界,相对于传统的网络架构,不再通过传统内外网的形式划分网络边界。 SDP的主要组件有三个: SDP客户端:负责在用户登录时,传输所需认证的身份信息以及业务请求信息。 SDP管控端:验证用户的身份,向网关下发访问控制策略 SDP安全网关:负责访问控制,接受SDP管控端发来的策略并执行。 工作流程: SDP客户端登录,登录请求被SDP管控端接受,通过其中的身份验证信息进行验证。 身份验证通过后,管控端向客户端发送用户可访问的SDP网关信息。 客户端与SDP网关建立安全加密的数据通道,用于传输后续的访问业务的流量,用户发起的业务请求会经过客户端转发给SDP安全网关。 SDP网关会根据请求中的用户信息以及访问控制策略,进行权限校验并将请求转发到后端对应的业务系统中去。 SPA单包授权 传统的网络架构中,设备或者业务系统支持在验证通过前即可访问,访问者身份无法验明,所以容易产生访问控制机制被绕过的情况。而SPA技术,SDP网关默认不对外开放端口,所有未经过认证的请求将全部被丢弃,从而实现"隐身"效果。 SPA过程: SDP客户端和SDP网关建立通信之前,首先发送一个认证数据包,这个认证数据包中带有身份信息和需要访问的目的地信息。 SPD网关接受到认证数据包后,将解析并验证身份,根据策略检查目的地能否被当前用户访问。 如果通过检查,那么网关则会给用户放行对应的网络通路,如添加一条防火墙放行策略。 通过SPA认证后,后续的业务流量,SDP网关将转发给对应的业务系统。 SDP适用场景 通过Agent可以实现对用户设备的安全控制,防护效果更为严密,但也就意味着,公开的一些网站无法使用SDP,更加适合用于在集团公司的访问控制,例如:分支机构接入等场景 NIST零信任架构 美国国家标准技术研究所发布《零信任架构ZTA》标准,是目前比较权威的零信任架构标准。 零信任架构的设计和部署遵循以下基本原则: 所有数据源和计算服务均被视为资源。 无论网络位置如何,所有通信都必须是安全的。 对企业资源的访问授权是基于每个连接的。 对资源的访问权限由动态策略(包括客户身份、应用和请求资产的可观测状态)决定,也可能包括其他行为属性。 企业应该监控并且测量其所有自有或关联的资产的完整性和安全态势。 所有资源的身份认证和授权是动态的,并且在资源访问被允许之前严格强制实施。 企业应该尽可能收集关于资产、网络基础设施和通信的当前状态信息,并将其应用于改善网络安全态势。 ZTA框架模型 以上组件的具体描述: 策略引擎(Policy Engine):负责访问控制,决定主体是否有权访问资源,策略引擎可以使用多种维度的情报作为输入,用于策略的指定,以决定授予或拒绝对该资源的访问。 策略管理(Policy Administrator): 负责管理用于用户身份认证的令牌凭据以及建立会话,依赖于策略引擎的输出,并通知PEP创建或者关闭会话。 策略执行点(Policy Enforcement Point): 负责启用、监视并最终终止访问主体和企业资源之间的连接。PEP与PA通信,接受PA的策略指示,建立和关闭会话。 零信任的组件 零信任安全网关 无论是SDP,ZTA,零信任网关是零信任架构的核心之一,负责实施访问控制,用户流量的转发等主要功能。 Web 代理网关 web代理网关顾名思义,只对Web请求做代理转发,只支持Web网站的接入,对于客户端类应用则无法起作用。 主要功能: 获取身份 客户端在发起请求的时候,会在请求数据包头部加入代表用户身份的Token,代理网关可以解析数据包头,获取到验证身份所需的身份信息进行校验。 验证身份:将身份信息转发给PA等管控平台,管控平台验证后将结果发送回网关。 代理转发: 这里的基本的流量代理转发功能,和平常的代理转发类似,将后端的业务域名DNS解析到Web代理网关的IP地址,用户访问业务系统域名的时候,会跳转到Web网关之上,网关会解析用户想要访问的业务系统的地址,当通过身份认证后,则会将流量转发到对应的服务器上。 Tunnel 隧道网关 前面说到,Web代理网关无法支持客户端类的C/S应用,意味着无法覆盖所有的应用访问场景,例如SSH,RDP,企业软件升级等等。 隧道网关的实现,可以使用VPN技术来实现,通过设置虚拟网卡,拦截网络流量,流量转发给网关之后,进行身份与权限校验,将合法的流量转发到对应的服务器上。 隧道网关相比于Web代理网关,可以覆盖更多的场景,但是性能可能不如Web代理网关,在对流量的管控粒度上,可能也不如Web网关细致,实际中,可以将两种网关进行互补部署,取长补短。

Windows BIOS MBR引导分析

流程概述 Windows BIOS开机引导流程概览: 1.开机主板加电,BIOS运行 2.运行硬盘开头的MBR代码 3.MBR代码引导运行Bootmgr(也有可能引导VBR,然后VBR引导Bootmgr) 4.Bootmgr根据BCD配置,自动运行或让用户选择不同的启动项,并加载运行Winload.exe 5.Winload.exe加载ntoskrnl.exe内核模块 6.ntoskrnl.exe启动操作系统 MBR与VBR结构概览 MBR MBR主引导记录,用于引导后续运行的代码,一般用作引导bootmgr等第二阶段的引导程序 MBR一般位于每块硬盘的最开头的512个字节,也就是一个扇区的大小,其中前446个字节为引导程序,然后是64个字节的分区表,其中每个分区项为16个字节,最后是2个字节的Magic,统一为0X55,0XAA,操作系统用此Magic确定和查找引导记录,如果没有,则无法进行引导。 其中446个字节的引导程序中: 前162个字节为MBR可执行代码 163-1B2这80个字节为错误信息字符串 1B3-1BD这11字节包含2个byte 00 padding,3个字节63 7B 9A分别代表了错误信息字符串的offset,然后是4个字节的磁盘签名,然后是2个字节的padding 磁盘签名可以通过注册表查看:reg query HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices MBR结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 //主引导记录 typedef struct _MASTER_BOOT_RECORD { CHAR bootcode[446]; //实际的引导代码 MBR_PARTITION_TABLE partitiontable[4]; //分区表 USHORT MBRMagic; // 0x55AA }MASTER_BOOT_RECORD,*PMASTER_BOOT_RECORD; //分区表项 typedef struct _MBR_PARTITION_TABLE { BYTE ActiveStatus; //活动状态 0x80=active 0x00=noactive,表示当前分区是否为活动分区,只能有一个活动分区 BYTE StartHead; WORD StartingSectCylinder; //起始扇区柱面 BYTE PARTITION_SYSTEMID; //标识ID,指示当前分区的分区类型,比如常见的有:NTFS,FAT32等等 BYTE EndHead; WORD EndingSectCylinder; DWORD RelativeSector; DWORD TotalSectors; //分区中的总扇区数 }MBR_PARTITION_TABLE,*PMBR_PARTITION_TABLE; 分析MBR代码 MBR的字节码如下图,测试环境为WIN10,21H2

Ollvm Windows下编译及VS集成

之前用的Ollvm基于LLVM4的实在在是太老了,看到了几个新一点的项目就拿来编译瞅瞅,在Windows下编译的过程过于坎坷,一共编译成功了两个项目,这里分别记录一下,以供查查 https://github.com/bluesadi/Pluto-Obfuscator https://github.com/lemon4ex/obfuscator/tree/llvm-13.0 *注: (1)都需要安装ninja编译工具:https://github.com/ninja-build/ninja/releases/tag/v1.10.2 (ninja编译速度快) (2)要在VS中安装Clang编译集成工具 (3)在项目工程文件夹中,新建Directory.build.props 文件,内容如下,路径为你的即可: 1 2 3 4 5 6 <Project> <PropertyGroup> <LLVMInstallDir>D:\Pluto-Obfuscator\build</LLVMInstallDir> <LLVMToolsVersion>12.0.1</LLVMToolsVersion> </PropertyGroup> </Project> Ollvm13 项目地址:https://github.com/lemon4ex/obfuscator/tree/llvm-13.0 这个项目编译的过程: 编译命令 1 2 3 4 5 6 7 8 进入VS开发者命令行建议管理员,建议关闭杀软 G:\VisualStudio2019\VisualStudio2019\VC\Auxiliary\Build\vcvarsall.bat x64 cd obfuscator-llvm-13.0 mkdir build cd build cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_NEW_PASS_MANAGER=OFF -DLLVM_INCLUDE_TESTS=OFF .. ninja 编译完后再bin目录下看到生成的clang等exe表示成功,编译过程中产生的warning可忽略 混淆命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 控制流扁平化 这个模式主要是把一些if-else语句,嵌套成do-while语句 -mllvm -fla:激活控制流扁平化 -mllvm -split:激活基本块分割。在一起使用时改善展平。 -mllvm -split_num=3:如果激活了传递,则在每个基本块上应用3次。默认值:1 指令替换 这个模式主要用功能上等效但更复杂的指令序列替换标准二元运算符(+ , – , & , | 和 ^) -mllvm -sub:激活指令替换 -mllvm -sub_loop=3:如果激活了传递,则在函数上应用3次。默认值:1 虚假控制流程 这个模式主要嵌套几层判断逻辑,一个简单的运算都会在外面包几层if-else,所以这个模式加上编译速度会慢很多因为要做几层假的逻辑包裹真正有用的代码。 另外说一下这个模式编译的时候要浪费相当长时间包哪几层不是闹得! -mllvm -bcf:激活虚假控制流程 -mllvm -bcf_loop=3:如果激活了传递,则在函数上应用3次。默认值:1 -mllvm -bcf_prob=40:如果激活了传递,基本块将以40%的概率进行模糊处理。默认值:30 ##### https://heroims.

x86与x64栈回溯

x86 Call Stack 在x86下,一般函数的调用栈帧的结构大概如下: 在管理栈空间中,最主要的两个寄存器分别为EBP以及ESP,EBP表示为当前函数栈的开始,也就是栈底,而ESP则用于提升栈空间,表示为栈顶。 1 2 3 4 5 6 7 8 9 10 11 void add() { printf("test"); } void test() { int c = 1; int b = 2; add(); } 反汇编上述代码我们大致可以看到类似如下的汇编语句: 1 2 3 4 5 6 7 8 9 10 push ebp mov ebp,esp sub esp,xxxH mov dword ptr [ebp-4h],1 mov dword ptr [ebp-8h],2 call add add esp,xxxH mov esp,ebp pop ebp ret 结合上图不难看出,在x86下,通过EBP可以寻址当前函数体内的局部变量,函数参数,也可以找到函数返回地址,父函数的栈空间,例如:EBP-XXXH 通常表示当前函数内的局部变量,EBP+4 的位置则是返回地址,EBP+8 的位置可能是函数的参数。如此一来,不难看出通过EBP加正数偏移可以引用父函数的地址空间,加负数偏移可以引用当前函数的地址空间。