栈溢出
Memset栈空间
在debug期间我们可以给栈空间赋值为一个特定值,比如0x5a,然后在每次中断中检查该值是否发生变化,来检测操作内存附近是否有内存被改写,同时该方法也可以用于统计栈最大使用情况。
-fstack-protector
-fstack-protector 会在函数返回地址之前插入一个保护字(称为“canary”)。如果在函数执行期间发生了缓冲区溢出,可能会覆盖这个保护字。在函数返回之前,编译器会检查这个保护字是否被修改,如果被修改,程序会立即终止,从而防止潜在的攻击。
stack-protector:保护函数中通过alloca()分配缓存以及存在大于8字节的缓存。缺点是保护能力有限。 stack-protector-all:保护所有函数的栈。缺点是增加很多额外栈空间,增加程序体积。 stack-protector-strong:在stack-protector基础上,增加本地数组、指向本地帧栈地址空间保护。 stack-protector-explicit:在stack-protector基础上,增加程序中显式属性"stack_protect"空间。
123 ...
Hexo Butterfly 使用手册
标签外挂
标签外挂是 Hexo 独有的功能,并不是标准的 Markdown 格式。
Note
simplemodernflatdisabledno-icon123456789101112131415161718192021{% note 'fab fa-cc-visa' simple %}你是刷 Visa 还是是 UnionPay{% endnote %}{% note red 'fas fa-bullhorn' simple %}2021年快到了....{% endnote %}{% note pink 'fas fa-car-crash' simple %}小心开车 安全至上{% endnote %}{% note green 'fas fa-fan' simple%}这是三片呢?还是四片?{% endnote %}{% note orange 'fas fa-battery-half' simple %}该充电了哦!{% endnote %}{% note purple 'far fa-hand-scissors' simple %}剪刀石頭布{% endnote %}{% no ...
CPUIdle
cpu idle实现原理
通过wfi或wfe指令进入low-power-state。在low-power-state下cpu core保持上电状态,但其大部分时钟停止或者进入时钟门限。这意味着core的绝大部分都处于static state,唯一消耗的功率是用于寻找中断唤醒条件的泄漏电流和少量逻辑时钟。进入low-power-state后将暂停当前的工作直到某个中断或event事件发生会退出low-power-state进入正常运行state。
cpuidle1.png
cpuidle2.png
其唤醒wfi或wfe的interrupt或者event请参考《The AArch64 System Level Programmers’ Model 》D1.6 Mechanisms for entering a low-power state
cpu idle代价
cpu的状态被称为C状态,不同的C状态功耗不同,其中C0是normal state,正常运行状态就是C0状态,其他各state退出到C0状态所需的时间也不同,以下是一个笔记本的CPU各C状态的功耗和退出latency。 ...
记录一次UAC 丢包问题分析过程
实验
测试发现period_size=512或者256时均不发生丢包,于是做以下实验:
sampling rate
channel
bit depth
period_size
package size
是否丢包
48k
2
16bit
1024
4096Byte
丢包
48k
1
16bit
1024
2048Byte
丢包
48k
2
16bit
512
2048Byte
不丢包
48k
4
16bit
512
4096Byte
不丢包
通过实验发现,丢包与period_size相关与package size无关。
通过perf top分析
通过perf top查看系统和aplay中哪些函数占比高:
这里可以看到有大量的spin_lock函数占用比较高的cpu时间。猜测系统哪里可能有自旋锁使用不当。但是这里无法看到函数调用栈,不知道哪里调用的spinlock占用cpu资源多。
通过火焰图分析
查看ftrace 123456789101112131415mount -t debugfs none /sys/kernel/debug/cd /sys/k ...
Encryption Algorithm
AES
AES(Advanced Encryption Standard),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES。其密钥长度则可以是128,192或256比特。
SubBytes:通过一个非线性的替换函数,用查找表(S-Box)的方式把每个字节替换成对应的字节。
ShiftRows:将矩阵中的每个横列进行循环式移位。
MixColumns:每一列的四个字节通过线性变换互相结合得到新的4字节值.
AddRoundKey:将输入与轮密钥进行XOR。
以上就是AES加密中的一轮,不同密钥长度进行的轮数不同,128位10轮,192位12轮,256位14轮。
下面具体分析每一步
SubBytes
从一张拥有256个值的替换表(S-Box)中找出对应的值替换。S-Box是固定的,查找公式也是固定。具体可参见Rijndael S-box。用此步骤混淆了输入内容。
ShiftRows
上一步处理后将16个字节分为4组,每组4字节。以字节位单位进行乱序处理,这种打乱是有规律的。如上图中输入第一组第一个字节移动到输出第一组第一个字 ...
Secure Boot
目的
安全启动的根本目的是为了防止消费者从软硬件层面对产品的部分关键系统进行读写、调试等高权限的操作。以限制消费者的能力,来达到保护产品的商业机密、知识产权等厂家权益的目的。当然,厂家是不会这样宣传 Secure Boot 的。他们的文案通常都是通过这项技术保护用户的隐私,防止恶意软件修改系统软硬件等等。
可以说,Secure Boot 的安全模型建立在消费者是攻击者这一假设上。消费者在物理上拥有产品硬件,可以对产品进行物理连接、拆机、改装等等物理上的操作,比较专业的消费者甚至可以使用数字示波器监听 CPU 和 RAM 、eMMC 之间的数据传输来读取非常底层的数据传输。可以说跟传统的安全模型中的攻击者相比根本不在一个层面上。
消费者作为攻击者的目的,一般常见的有刷机安装自定义的操作系统(Mod)、绕过厂家封闭的支付平台(IAP)和应用商城安装自定义的应用程序、绕过版权保护系统(DRM)达到复制厂家保护的数字产品内容等等。这些操作往往都会直接影响厂家的利益,因此需要一种能抵抗消费者攻击的安全机制。
而且像 eMMC 这种芯片通常都是业界标准化的,攻击者甚至可以把芯片拆下来,然 ...
TEE 软件交互流程
TEE软件框架
TEE 系统软件从整体上包含 REE 和 TEE 两部分,各自对应的基础组件如下图所示。
REE 部分 Client Applications(CA) 一般是指指纹录入,支付应用等上层应用,其通过调用 TEE Client API 接口来与 TEE 环境的 Trusted OS 进行交互,这里的 TEE Client API 包括 TEE 厂商自定义的一些接口或 GlobalPlatform(GP) 全球组织定义的通用 API,其目的是制定一套标准的编程接口,方便开发者在不同软硬件平台下使用同一套代码实现其功能。
TEE Client API 通过 ioctl 系统调用对 TEE Driver 进行操作,TEE Driver 是沟通 REE 和 TEE 的桥梁,其通过 SMC 指令,实现将上层的 OpenSession,InvokeCommand,CloseSession 等标准调用的请求转发到 TEE 环境,同时其也会处理来自 TEE 的请求,将请求转发到 TEE Helper Daemon 让其处理。
TEE Helper Daemon 是一个辅助进程,用于 T ...
RPMB 简介
信息安全
信息安全的三个基本目标是机密性,完整性和可用性。
机密性意味着只有授权实体才能阅读和理解保密的信息。没有访问权限的其他人无法阅读或理解机密信息;
完整性意味着能够确保信息受到保护,以防止未经授权的更改,修改或删除。信息的完整性包括使用识别和认证等方法的起源,完整性和正确性;
可用性意味着信息始终可供授权用户使用。
RPMB简介
RPMB是Replay Protected Memory Block(重放保护内存块)的简称,是eMMC中的一个具有安全特性的分区。此功能使设备能够将数据存储在经过身份验证并防止重放攻击的小型特定区域(通常是4M Bytes)中。这里涉及一个概念Replay Attack和Replay Protected。
Replay Attack(重放攻击)
A向B请求服务(比如说登录某个网站),A将密码hash化传给B。但是在这中间,E抓取到该hash值。此后,E冒充A向B发送同样的hash值来获取服务。
Replay Protected(重放保护)
加随机数。该方法优点是认证双方不需要时间同步,双方记住使用过的随机数,如发现报文中有以前使用过的随机数 ...
TEE 实现原理
TrustZone
如何区分当前访问状态是安全状态下的访问还是非安全状态下的访问?
CPU发出的地址都是虚拟地址,需要经过页表转换才能得到物理地址,其中在pte页表中低12bit(针对4k大小的页表)为控制位,用来控制页表的访问属性,也就是说在页表建立的时候就确定了访问状态是安全状态还是非安全状态,其pte低12bit如下:
这里的bit 5 NS bit(Non-secure bit):用来指定访问的内存地址是安全映射的还是非安全映射的。
只有当ARM核处于安全状态(NS bit=0)时发送到系统总线(AXI)上的读写操作才会被识别为安全读写操作,对应TEE侧的数据资源才能被访问。反之,当ARM核处于非安全状态(NS bit=1)时,ARM核发送到系统总线上的读写操作请求会被作为非安全读写操作,安全组件会根据对资源的访问权限配置来决定是否响应该访问请求。
💡 NS bit的设置是通过SMC指令触发异常进入EL3安全监视器中设置的,即Normal World通过SMC调用进入Security World,将NS bit置0,Security World通过SMC指令进入Norm ...
Blog 搭建
安装 hexo
12345npm install hexo-cli -ghexo init blogcd blognpm installhexo server
安装依赖
1234567891011121314151617181920212223242526272829303132333435# 使用 pandoc 渲染器npm un hexo-renderer-markednpm i hexo-renderer-pandocnpm un hexo-renderer-pandocnpm i hexo-renderer-markdown-it-plusnpm install hexo-deployer-gitsudo apt-get install pandocnpm install prism# rssnpm install hexo-generator-feed# butterflynpm install badge-makernpm install --save hexo-renderer-jade hexo-generator-feed hexo-generator-sitemap ...