难点
线性同余算法、DES
难度
★★★★
题目附件
后缀改回exe

前期信息收集:

32位程序,无壳。
notion image

程序分析:

放入ida中可以直接看到正常加密逻辑,没有什么混淆手段。
找到接收flag函数后往下看加密思路,可以定位到第一段加密代码:
notion image
程序接收flag判断长度是否为32,接着37到44行使用的是线性同余算法生成一段长度为33的伪随机数组,这里贴一下线性同余算法的公式:
notion image
在这个程序中A=32310901,第一个N生成于flag的第7、16、30三个字节,具体公式为:~(53 * (flag[6] + flag[15] + flag[29])) & 0xFFFB=1729M=0xFE
tips:这里我的ida分析出来的LCG数组的类型有问题,分析出来的是char型,所以显示出来的是&LCG[4 * i] = v4; 按y将LCG定义处的值修改回int后就能正常显示了:
notion image
生成出LCG数组后进入一个双循环语句具体做的代码如下:
外循环(即最外层的do...while循环)是按照flag_tmp数组的顺序进行的,每次循环中,i_1指向flag_tmp数组的下一个元素。
内循环(即内层的do...while循环)是在处理LCG数组和flag_tmp数组当前元素的关系。这个循环中,每次循环都会对LCG数组中的当前元素和flag_tmp数组中的当前元素进行异或(XOR)操作,然后将结果累加到Block数组中的相应位置。注意,因为LCG数组中的每个元素都是一个整数,所以每次循环都会处理3个Block数组中的元素。
当内循环结束后,Block_2Block_1都向前移动4个位置(指向Block数组的下一个整数位置),然后LCG_3重新指向LCG数组的第3个元素。然后外循环继续,i_1指向flag_tmp数组的下一个元素。
这样的循环结构会导致Block数组中的每一个整数都会被flag_tmp数组中的一个字符和LCG数组中的一段序列(每段包含11个整数)影响。
做完这些操作后,