线性移位反馈寄存器:
1 | do |
&同时为1才为1 >>==为右移/左移赋值,上面可以看出来先是三个lfsr,下面的把这个三个v4,v3,v2这三个输出组合了一下
这个一个线性移位反馈寄存器
他先进行了v7 = v4 & 0x17FA06; 0x17FA06 = b1 0111 1111 1010 0000 0110(21个bit)
然后有1的位置就是它的一个抽头
现在v4是这个lfsr移位前的状态,v7 = v4 & 0x17FA06 就是要看所有的抽头处的情况 我们假设v4= 0x123456 = b1 0010 0011 0100 0101 0110 进行异或后的结果就是:0b100100011000000000000 也就是v7 那么v7里面有1的地方就要进行一个异或
有一个1,结果就是1 有两个1,结果就是0 有三个1,结果就是1 也就是,v10里面1的个数,决定着补上去的那一位是什么
v4,v3,v2分别对应三个lfsr这一次的输出
v14 = v3; if ( v4 & 1 ) v14 = v2;
来把这三个1bit的输出,组合成一个1bit的结果,然后把这1bit的结果要添加到v5这个字节上
那么3个lfsr的输出组合了一下:
1 | r1 0 0 0 0 1 1 1 1 |
可以看到r1一样的概率是0.5 r2,r3的概率是0.75 正常来说结果应该和rx的概率都是0.5才不会被区分出来,所以可以穷举所有的r2,把r2的输出,和它组合后的输出对比一下,看两者相同的概率,正常来说(如果r2和res不相关的话),这个概率应该是一个以50%为均值的正态分布,但是这边r2是跟res相关的,会有某个r2的概率在75%左右,所以只要找到在穷举的所有r2中,找到那个概率最大的,那肯定就是r2,r3也是一样的思路,r1的话,跟输出不相关,所以不能用这种方法,如果已经求出来r2,r3,可以穷举r1,然后跟r2,r3组合一下,看输出的结果跟那个output是否吻合,吻合的话,就是对的
文章:http://blog.leanote.com/post/xp0intjnu@gmail.com/66c91498d13b
1 | #include <stdio.h> |
cycle graph
大概看了说明,根据学过的数据结构不难分析这是一个链式存储结构, 那么我们用od进行载入
这里可以看出判断长度
将eax记录到flag{}中的第一位,继续
第二轮是esi的记录,依次即可,遍历路径
天津垓
缺少cygwin1.dll,直接去找了,放到同一个文件下,IDA 直接爆破出第一个结果
1 | #include<stdio.h> |
得到数据, Caucasus@s_ability ,直接用x64dbg dump数据,使用插件Scylla
v27数据为v78 v1为输入 v0为输入长度, v79给了
上面的数据挨个除以19683,就是flag
1 | #include<stdio.h> |
fxck!
一个base58加上brainfuck下断点这里可以看到是base58,看一下未被进行加密运算后的内存的密码表,可以看到base58的替换表
可以看到密码表:ABCDEFGHJKLMNPQRSTUVWXYZ123456789abcdefghijkmnopqrstuvwxyzbrainfuck不太了解,直接跑了下由于下面有一个cmp的函数位置,直接看了
直接找到s1的地址对应edi的 转过去
进行解密 替换好密码表然后base58即可