在2011年的BlackHat DC 2011大会上Ryan Barnett给出了一段关于XSS的示例javascript代码:
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
这是一段完全合法的javascript代码,效果相当于alert(1)。它可以在大部分浏览器上运行。(虽然目前我测试过手头的浏览器都能运行,但理论上不能保证所有浏览器都能正确运行,原因见下文)
这段代码的好处(对于黑客)是,它不包含任何字符或数字,可以逃过某些过滤器的检查。比如说,如果假定一个AJAX请求将返回一个只包含数字的JSON,于是很可能会简单判断了一下其中不含字母就直接eval了,结果给黑客们留下了后门。上面的代码功能很简单,只是alert(1),但使用同样的原理,完全可以干出更复杂的事,例如alert(document.cookie)。更重要的是,这段代码再一次提醒我,黑客的想象力是无限的……正如Ryan Barnett的演讲标题:"XSS:The only rule is no rule"。
那么这段代码是如何工作的呢?
我们可以把它分为两个部分来理解:
第一部分:
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()
第二部分:
[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
其中第一部分是核心,我们首先对它进行分析,先缩进一下:
($= [$=[]][
(__=!$+$)[_=-~-~-~$] +
({}+$)[_/_] +
($$= ($_=!''+$)[_/_] + $_[+$])
]
)()
显然,最外层是(...)()形式的函数调用,我们需要看看这里究竟调用了什么函数,返回了什么。下一步,我们把原来代码中赋值表达式提取出来,将其改写为以下等价形式:
$ = []; //1
__ = !$+$; //2
_ = -~-~-~$; //3
$_=!''+$; //4
$$ = $_[_/_] + $_[+$]; //5
$= [$][
__[_] + //6
({}+$)[_/_] + //7
$$ //8
]; //9
$(); //10
现在来一行行看:
1. $先赋值为一个空数组 (后面会被覆盖)
2. __ = ![] + [] = false + [] = "false" 这里利用了javascript运算的强制类型转换特性。首先空数组是一个非null值,因此![]的结果是false(布尔型)。在计算false + []时,由于数组对象无法与其他值相加,在加法之前会先做一个toString的转换,空数组的toString就是"",因此事实上在计算false + ""。这时false被自动转换为字符串。最终结果是"false"+"" = "false"。 **换句话说,在$为空数组时,使用 “+$”的方式可以将任何一个值转为字符串**
3. 在计算~[]时,~需要一个数字操作数,空数组无法直接转换为数字,则作为0处理。因此~[] = ~0 = -1。
参考:
~3 = -4
~[3] = -4
~[3,2] = -1 (无法转为数字)
~"3" = -4
~"abc" = -1
因此: _ = -~-~-~[] = -~-~-(-1) = -~-~1 = -~-(-2) = -~2 = -(-3) = 3 理论上,可以用这种方式得出1-9所有数字
4. !''是true,使用+$将其变为字符串 "true"
5. 这里需要注意的是,之前一直用“值+[]”来获得“值”的字符串形式。而“+[]”则是0(正号导致[]被自动转换为数值0)。因此:$$ = "true"[3/3] + "true"[+[]] = "true"[1] + "true"[0] = "rt"
6. __[_] = "false"[3] = "s"
7. ({} + [])导致空对象{}被转换为字符串"[object Object]", 因此({}+$)[_/_] = "[object Object]"[1] = "o"
9. 这里把$覆盖为 [[]]["s"+"o"+"rt"]。注意这里[[]]本身是一个包含空数组的数组,其实对这一步来说,任何一个数组都没有关系(不一定要是嵌套数组),但作者巧妙地把$的首次赋值式放在了数组内部,使代码更为紧凑。最终结果是,$ = [[]]["sort"] = [[]].sort = Array.prototype.sort。
10. 调用$(),作为整个表达式最终的取值。需要注意,$是全局范围的,是window的一个属性,相当于window.$。而Array.prototype.sort会返回this。对于window.$来说,this就是window。因此,整个第一部分的值,就是window本身!当然,这个过程的正确运作依赖于当前浏览器的Array.prototype.sort实现能对this为window的情况容错。
通过第一部分,我们已经获得将任何值转换为字符串的简单方法,并能产生任意的数值,理论上就可以从javascript的取值系统中提取出大部分字母(不知道是不是全部,需要考证)。并且,我们获取到了window的引用。下面就可以开始上下其手,为所欲为了。木哈哈哈哈哈!
可以看出,上面的第10步是与浏览器的具体实现相关的,因此也存在着某些浏览器下需要对代码作出修改的可能。
现在看第二部分,事实上已经非常明朗了,唯一需要注意的是,现在$是一个函数,因此~$ = ~0 (无法直接转换为数字则作为0处理) = -1。
[__[_/_]+__[_+~$]+$_[_]+$$](_/_) = ["false"[1]+"false"[3+(-1)]+"true"[3]+"rt"](1) = ["a"+"l"+"e"+"rt"](1)
所以,整条式子相当于:
window["alert"](1)
最后只想再感慨一次:黑客的想象力是无限的。理解代码并不难,问题是一开始时他们是怎么能想出来的。。。
Read more...
远程控制、木马程序
灰鸽子、byshell、ghostrat、pi、黑洞、http://www.darkcomet-rat.com/ 、pcshare、
向日葵
logmein (竟然是上市公司)logmein旗下的hamachi 反向VPN
TeamViewer
各种VNC
gotoassist
live mesh
softether 反向的VPN
crossloop http://www.crossloop.com/howto/access_codes?src=hp
logmein
TeamViewer
live mesh
softether 反向的VPN
这里有几十个老外的远程控制软件列表。
http://en.wikipedia.org/wiki/Comparison_of_remote_desktop_software
mikogo
不能主动回连的:
remote anywhere
radmin
damware
netop 貌似还能搞网络会议
pcanywhere
Read more...
位运算交换变量 不用临时变量(C位运算)
尤其是利用”异或“运算,实现交换两个值,而不用临时变量。
通常我们交换两个值,都是用一个临时的变量temp,拿交换a,b的值为例,通常的做法是:temp = a;a = b;b = temp;不过利用位运算,真的是方便很多:
假如 a = 3,b = 4。想将a和b的值互换,可以用一下赋值语句实现:
a = a ^ b;
b = b ^ a;
a = a ^ b;
下面用竖式进行简单说明:(10进制化为二进制)
a = 011
(^) b = 100
则 a = 111(a ^ b的结果赋值给a,a已变成了7)
(^) b = 100
则 b = 011(b^a的结果赋给b,b已经变成了3)
(^) a = 111
则 a = 100(a^b的结果赋给a,a已经变成了4)
从上面的竖式可以清楚的看到利用异或运算实现两个值交换的基本过程。
下面从深层次剖析一下:
1.对于开始的两个赋值语句,a = a ^ b,b = b ^ a,相当于b = b ^ (a ^ b) = a ^ b ^ b,而b ^ b 显然等于0。因此b = a ^ 0,显然结果为a。
2. 同理可以分析第三个赋值语句,a = a ^ b = (a ^ b) ^ a = b
注:1.^ 即”异或“运算符。它的意思是判断两个相应的位值是否为”异“,为”异"(值不同)就取真(1);否则为假(0)。
2.^运算符的特点是与0异或,保持原值;与本身异或,结果为0。
Read more...
资源提取器
资源破解,并不是很复杂,方法大致有3种
1,硬性破解
通过观察目标文件和反汇编代码,分析出资源压缩或者加密的格式,写程序读取改文件,并转换成一种自己可以识别的格式就OK了
这是自己动手解资源时最容易想到的做法
具体来说,也就是通过一些特定函数,譬如 fopen、createFile这样的文件相关函数,确定游戏的解资源函数,然后就拼命的分析汇编代码就OK了
我前期大部分资源都是这样破解的,最好先用UEDIT分析一下实际的文件,有些格式太简单了,通过文件大小,用看的就可以了:)
这种方法,我解过的最复杂的就是神奇传说系列,当时就感觉和GIF比较像,但又不太一样,因为对压缩算法没研究,所以就没深究了,不过后来从网上看到文章说,那是一个很通用的压缩算法,一些解压工具就可以可以解开的,◎#¥%……真是不爽(不过还好,我只花了几个小时就解开那个游戏而已:))
2,Dump
等图片载入后,直接从内存中导出
这种做法也很容易想到的,主要难点在于内存中资源的格式问题,可能对3D游戏来说,这种解法比较容易一些,毕竟纹理渲染这些,是显卡完成的,不是软件实现的
我了解到的有些人解魔兽的资源就是这样解开的,hook OpenGL的一些函数:)
我这样解过一些游戏的文本(汉化用的文字),赛车游戏的,为了获取所有游戏文本,特地将那款游戏通关的说:)
3,直接调用游戏的解码函数解码
和第2种做法类似,但是主动调用函数,基本上可以一次将所有资源全部解开,不需要游戏通关:)
当然,不是让你调用游戏的解包模块,毕竟很多游戏都不是dll形式的
只能侵入到游戏进程内部,找一个合适的时机(一般是载入其他文件的时候,中断跳转一下,先把我们的事做完:)),调用内部函数,解开所有的资源
我解过一款游戏就是用这种方法,说起来,那款游戏的资源压缩率和rar差不多(我试着压缩过解开的文件,大小和rar压缩后的大小比较接近,不太清楚是什么算法,但要是用汇编来分析,想想就会觉得头痛的:))
这个做法其实和第一种方法也有些类似,也是先找到解图函数(这个最好用IDA静态分析,因为它在函数跳转这些,比SoftIce要清晰很多,强烈建议大家配合使用:)),然后弄清楚参数,和输出格式,直接调用就可以了:)
这儿需要注意一下的事,函数外部相关变量的问题
我分析的那个游戏,是c++完成的(从汇编就可以很明显的感觉到,N多跳转),解包函数应该是独立封装成一个类,类内部的私有变量,其中有些,再解包函数中使用过的。这个分析起来应该会复杂一点的。
当然,要多动手试试,很多时候,不需要很清楚的知道它是做什么的,猜一下,能达到目的就OK了:)
Read more...
PersonalBrain - 思维导图工具
PersonalBrain是一款独出心裁的思维工具:你不仅可以用它表达概念间的关系和结构,你会发现它还能很好的帮你整理各种琐碎的信息,展开不甚清晰的思想,是思维过程中的有力工具。
本组创建目的:
分享和交流 PersonalBrain使用过程中的心得,技巧,以及各种可能的应用领域
(已知应用包括:个人事务管理,书签,日记,破案,写作,写论文,……)
--
PersonalBrain 官网:http://www.thebrain.com/
PersonalBrain 教程:http://www.thebrain.com/#-56
另外推荐其他的几款工具:
PersonalBrain http://personalbrain.evget.com/
目前比较流行的思维导图软件,使用简单方便,有专业版和普通版区别,专业版收费,界面很漂亮,蓝色的皮肤有点像宇宙的感觉,每个元素有上级、下级、同级3个节点,提供注释、备注等功能。
MindMapper http://www.mindmapper.com/
它严格地遵守托尼巴贡的制图法则,关键字都是放在延伸手臂上。能够提供xml的输出 能与微软办公软件沟通,还有最妙的时间线进度。 快捷键是最好用的,无需点鼠标就可以建立新节点。
ThinkMap SDK http://www.thinkmap.com/
软件介面非产酷,强大的数据库功能,3d树形网络,有很好的API开发接口。就是价格太贵。
FreeMind
FreeMind是一款跨平台的、基于GPL协议的自由软件,用Java编写,是一个用来绘制思维导图的软件。其产生的文件格式后缀为.mm 。可用来做笔记,脑图记录,脑力激汤等。
Xmind http://www.xmind.net/
XMind是一款易用性很强的软件,通过XMind可以随时开展头脑风暴,帮助人们快速理清思路。XMind 绘制的思维导图、鱼骨图、二维图、树形图、逻辑图、组织结构图等以结构化的方式来展示具 LOGO
mindmanager http://www.evget.com/zh-CN/product/1069/feature.aspx
mindmanager由美国Mindjet公司开发,界面可视化,有着直观、友好的用户界面和丰富的功能, 可使使用者有序地组织思维、资源和项目进程,同时它是高效的项目管理软件,能很好提高项目组的工作效率和小组成员之间的协作性。它作为一个组织资源和管理项目的方法,可从思维导图的核心分枝派生出各种关联的想法和信息。
Read more...
把exe程序设置为屏幕保护
把文件夹选项中的隐藏已知文件扩展名前面的勾去掉
然后把EXE文件改名成为.scr文件,比如,1.exe 改为 1.scr
放到windows目录下,
然后就可以在屏幕保护选择那里看到了,选择就行了。
Read more...
不能启用共享访问-错误1722 rpc服务不可用
今天使用VMware时,需要连接网络。选择“允许其他网络用户通过此计算机的Internet连接来连接” 后弹出 错误 “错误1722 rpc服务不可用”。
发现是“DHCP Client”服务没有启动。
启动“VMware Network Adapter VMnet8”网络连接 后选择 共享 选择 VMNET8 确定。
虚拟机设置里的网络连接选择“NAT:使用已共享的主机IP地址“,虚拟系统设置为”自动(DHCP)“就OK了
Read more...
wordpress title修改
想修改WordPress博客的title,从网上找了几个方法。感觉这个最好用,拿来分享。
登陆后台打开主题文件header.php文件找到<title>…</title>将如下内容替换掉即可
Read more...
替换成上面的代码后我们去刷新文章页面会发现已经是文章标题—博客名称了。这个—可以换成你喜欢的|、>>等等都是可行的。
当在首页时候显示“博客客名称—博客描述”、而在文章页面的时候显示“文章标题—博客名称”。
—
介绍几个比较出名的编程acm题库
几个比较大的在线提交系统(Online Judge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有Pascal/C /C++/Java)写好源代码提交即可,会实时返回信息告诉你是否正确。采用黑箱测试,系统里有一套标准的输入输出数据(对外保密,而且通常数据很多很 怪),你的程序的输出和标准输出完全符合即可。常见的返回信息有AC(Accepted,通过)WA(Wrong Answer,输出有错 误)TLE(Time Limit Exceeded,超时)MLE(Memory Limit Exceeded,内存溢 出)RE(Runtime Error,发生实时错误)等,只有AC了才算做对一题。这里只是一个简要介绍,请大家在做题时先看看各网站上的 FAQ,Enjoy it~~~
杭电acm
http://acm.hdu.edu.cn
编程爱好者ACM题库
http://www.programfan.com/acm/
Enjoy ACM Life
http://acm.asus.com.cn
清华ACM
http://acm.lib.tsinghua.edu.cn
浙江大学 Online Judge(ZOJ)
http://acm.zju.edu.cn
国内最早也是最有名气的OJ,有很多高手在上面做题。特点是数据比较刁钻,经常会有你想不到的边界数据,很能考验思维的全面性,现在我主要在这个OJ上做题
北京大学 Online Judge(POJ)
http://acm.pku.edu.cn/JudgeOnline/
建立较晚,但题目加得很快,现在题数和ZOJ不相上下,特点是举行在线比赛比较多,数据比ZOJ上的要弱,有时候同样的题同样的程序,在ZOJ上WA,在POJ上就能AC
西班牙Valladolid大学 Online Judge(UVA)
http://online-judge.uva.es/problemset/
世界上最大最有名的OJ,题目巨多而且巨杂,数据也很刁钻,全世界的顶尖高手都在上面。据说如果你能在UVA上AC一千道题以上,就尽管向IBM、微软什么的发简历吧,绝对不会让你失望的。
俄罗斯Ural立大学 Online Judge(URAL)
http://acm.timus.ru/
也是一个老牌的OJ,题目不多,但题题经典。
UsacoGate Online Judge(USACO)
http://ace.delos.com/usacogate
全美计算机奥林匹克竞赛(USACO)的训练网站,特点是做完一关才能继续往下做,与前面的OJ不同的是测试数据可以看到,并且做对后可以看标准解答,所 以如果大家刚开始的时候在上面那些OJ上总WA却找不到原因的话,可以试着来这里做做,看看测试数据一般是从什么地方阴你的。
Read more...
Linux下windows应用程序的安装使用
许许多多的优秀的windows软件不支持Linux下的运行。 很多时候,在使用Linux系统时我们要用的这些应用程序,在Linux下要怎样运行呢?下面推荐几个工具:
1.Linux下安装的vmware
先想到的就是他,因为在windows系统下虚拟机我用 的vmware最多,便搜索。
有找到,但是不多,看来用VMware的不多额。
2.知名的wine
官方网站: http://www.winehq.org/
wine可能是大多数人的选择吧
在搜索过程中,发现了一个CrossOver,他能安装许多windows办公程序,像IE、office、Photoshop、Dreamweaver、Flash 、Fireworks等等。在wine官网上我看到CrossOver是wine的一个polished version,明白了WHY。
Read more...