一种二元序列的线性复杂度算法的实现

#include <stdio.h>
#include <memory.h>

#define MAXL (1000)

typedef unsigned char uchar;

void prints(const uchar *s, const int n)
{
    int i;
    for(i=0;i<n;i++) {printf("%u",s[i]);}
    printf("\n");
}

//implement the Berlekamp–Massey algorithm for binary sequences.
//Please see https://en.wikipedia.org/wiki/Berlekamp%E2%80%93Massey_algorithm#The_algorithm_for_the_binary_field
int bm(const uchar*s, const int n)
{
    int i,j,lc,m,d;
    uchar b[MAXL];
    uchar c[MAXL];
    uchar t[MAXL];
    
    b[0]=1;c[0]=1;
    for(i=1;i<n;i++){b[i]=0;c[i]=0;};
  
    lc=0;m=-1;
    
    for(i=0;i<n;i++) {
        d=s[i];
        for(j=1;j<=lc;j++) { d ^=s[i-j] & c[j]; }
        if(d!=0){
            memcpy(t,c,n);
            for(j=0;j<n-i+m;j++) { c[i-m+j]^=b[j]; }
            
            if(2*lc<=i) {
                lc=i+1-lc;
                m=i;
                memcpy(b,t,n);
            }
        }
    }
  
    return lc;
}

int main()
{
    int n;
    int lc;
    char c;
    int i,j;
    uchar s[MAXL];
    uchar ans_s[MAXL];
    int ans_lc;
    int ans_j;
    
    //if you would like to read the sequence from file, please uncomment the follows line.
    //freopen ("s1.txt","r",stdin);
    //skip the first line
    while((c=getchar())!='\n');
    //read the sequence
    n=0;
    while(n<MAXL){
        c=getchar();
        //the line should be ended with '\n' or ']'.
        if(c=='\n' || c==']') break;
        
        //only '0' and '1' are captured.
        if(c>='0' && c<='1') {
            //convert '0' and '1' to 0 and 1.
            s[n++]=c-'0';
        }
    }
    prints(s,n);
    printf("There are %d bits.\n", n);
    
    lc = bm(s,n);
    printf("The original LC is %d\n", lc);
    
    //make sure that current ans_lc is big enough.
    ans_lc=n; ans_j=-1;
    for(i=0;i<n;i++) {
        s[i] ^=1;
        
        lc=bm(s,n);
        if(lc<ans_lc) {
            //save the current optimal answer;
            ans_lc=lc; ans_j=i;
            memcpy(ans_s,s,n);
            printf("Update ans with lc=%d when  s[%u]:%u->%u.\n", 
            ans_lc, ans_j, s[ans_j]^1, ans_s[ans_j]);
        }
        
        s[i] ^=1;
    }
    
    printf("The minimal 1+lc is %d when s[%u]:%u->%u.\n", 
        1+ans_lc, ans_j, s[ans_j], ans_s[ans_j]);
    prints(ans_s,n);
    
    
    return 0;
}

这是基于C语言实现的wiki上二元序列的线性复杂度,如果需要对应的极小多项式可以从最后的c变量数组中直接转换过来,这并不是什么有难度的事情。

VPN拨号后自动处理路由策略(For Windows)

经常使用各种不同的VPN,但一般客户端都需要根据不同的场景来选择配置不同的路由策略,很久之前写过一个批处理脚本(For Win)。今天突然要用,但是找不到了,所以只好重新再写一次,然后保存下来,希望下次会记得。

PS:Linux类系统下自然有更多优秀的解决方案,或者说第三方VPN插件自然也会很优雅的解决办法,自然不必纠结我这个批处理的脚本,只给有需要的人。

@echo off
Setlocal enabledelayedexpansion
rem 校内常见的私有地址,例如教务系统,OA办公系统等
set ip0=10.0.0.0/8;
set prefix=10.0.0.
rem =====================以上部分不要修改===========================================

rem 所有需要通过VPN访问的IP,用分号隔开。支持添加整个子网。最多添加到ip3,并且每个都要以分号结尾
set ip1=211.155.94.138;122.115.55.6;
set ip2=
set ip3=

rem 用户名user
set user=XXX

rem 密码pass
set pass=XXX

rem 新建vpn连接的名称,可以在"控制面板"的"网络连接"中看到
set vpn_name=gdst

rem =====================以下部分不要修改=================================
set ip4=172.16.0.0/16
set ipt="%ip0% %ip1% %ip2% %ip3% %ip4%"
set "ips=%ipt: =%"
set try=0
set mask=
set aip=
set ans=
set ip=

:dial
cls
echo 正在VPN连接...
rasdial %vpn_name% %user% %pass%
if errorlevel 1 (
set /a try+=1
echo 第%try%次拨号失败,5秒后重新尝试,按Ctrl+C终止
ping 1.1.1.1 -n 1 -w 5000 > nul
goto dial
) else (
echo 拨号成功.
)
rem VPN获取的IP地址应该是10.0.0开头的

for /f "tokens=1* delims=:" %%i in ('ipconfig /all^|find "%prefix%"') do (
if /i not "%%j" == "" (
set ip=%%j
goto ipout
)
)
:ipout
echo VPN的IP地址为:%ip%
echo 正在处理网络配置,如果失败,请修复本地连接后重新尝试。
rem 删除拨号成功后默认添加的路由
rem route delete 0.0.0.0 mask 0.0.0.0 %ip% METRIC 1 >NUL 2>NUL
call:clean
call:add_all %ips%
echo 网络配置完毕。

:menu
rem cls
rem echo 当前路由表为(仅供调试之用)
rem route print %prefix%
set /p user_input=输入1,将自动断开vpn,并恢复原来的网络配置。
if /i not "%user_input%"=="1" goto menu

rasdial %vpn_name% /DISCONNECT
call:clean
echo 操作完毕,请关闭此窗口。
pause
exit

:gmask
set /a nid=32
set /a q=4
set /a r=0
set aip=%~1
set "aip=%aip: =%"
if "!aip!" == "" goto:eof
for /f "delims=/, tokens=1,*" %%s in ("%~1") do (
if /i not "%%t"=="" (
set /a q="%%t/8"
set /a nid="%%t"
set aip=%%s
)
)

set /a r="%nid%-%q%*8"
if %nid% GEQ 32 (
set mask=255.255.255.255.
) else if %nid% LEQ 0 (
set mask=0.0.0.0.
) else (
set mask=
for /L %%i in (1,1,%q%) do (
set mask=!mask!255.
)
set /a next="%q%+1"
if %r% GTR 0 (
set /a smask=1"<<"%r% set /a smask=256-!smask! set mask=!mask!!smask!. ) for /L %%i in (!next!,1,4) do ( set mask=!%mask!0. ) ) set "mask=%mask:~0,-1%" goto:eof :add_all for /f "delims=;, tokens=1,*" %%i in ("%~1") do ( call:gmask "%%i" echo 正在处理 %%i !aip! !mask! %ip% if /i not "!aip!" == "" ( route add !aip! mask !mask! %ip% METRIC 1 >NUL 2>NUL
)
if /i not "%%j"=="" (
call:add_all "%%j"
)

)
goto:eof

:clean
for /f "tokens=1-4" %%i in ('route print ^| find "!ip!"') do (
route delete %%i mask %%j !ip! >NUL 2>NUL
)
goto:eof

执行后显示的日志信息如下:

正在VPN连接...
正在连接到 GDST...
正在验证用户名及密码...
正在网络上注册您的计算机...
已连接 GDST。
命令已完成。
拨号成功.
VPN的IP地址为: 10.0.0.4
正在处理网络配置,如果失败,请修复本地连接后重新尝试。
正在处理 10.0.0.0/8 10.0.0.0 255.0.0.0 10.0.0.4
正在处理 211.155.94.138 211.155.94.138 255.255.255.255 10.0.0.4
正在处理 122.115.55.6 122.115.55.6 255.255.255.255 10.0.0.4
正在处理 172.16.0.0/16 172.16.0.0 255.255.0.0 10.0.0.4
网络配置完毕。
输入1,将自动断开vpn,并恢复原来的网络配置。1
命令已完成。
操作完毕,请关闭此窗口。
请按任意键继续. . .

同伴矩阵的方幂

最近在研究一个矩阵的方幂,这个矩阵如下

事实上这个矩阵和下面这个多项式存在一一对应的关系,

使用Mathematica计算$A^k$, 代码如下:
<< FiniteFields` Assuming[Element[p, Primes] && Element[n, Integers] && n > 0,
F = GF[p, n];
A = {{0, 0, -a[0]}, {1, 0, -a[1]}, {0, 1, -a[2]}};
Print[MatrixForm[
Simplify[MatrixPower[A, k],
Element[a[0], F] && Element[a[1], F] && Element[a[2], F] &&
Element[k, Integers] && k > 1]]];
];

计算结果为:

显然在化简方面,Mathematica并没有充分利用$a_0$,$a_1$,$a_2$是有限域上的元素的特点,所以这个表达式还是挺复杂的,需要自己进一步做化简. 最终的目标是为了计算$det(A^k-I)$.

突然灵机一动, 改动了一下Mathematica的代码如下:
<< FiniteFields` Assuming[Element[p, Primes] && Element[n, Integers] && n > 0,
F = GF[p, n];
A = {{0, 0, -a[0]}, {1, 0, -a[1]}, {0, 1, -a[2]}};
Print[MatrixForm[
Simplify[Det[MatrixPower[A, k] - IdentityMatrix[3]],
Element[a[0], F] && Element[a[1], F] && Element[a[2], F] &&
Element[k, Integers] && k > 1]]];
];

结果为:

其中$x_1$,$x_2$,$x_3$是方程$f(x)$的三个根.

[转]中国很多网上银行客户数字证书配置不当

漏洞概要

缺陷编号: WooYun-2012-09482

漏洞标题: 中国很多网上银行客户数字证书配置不当

相关厂商: 中国很多银行&支付宝

漏洞作者: tpu01yzx

提交时间: 2012-07-13 15:14

公开时间: 2012-07-16 01:46

漏洞类型: 默认配置不当

危害等级: 低

自评Rank: 1

漏洞状态: 已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源: http://www.wooyun.org

Tags标签: 设计不当导致攻击界面扩大 盲目信任用户数据 杀毒绕过 网络资源滥用 证书签发策略错误


漏洞详情

披露状态:

2012-07-13: 细节已通知厂商并且等待厂商处理中
2012-07-13: 厂商已查看当前漏洞内容,细节仅向厂商公开
2012-07-16: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

就是可以使用网上银行和支付宝签发给用户进行身份验证的数字证书进行代码签名。

会有什么危害呢?看那个“数字签名正常”几个字就知道了。除了可以通过浏览器控件的签名验证之外,还可以逃避一下杀毒软件的查杀(目前很多杀软都是忽略“可信任”的软件白名单)

详细说明:

第一张使用的是农业银行发布的数字证书做的code签名

第二张使用的是支付宝发布的数字证书做的code签名

他们对应的根证书自己到官网下载安装,不解释。至于如何做code签名,微软有个signcode.exe,也不解释了。

会有什么危害呢?看那个“数字签名正常”几个字就知道了。除了可以通过浏览器控件的签名验证之外,还可以逃避一下杀毒软件的查杀(目前很多杀软都是忽略“可信任”的软件白名单)

漏洞证明:

第一张使用的是农业银行发布的数字证书做的code签名

第二张使用的是支付宝发布的数字证书做的code签名

修复方案:

别自以为是地自己给自己签名做CA,买个第三方认证的证书不需要花多少钱吧。怕国外的不安全,国内的也有权威的数字认证机构啊,不解释。

或者

给用户签发数字证书的时候,那个“证书的目的”控制一下,比如说:

客户端验证

安全电子邮件

智能卡登录

而不要用默认那个"所有应用程序策略",不解释哈。

版权声明:转载请注明来源 tpu01yzx@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2012-07-16 01:46

厂商回复:

参考评论,对于此类问题暂不进行处置。

漏洞Rank:13 (WooYun评价)

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

[转]腾讯将乌云列入黑名单

漏洞概要

缺陷编号: WooYun-2011-03899

漏洞标题: 腾讯将乌云列入黑名单

相关厂商: 腾讯

漏洞作者: tpu01yzx

提交时间: 2011-12-29 15:52

公开时间: 2012-01-03 15:53

漏洞类型: 设计错误/逻辑缺陷

危害等级: 低

自评Rank: 5

漏洞状态: 漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源: http://www.wooyun.org

Tags标签: 潜规则


漏洞详情

披露状态:

2011-12-29: 细节已通知厂商并且等待厂商处理中
2011-12-29: 厂商已查看当前漏洞内容,细节仅向厂商公开
2012-01-03: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

腾讯将乌云列入黑名单,导致用户无法及时获得最新的漏洞信息。
<img src="/upload/201112/29155031c26f97276a1628875e231bd9ad07b4ef.jpg" />

详细说明:

看图,不解释。

漏洞证明:

看图,不解释。

修复方案:

你懂的。

版权声明:转载请注明来源 tpu01yzx@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2012-01-03 15:53

厂商回复:

漏洞Rank:3 (WooYun评价)

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

[转]QQ被迫下线后未使会话令牌失效

漏洞概要

缺陷编号: WooYun-2011-03679

漏洞标题: QQ被迫下线后未使会话令牌失效

相关厂商: 腾讯

漏洞作者: tpu01yzx

提交时间: 2011-12-20 09:31

公开时间: 2012-02-03 09:32

漏洞类型: 非授权访问/认证绕过

危害等级: 低

自评Rank: 1

漏洞状态: 厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org

Tags标签: 认证设计不合理 腾讯认证 认证绕过 用户认证信息泄漏 认证系统设计不合理 认证信息不同步


漏洞详情

披露状态:

2011-12-20: 细节已通知厂商并且等待厂商处理中
2011-12-20: 厂商已经确认,细节仅向厂商公开
2011-12-23: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2012-02-13: 细节向核心白帽子及相关领域专家公开
2012-02-23: 细节向普通白帽子公开
2012-03-04: 细节向实习白帽子公开
2012-02-03: 细节向公众公开

简要描述:

很简单,就是一个地方登陆了QQ,另一个地方再登陆的时候就会导致前面的登陆出现被迫下线的情况。但此时,虽然客户端的QQ是离线状态,但是通过点击QQ客户端控制面板上的按钮还是可以正常访问QQ空间,QQ邮箱等信息。这个和那种会话劫持的原理很类似。
于是有如下猜想:只有一次登陆成功,记录下会话信息,即使之后执行退出操作,仍可以使用之前的会话信息通过认证。

详细说明:

按照问题描述操作一次。

漏洞证明:

省略。

修复方案:

你懂的。

版权声明:转载请注明来源 tpu01yzx@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:1

确认时间:2011-12-20 11:14

厂商回复:

thanks

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

 

[转]QQ2011会话密钥泄漏

漏洞概要

缺陷编号: WooYun-2011-02953

漏洞标题: QQ2011会话密钥泄漏

相关厂商: 腾讯

漏洞作者: tpu01yzx

提交时间: 2011-10-08 22:58

公开时间: 2011-11-07 22:59

漏洞类型: 未授权访问/权限绕过

危害等级: 高

自评Rank: 15

漏洞状态: 厂商已经确认

漏洞来源: http://www.wooyun.org

Tags标签: 加密算法设计错误


漏洞详情

披露状态:

2011-10-08: 细节已通知厂商并且等待厂商处理中
2011-10-09: 厂商已经确认,细节仅向厂商公开
2011-10-19: 细节向核心白帽子及相关领域专家公开
2011-10-29: 细节向普通白帽子公开
2011-11-08: 细节向实习白帽子公开
2011-11-07: 细节向公众公开

简要描述:

win版本的QQ客户端(包括QQ2010,QQ2011等版本),在一个与会话密钥相关的临时密钥生成中使用了不安全的随机密钥生成算法,导致攻击者可以通过监听用户登录得到其中的会话密钥,进而可以添加修改查看所有的聊天记录。

详细说明:

http://kns.cnki.net/KCMS/detail/detail.aspx?filename=xxaq201106038&dbname=CJFD&dbcode=CJFQ

看这篇文章。

目前对于linux版本的QQ免疫。对于某些win用户来说也是免疫的,暂时还不清楚具体适用范围。实验采用了即时通过网页申请的5个新QQ号码。还没做更进一步的验证。

漏洞证明:

已经在win和rg100a(一款路由器)上实现了该改进过的算法。可以在路由器上记录通过该路由上网的QQ的聊天记录。这个怎么证明?代码写得很烂,不献丑了,就按照文章中的流程做就好了。有需要的可以联系索取。

修复方案:

版权声明:转载请注明来源 tpu01yzx@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2011-10-09 17:42

厂商回复:

thanks

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

[转]绕过锁定QQ功能进入(QQ空间等)网站

漏洞概要

缺陷编号: WooYun-2011-02700

漏洞标题: 绕过锁定QQ功能进入(QQ空间等)网站

相关厂商: 腾讯

漏洞作者: tpu01yzx

提交时间: 2011-08-22 12:54

公开时间: 2011-09-21 12:54

漏洞类型: 设计缺陷/逻辑错误

危害等级: 低

自评Rank: 2

漏洞状态: 厂商已经确认

漏洞来源: http://www.wooyun.org

Tags标签: 边界绕过 认证缺陷 认证设计不合


漏洞详情

披露状态:

2011-08-22: 细节已通知厂商并且等待厂商处理中
2011-08-23: 厂商已经确认,细节仅向厂商公开
2011-09-02: 细节向核心白帽子及相关领域专家公开
2011-09-12: 细节向普通白帽子公开
2011-09-22: 细节向实习白帽子公开
2011-09-21: 细节向公众公开

简要描述:

http://www.wooyun.org/bugs/wooyun-2010-02538
跟这个描述差不多,还没有修复好。
不好意思,引用到了“笨猫猫”的很多话。

详细说明:

点击锁定后的“反馈问题”按钮

虽然在打开的页面中已经处理掉了连接,还是可以通过直接输入网站地址访问其他腾讯的子网站,其中包括财付通,id.qq.com等,这些网站至少帐号的财务信息,好友信息等。

漏洞证明:

笨猫猫:不知道该怎么证明漏洞。。要不你们来我电脑挂QQ并锁定好了。。

修复方案:

笨猫猫:亲~你懂得

版权声明:转载请注明来源 tpu01yzx@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:3

确认时间:2011-08-23 08:49

厂商回复:

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值