难点
线性同余算法、DES
难度
★★★★
题目附件
后缀改回exe
前期信息收集:
32位程序,无壳。

程序分析:
放入ida中可以直接看到正常加密逻辑,没有什么混淆手段。
找到接收flag函数后往下看加密思路,可以定位到第一段加密代码:

程序接收flag判断长度是否为32,接着37到44行使用的是线性同余算法生成一段长度为33的伪随机数组,这里贴一下线性同余算法的公式:

在这个程序中
A=32310901
,第一个N生成于flag的第7、16、30三个字节,具体公式为:~(53 * (flag[6] + flag[15] + flag[29])) & 0xFFF
,B=1729
,M=0xFE
。tips:这里我的ida分析出来的LCG数组的类型有问题,分析出来的是char型,所以显示出来的是
&LCG[4 * i] = v4;
按y将LCG定义处的值修改回int后就能正常显示了:
生成出LCG数组后进入一个双循环语句具体做的代码如下:
外循环(即最外层的do...while循环)是按照
flag_tmp
数组的顺序进行的,每次循环中,i_1
指向flag_tmp
数组的下一个元素。内循环(即内层的do...while循环)是在处理
LCG
数组和flag_tmp
数组当前元素的关系。这个循环中,每次循环都会对LCG
数组中的当前元素和flag_tmp
数组中的当前元素进行异或(XOR)操作,然后将结果累加到Block
数组中的相应位置。注意,因为LCG
数组中的每个元素都是一个整数,所以每次循环都会处理3个Block
数组中的元素。当内循环结束后,
Block_2
和Block_1
都向前移动4个位置(指向Block
数组的下一个整数位置),然后LCG_3
重新指向LCG
数组的第3个元素。然后外循环继续,i_1
指向flag_tmp
数组的下一个元素。这样的循环结构会导致
Block
数组中的每一个整数都会被flag_tmp
数组中的一个字符和LCG
数组中的一段序列(每段包含11个整数)影响。做完这些操作后,