博文

目前显示的是 六月, 2012的博文

用FLIRT和tamarin的代码自动识别flash里面的函数

图片
首先,一定要装vs 2008。我本来装的是vs 2010,效果非常差。然后装python 2.7,一定要把python的目录加入到PATH中。假设tamarin的源代码目录是D:ostamarin-redux-fb079918582ccd utils
wget ftp://ftp.mozilla.org/pub/js/tamarin/builds/asc/latest/asc.jar
cd ..core
set ASC=../utils/asc.jar
python builtin.py -config CONFIG::VMCFG_FLOAT=false
cd ..shell
python shell_toplevel.py打开D:\ostamarin-redux-fb079918582cplatformwin32avmplus2008.sln,编译。给coreErrorConstants.cpp加BOM。把avmplus项目的Treat Warnings as Errors去掉,然后编译然后用flair做符号> D:\flairpcf avmplus.lib avmplus.pat
avmplus.lib: skipped 1731, total 14180> D:\flairsigmake avmplus.pat avmplus.sig
avmplus.sig: modules/leaves: 8012/4207, COLLISIONS: 407
See the documentation to learn how to resolve collisions.删掉冲突,再做,然后apply上。效果还行update 2014-03-05:

MMgc: The Garbage Collector of Flash Player

MMgc是Flash Player中所使用的memory management garbage collector。MMgc不仅是用来回收ActionScript中的对象,它也用来管理Flash Player中的所有动态内存分配、释放请求,Flash Player VM的C++代码中也有很多对象是交给MMgc自动回收的。所以,从理论上来说,MMgc可以从Flash Player的代码中分离出来,作为一个单独的GC库,给所有C++程序用。在MMgc中,堆上的对象被分为两种,Managed和UnManaged。Managed的就是交给GC去管理,用户只管new,不用delete,但是你也可以手动delete。UnManaged的就是传统的C++中的那些对象,必须手动的new/delete。所有Managed对象必须从class GCObject(或其子类)继承。这个类增加了new和delete方法:class GCObject{ staticvoid *operatornew(size_t size, GC *gc, size_t extra); staticvoid *operatornew(size_t size, GC *gc); staticvoidoperatordelete(void *gcObject); }; 假如一个类从GCObject继承,例如class MyPoint2D : public MMgc::GCObject { int x; int y; }; 那么我们既可以像以前那样直接new:MyPoint2D* p = new MyPoint2D(); //这样得到的对象是不受GC管理的。也可以传递一个gc对象给new:MyPoint2D* p = new (gc) MyPoint2D(); //这样得到的对象受GC管理。不需要delete后面这种的语法看起来很像带placeholder的new,但其实不是。从Managed对象指向Managed对象,要加一个write barrier ,叫DWB。class MyOtherManagedObject : public MMgc::GCObject { DWB(MyPoint2D*) object; }; 对于那些不受GC管理…

A small hack on Adobe FMS

我发现Adobe FMS的程序中包含很多日志输出代码,这些日志信息对于理解RTMFP协议非常有用。例如它会把收发到的每个user data chunk中的AMF对象打印出来,如2012-06-12 17:32:07 8328 (d)0000000 rtmfp send message, session: 08F2F008 flow: 08F22EA0 rel: (-2,-2) kMsgCmd idByte=20 streamId=0 time=0 trxId=1 kEncodingAMF0 _result cmdData=( kObjectType ( fmsVer= kStringType "FMS/4,5,0,297", capabilities= kNumberType 255, mode= kNumberType 1 ) ) arg0=( kObjectType ( level= kStringType "status", code= kStringType "NetConnection.Connect.Success", description= kStringType "Connection succeeded.", objectEncoding= kNumberType 3, data= kArrayType ( version= kStringType "4,5,0,297" ) ) ) -2012-06-12 17:32:07 8328 (i)2581173 rtmfp recv message, session: 08F2F008 flow: 05624900 kMsgCmdEx idByte=17 streamId=0 time=724 trxId=0 kEncodingAMF0 setPeerInfo cmdData=( kNullType ) arg0=( kStringType "192.168.15.1:53804" ) arg1=( kStringType "192.168.146.1:53804" ) arg2=( kStrin…

CVE-2012-2122: MySQL身份认证漏洞

我今天早上来上班,打开电脑,在seclists中看到一个很惊人的邮件: http://seclists.org/oss-sec/2012/q2/493 MySQL爆出了一个很大的安全漏洞,几乎影响5.1至5.5的所有版本。出问题的模块是登录时密码校验的部分(password.c),在知道用户名的情况下(如root),直接反复重试(平均大约256次)即可登入。不过,MySQL身份认证的时候是采用3元组,username,ip,password。如果client的IP在mysql.user表中找不到对应的,也无法登陆。 这个BUG实际上早在4月份就被发现了,今年5月7号,MySQL发布5.5.24的时候,修正了这个BUG。 漏洞分析: 出问题的代码如下my_bool check_scramble(const uchar *scramble_arg, constchar *message, const uint8 *hash_stage2){ SHA1_CONTEXT sha1_context; uint8 buf[SHA1_HASH_SIZE]; uint8 hash_stage2_reassured[SHA1_HASH_SIZE]; mysql_sha1_reset(&sha1_context); /* create key to encrypt scramble */ mysql_sha1_input(&sha1_context, (const uint8 *) message, SCRAMBLE_LENGTH); mysql_sha1_input(&sha1_context, hash_stage2, SHA1_HASH_SIZE); mysql_sha1_result(&sha1_context, buf); /* encrypt scramble */ my_crypt((char *) buf, buf, scramble_arg, SCRAMBLE_LENGTH); /* now buf supposedly contains hash_stage1: so we can get hash_stage2 */ mysql_sha1_reset(&s…

CHAP、HMAC、HOTP、TOTP等等

去年CSDN密码泄露案公布之后,很多专家跳出来讨伐说他家的程序员太白痴居然还在数据库里面存明文。最近linkedin的事件出来之后,如何保存密码,这个问题又被拉出来谈。我认为,密码怎么保存与怎么在网上传输,这两个问题不能分开来谈。除非你已经有了安全的信道,如SSL,否则还是存明文为妙。mysql对其原始的CHAP协议做了些改进:
storedhash=sha1(passphrase)
reply=xor(passphrase, sha1(public_seed,storedhash)在网络上发送的是public_seed、reply,数据库里面存储的是storedhash。所以如果只是拿到了mysql.user表里的数据,而没有原始的passphrase,想要构造出reply,还是挺困难的。不过我估计这个算法是工程师自己想出来的,根本就没找安全专家讨论过,未必经得起推敲。今天我在我的手机上装了google authenticator,它主要是采用TOTP的方式进行身份验证。TOTP是HOTP的一个变种,把HOTP中的counter换成了时间,TOTP = Truncate(HMAC-SHA-1(K,T)) 。其中K是双方之间已经共享的一个密钥,而T则是当前时间除以步长(默认是30)得到的。用手机做这个的一个优势是,K的分发可以不走网络,而是通过二维码。我准备抽空好好看看SRP。

小说《玩笑》的主要人物列表

《玩笑》是米兰昆德拉发表的第一部长篇小说,我刚看完,写点读书笔记吧。小说的第一章大概发生在1964、1965年左右。该小说于1965年12月5日在布拉格完稿,在1967年春天在布拉格出版。路德维克:1947年秋天开始上大一。大二的时候遇到玛凯塔,喜欢她。1949年夏天寄给玛凯塔的一张明信片上写到:“乐观主义是人民的鸦片!健康精神是冒傻气!托洛茨基万岁!”。在他看来本是一句玩笑,但玛凯塔很认真的把这个卡片交给了组织。1949年秋天,路德维克因此被开除党籍、学籍。1950年开始,作为黑五类被派去俄斯特拉发的矿井中工作了五年。玛凯塔:路德维克大学时的女友、学妹,比路德维克小1岁,小1级。考茨卡:路德维克的大学里的一个年轻教师,虔诚的基督徒。大约1950年被迫离校,然后去西波希米亚地区的一个国营农场工作,1951年11月,在那里认识露茜。大约1952年,离开农场。1956年秋天,在布达格到布拉迪斯拉发的火车上再次遇到路德维克。路德维克给他找了份工作,去路德维克老家的一家医院的病毒科工作,给动物做实验。露茜*赛贝考娃:路德维克在俄斯特拉发的电影院门口遇见的一个姑娘,他很喜欢她。但是露茜因不愿跟路德维克ML,跑掉了。巴维尔*泽马内克:路德维克上学时的学生会干部,他牵头发起了对路德维克的批判,并提议将他开除。埃莱娜:电台记者,泽马内克的妻子。采访路德维克的时候被他勾引,随后被骗去路德维克老家的小旅馆开房。雅洛斯拉夫:大约是1930年出生。路德维克的中学同学,和路德维克曾一起组了个扬琴乐团。1948年,去布尔诺高等音乐学院上大学。大约2年后,辍学回家。芙拉丝塔:雅洛斯拉夫的妻子。符拉第米尔:雅洛斯拉夫的儿子。大约是1950年出生。阿莱克塞:和路德维克一起在俄斯特拉发工作的“黑五类”。在军营中吞药自杀。兹德娜:埃莱娜的女儿。历史背景:尤利乌斯·伏契克:1903-1943,捷克记者、作家。1942年被捕,后来在狱中写下了《绞刑架下的报告》。托洛茨基:苏联共产党领袖,斯大林当权时代,托洛茨基被视为反斯大林主义、革命叛徒。1945年8月,二战结束。1948年2月,捷共上台。1953年3月,斯大林去世。之后赫鲁晓夫上台。1956年,东欧骚乱。小说中多次提到,“即使是在1956年,人人都想把党抛弃的时候”1964年10月,赫鲁晓夫下台,勃列日涅夫上台。1968年1月,杜布切克任捷克斯洛伐克第…

2012-06-06

今天下载了Adobe Flash Media Server 的试用版,用PEID探测,没有壳。用IDA载入,相当的顺利。令我兴奋的是,它有很多代码与Adobe Flash Player是相同的,但是不同的是,Adobe Flash Media Server 编译的时候加RTTI了,于是看到类名的一刹那,瞬间揭开了我很多困惑。class type_info中存储的字符串是decorate之后的名字,如.PAVblah@@,如何把这样的名字转换成原来的形式,貌似并不简单。vc自带一个undname命令,我试了,不好使。Windows SDK中有UnDecorateSymbolName这个API,我准备明天试试,先SymInitialize,然后UnDecorateSymbolName。有一个难点是,如何找到type_list的root。关于这个转换规则,在http://www.agner.org/optimize/calling_conventions.pdf 到是有很详细的描述。

Diffie-Hellman算法的效率

我之前一直有个误解,以为DH的私钥的长度必须跟公钥一样。今天调试flash的时候发现,它的DH算法用的私钥长度竟然是128位,虽然它采用的同余群的p是1024位的。我然后翻了些资料,看DH算法对私钥的长度有何要求。从Sun JDK的代码来看,对私钥x只有一个要求,1 <= x <= p-2,那么也就是说只要它的长度小于1024就没有问题。BigInteger pMinus2 = p.subtract(BigInteger.valueOf(2)); do { // generate random x up to 2^lSize bits long x = new BigInteger(lSize, random); } while ((x.compareTo(BigInteger.ONE) < 0) ||((x.compareTo(pMinus2) > 0))); 其中无论是生KeyPair,还是计算secret,其中最耗时的无非是大整数的次幂再求余的运算,即BigInteger的modPow。 我想拿google的caliper测试一下DH的性能,结果,当private key的长度稍微大一点的时候,caliper就不干了,说Got no response。1 of 2 measurements complete: 50.0%.java.lang.RuntimeException: Got no response!
at com.google.caliper.runner.CaliperRun.measure(CaliperRun.java:234)
at com.google.caliper.runner.CaliperRun.run(CaliperRun.java:132)
at com.google.caliper.runner.CaliperMain.exitlessMain(CaliperMain.java:88)
at com.google.caliper.runner.CaliperMain.main(CaliperMain.java:58)
at com.google.caliper.runner.CaliperMain.main(CaliperMain.java:47)可能是因为运行的时间太长了,于是我就自己写代码…