CBC: Padding Oracle 攻击
最近在研究TLS协议,了解到了TLS1.2时期使用CBC加密导致的 Padding Oracle 攻击(填充神谕攻击),这篇文章稍微讲一下,也顺便总结一下我的理解。 TLS这个协议本身常规的握手就不说了,核心在于他的加密方法CBC. CBC 模式的异或延展性 要理解攻击原理,首先需要明确 CBC(密码块链接)模式的解密公式。对于任意一个密文块 Ci,其解密得到明文 Pi 的过程分为两步: ...
最近在研究TLS协议,了解到了TLS1.2时期使用CBC加密导致的 Padding Oracle 攻击(填充神谕攻击),这篇文章稍微讲一下,也顺便总结一下我的理解。 TLS这个协议本身常规的握手就不说了,核心在于他的加密方法CBC. CBC 模式的异或延展性 要理解攻击原理,首先需要明确 CBC(密码块链接)模式的解密公式。对于任意一个密文块 Ci,其解密得到明文 Pi 的过程分为两步: ...
最近一直在写Go,对这个语言的体会也是越来越深。 go作为编译类语言,能直接构建对应平台的二进制文件,但是实际上语言本身也是有runtime的。 这点其实和其他语言很不一样,所以这篇文章就来讲讲这个。 首先需要知道,go编译出来的二进制,确实是实打实的纯汇编产物。 ...
最近再配置自己的服务器,有些nginx和docker-compose的配置文件一直在调整。 其中有个很操蛋的事情,就算代码格式化的问题,docker-compose还好,nginx的配置我已经写了接近300行,很多嵌套都相当的乱,因为有lua的部分,但是nginx的配置格式化程序真的很少,vscode我懒得去用,那玩意一打开我的电脑就开始咆哮了。 ...
最近一直在写time-devourer这个项目,我的多态设计的强迫症又犯了,不可避免和元模版打交道了。这篇文章简单的稍微讲一下我遇到的几个场景。 自动包装COM对象指针,生命周期结束自动调用Release。要求T必须能调用Release方法,且T必须是IUnknown的子类。 头一次写模版元编程给我肘晕了,这就是编译期编程么,害怕. ...
目前存在一个场景:需要填充网页上的账号密码模拟登陆,但是不能触发或者给chrome的密码管理器识别到真实的账号密码。 以前其实就比较好奇这个密码管理器是如何正确抓取网页上的密码的。 经过了一天的研究,大概可以得出几个结论了,我不保证这个逻辑是正确的,但是如果有其他人需要参考我想还是能提供一些帮助的,当然也可能存在其他我没观测到的情况: ...
这个东西其实很多,但是文章里不想细讲,我就大概的讲一下,这个篇文章还是偏笔记为主。 总之全局描述符这个东西是继实模式之后保护模式推出的一种内存管理结构。 在实模式下访问内存基本就是靠“段地址+偏移地址=线性地址”这种方式来访问。 ...
由于操作系统本身时存放在硬盘中,并非能在bios引导后直接在内存中运行,所以才有了BIOS引导操作系统的这个步骤。 在主板上电之后,BIOS需要去找到引导程序的位置,这个位置固定在(0磁头0柱面1扇区)的位置,这个扇区也被称为主引导扇区(MBR)。一个扇区大小固定为512字节。也就是boot_loader的大小也必须在512字节以内。 ...
之前已经知道了函数这个玩意在计算机中的本质,本身在栈中存放其实就是一个指针的方式,而指针指向的内容就是在内存中存放的机器码。 解释到这里就已经很明显了,函数其实并不是一定要在编译期载入内存后静态,也就是固定的方式运行的。 ...
1#include <stdio.h> 2#include <stdlib.h> 3 4extern int strlen2(char* str); 5extern void memscp2(char* dest, char* src,unsigned int size); 6extern void memscp3(char* dest, char* src,unsigned int size); 7 8int main() 9{ 10 int a = add(1, 2); 11 printf("%d\n", a); 12 printf("%d\n", strlen2("awd434")); 13 14 char* s = calloc(sizeof(char), 10); 15 memscp2(s, "awdawdawdfawffawf", strlen2("awdawdawdfawffawf")); 16 printf("%s\n", s); 17 18 char* ss = calloc(sizeof(char), 10); 19 memscp3(ss, "awdawdawdfawffawf", strlen2("awdawdawdfawffawf")); 20 printf("%s\n", s); 21 22 return 0; 23} 1SECTION .data 2 3SECTION .text 4 global memscp2 5 global memscp3 6 7; void memscp2(char* dest /* rdi */ , char* src /* rsi */,unsigned int size /* rdx */) 8memscp2: 9 mov rcx, rdx 10 cld 11 rep movsb 12 ret 13 14; void memscp3(char* dest /* rdi */ , char* src /* rsi */,unsigned int size /* rdx */) 15memscp3: 16 mov rcx, rdx 17nextbyte: 18 mov rax, [rsi] 19 mov [rdi], rax 20 add rsi, 8 21 add rdi, 8 22 loop nextbyte 23 xor rax, rax 24 ret 写了两个版本,上面的是movsb,一个专门用来拷贝字符的指令,估计是有特殊优化。 ...
这次依然是从汇编开始分析C语言里的一些语法实现,这次还是Windows平台上为主~ 直接上最简单的: 1int z = 0; 2char s1 = (char)z; 3 4// ASM 5int* z = 0; 6// 这次就直接显示符号名吧,不看内存地址了 7// dword ptr就是数据类型声明 8mov dword ptr [z],0 9char* s1 = (char*)z; 10// movzx这个指令,下面讲解,总之就是把z移动到eax寄存器. 11movzx eax,byte ptr [z] 12// 直接粗暴的进行一个强转,al是AX的第八位,AX是EAX的低16位 13// mov指令要求操作数大小相等,byte ptr只占8个字节,所以这里用AL寄存器 14mov byte ptr [s1],al movzx这个指令简单来说就是把小字节操作数移动到大字节寄存器,同时让大字节的高位补零。 ...