AES
AES
算法
输入:128bit
输出:128bit
密钥长度与迭代轮数有关
加解密流程:
每一轮主要包括:
轮密钥加,AddRoundKey:将128位轮密钥Ki同状态矩阵中的数据进行逐位异或操作
字节替换,SubBytes:查表S盒。把字节的高4位作为行值(0),低4位作为列值(8),取出S盒或者逆S盒中对应的元素(30)作为输出
行移位,ShiftRows:简单的左循环移位。当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节
列混淆,MixColumns:经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵。其中,矩阵元素的乘法和加法都是定义在基于GF(2^8)上的二元运算。
b(x)=a(x)c(x)mod(x4+1)其中c(x)=03x3+01x2+01x+02c(x)与x4+1互素,保证存在逆多项式d(x),满足c(x)d(x)=1mod(x4+1)。只有逆多项式d(x)存在,才能正确进行解密b(x) = a(x)c(x) mod (x^4+1)
\\ 其中c(x) = 03x^3+01x^ ...
DES
DES
算法原理
输入 64 位。
输出 64 位。
密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)
算法流程图如下:
密钥生成
选择置换:不考虑每个字节的第8位,DES的密钥由64位减至56位,每个字节的第8位作为奇偶校验位
循环移位:根据轮数,将两部分分别循环左移1位或2位。
置换:移位后,从56位中选出48位
加密
IP置换:将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。比如以下置换规则表,表示此位置的数据在原数据中的位置,即原数据块的第58位放到新数据的第1位
Feistel
E(扩张置换):将32位的半块R0扩展到48位,其输出包括8个6位的块,每块包含4位对应的输入位,加上两个邻接的块中紧邻的位。然后与子密钥异或。
目的有两个:生成与密钥相同长度的数据以进行异或运算;提供更长的结果,在后续的替代运算中可以进行压缩
S盒:替代运算。(非线性,提供安全性)每个S盒将6位输入变为4位输出。给定输入 ...
程序合成
程序合成
顾斌, 于波, 董晓刚, 李晓锋, 钟睿明, 杨孟飞. 程序智能合成技术研究进展. 软件学报.
http://www.jos.org.cn/1000-9825/6200.htm
基于输入输出
特点
根据输入输出实例对训练合成模型。输入领域特定语言(DSL)描述的需求规格,合成模型便可以给出与之相对应的程序
需求规约为输入输出示例对
代表方法
主要进一步阅读了Balog等人的Deepcoder,该方法能够根据输入输出示例,使用深度神经网络和集束搜索技术实现特定领域的代码自动合成。
特色:
缩小了搜索空间,用大小为34 的DSL 指令集进行表示,通过将深度神经网络和集束搜索技术相结合生成简单的程序
与传统方法相比,该方法实现效率较高。该方法作为一种代码自动合成方法,将深度学习技术和代码的搜索生成技术相结合,具有创新性
局限性:
指令集和操作数有限,无法描述复杂任务,通常只能生成10 行左右的代码。
只能合成简单的程序,动态规划和搜索都无法做到。所以需要通过添加更多的原语来扩展DSL,并在程序构造中允许更多的灵活性(例如允许循环)
输入输出:
总的输入为示例输入输 ...
[论文笔记-ccs12]Aligot
Aligot
Joan Calvet, José M. Fernandez, and Jean-Yves Marion. 2012. Aligot: cryptographic function identification in obfuscated binary programs. In Proceedings of the 2012 ACM conference on Computer and communications security (CCS '12). Association for Computing Machinery, New York, NY, USA, 169–182. DOI:https://doi.org/10.1145/2382196.2382217
研究的问题: 识别混淆后的二进制文件的密码函数
特色:
之前的静态分析检测常量或machine language instructions,不适用于混淆后的
检测密码函数的I/O关系,抗混淆(即使混淆后,输入输出也是可知的)
解决方法:
I/O关系对足够确定多数密码函数
收集目标程序的执行路径( ...
[论文笔记-usenix2021]where's-crypto
[论文阅读]where’s crypto
背景:专有密码学应用广泛。深入的安全分析需要在通常非常大的二进制文件中对算法进行定位和分类,因此即使在启发式方法的帮助下,手动检查也很耗时
现有的方法:DFG isomorphism(Automated identification of cryptographic
primitives in binary code with data flow graph isomorphism[43])
缺陷:仅限于已知的primitives,依赖于启发式算法来选择待分析的代码片段
解决:通过将上述方法与符号执行结合(为密码原语的分类类别指定结构签名和与分析匹配的二进制代码),克服了上述缺陷,并将分析扩展到未知的专用密码原语中
贡献:
将子图同构与符号执行结合,解决了片段选择的开放性问题并消除了对启发式的需求
提出新的domain-specific language(DSL),用于定义密码原语的结构属性
ida开源插件where’s crypto?
具体方案
密码原语:本质上是一组表示输入/输出关系的算术和逻辑操作
分类:纯粹为工具性,不会对算法进行 ...
Visual Basic 6.0中的c2.dll除法优化相关逆向分析与数学模型
逆向分析过程
使用ccf Explorer中的Address Converter计算文件偏移地址为5FACE的虚拟地址为1075EACE
使用ida打开c2.dll,跳转到1075EACE地址处,分析1075EACE到1075EB9C的代码,也就是sub_1075EACE(a)函数(自命名为calmagic(a))
判断输入参数a是否小于3,小于则跳转到loc_1075EAEA,否则继续将其与0Dh(13)进行比较,不小于13则跳转到loc_1075EAEA,否则返回dword_107AE0D8[2a](自定义为数组num[2*a]),即直接查表返回magicnumber
查看数组的值如下所示
loc_1075EAEA:使用cdq指令将eax(mov eax,ecx将参数a存入eax中)的最高位全部复制到edx的每一位。可以看出该部分主要为各寄存器值的计算,各寄存器分别计算如下:
edi:首先将eax中的值存入edi中,然后与其符号位扩展得来的edx异或,再减去edx,求得参数的绝对值。
esi:首先将ecx中的值存入esi中,然后shr右移31位,sub减去800 ...