61阅读

php秒杀实现过程-17秒擒获Pwn2Own“独角兽”!360实现真正秒杀

发布时间:2018-03-22 所属栏目:业界

一 : 17秒擒获Pwn2Own“独角兽”!360实现真正秒杀

日前,在加拿大温哥华举行的Pwn2Own2015世界黑客大赛上,来自中国安全公司360的攻防研究团队360VulcanTeam初次亮相,仅用时17秒就攻破了微软Win8.1系统和64位IE11浏览器,一举斩获号称Pwn2Own难度最高的“独家兽”规格奖项。

图:360VulcanTeam,生命不息,攻防不止

今年Pwn2Own黑客大赛的IE11项目被公认为史上最高难度,挑战IE的参赛者不仅要攻破IE11的增强沙箱保护和64位进程,还要突破微软最新版本的EMET漏洞防御工具,这些非默认配置大大提升了黑客攻击的难度。Win8.1相比去年也增加了多项系统级安全机制,赛前IE被普遍认为有望保住“不破金身”,连国际顶级黑客团队VUPEN也公开吐槽IE难度高并退出比赛。

360VulcanTeam负责人MJ0011表示:360面向国际市场提供专业的互联网安全服务,必须深入研究黑客攻击技术,才能够深入理解如何设计更安全的防御产品。此次360Vulcan团队参加Pwn2Own大赛高难度项目的挑战,一方面是在世界大赛上展示中国网络安全行业的技术实力,另一方面也可以促进我们与国外高水平攻防团队的技术交流。

事实上,最近一段时间中国团队在世界舞台上频繁展现“17秒”的魅力,实现了多个“17秒旋风”。

据了解,在近日举办的第11届文莱国际武器实用技能比武大赛上,由北京军区组成的我军代表团首次参赛,中国枪手17秒跨三大障碍,引得外军全被惊呆。据参加比赛的解放军战士透露,步枪障碍赛分两个阶段,在第一个阶段中,要翻越3个障碍,然后进行射击。比赛一开始,6名战友“嗖”的一下,以17秒的惊人速度通过3个障碍,第18秒枪已响,整套动作给观众带来极大的视觉冲击,其他国家的选手也因我们的表现而惊呆了。我们在第一阶段以大比分领先,位居第一。

而在去年的ESPN拳击之夜上,中国31岁退役冠军张志磊17秒闪击美籍拳手,在第一回合仅用时17秒,张志磊就KO了来自美国田纳西州的拳手库特斯-李-塔特,创下了拳击史上最快KO纪录。

和这些世界级冠军一样,来自全球最大的互联网安全公司360的安全研究团队也在17秒之内攻破了“武装到牙齿”的IE11浏览器最高级别防护,擒获“独角兽”大奖,实现真正的秒杀!

据悉,Pwn2Own是全球公认级别最高的黑客大赛,比赛主办方为惠普ZDI项目,微软、Google、苹果等巨头也均是该赛事的赞助商。参赛黑客可以选择IE、Chrome、Safari和Firefox浏览器或AdobeFlash、AdobeReader插件作为攻击目标,其中Chrome和IE是挑战难度最高的两款产品。

二 : linux下php实现多线程

今天遇到个问题,写了个程序从网上抓了150000个图片的地址,存到了txt文档中,每行存了一个图片的地址。现在想将图片下载下来,保存到本机,但是下载的速度不是很快,所以用到了php在linux下面实现多线程,首先将txt文件拆成了10个大小相等的文件,每个文件存储了15000条图片的地址,同时开启10个进行运行保存图片的程序,这样的时间可能就只是原来的1/10。下面将程序贴出来 ,大家指导一下有没有更好的方法。

01
71 function for_save_img($num)
02
72 {
03
73 for($i = 0; $i <= $num; $i++)
04
74 {
05
75 system("/usr/local/bin/php index.php crawl save_img {$i} & > /tmp/null");
06
76 }
07
77 }
08
78
09
79 function save_img($num)
10
80 {
11
81 static $i = 0;
12
82 //把文件读成一个数组
13
83 $img_urllists = ROOTDIRPATH . "/static/image_{$num}.txt";
14
84 $arr_img_url = file($img_urllists);
15
85 foreach($arr_img_url as $imageurl)
16
86 {
17
87 $imageurl = trim($imageurl);
18
88 echo $imageurl;
19
89 $this->benchmark->mark("code_start");
20
90 //存图片
21
91 $final_imageurl = "http://www.****.com/upload/UploadFile/" . $imageurl;
22
92 $img_open = file_get_contents($final_imageurl);
23
93 $ret = file_put_contents(ROOTDIRPATH . &#39;/static/uploadimg/&#39; . $imageurl, $img_open);
24
94 if($ret)
25
95 {
26
96 echo "Success......";
27
97 }
28
98 $this->benchmark->mark(&#39;code_end&#39;);
29
99
30
100 echo $this->benchmark->elapsed_time(&#39;code_start&#39;, &#39;code_end&#39;);
31
101 }
32
102 }
33

34

35
该程序为ci框架下 在linux的shell下 网站的根目录运行 php index.php crawl for_save_img
36
大家有好的建议欢迎提出 虚心接受
作者:岳冠群

三 : linux下php实现C/C++扩展编程

某个功能被编译到so文件中,那么如何通过php来调用它?一个方法是写一个php模块(php extension),在php中调用该模块内的函数,再通过该模块来调用so中的函数。下面做一个简单的例子,使用的操作系统是Fedora Core 6。

    首先做一个简单的so文件:

    /**
     * hello.c
     * To compile, use following commands:
     *   gcc -O -c -fPIC -o hello.o hello.c
     *   gcc -shared -o libhello.so hello.o
     */
    int hello_add(int a, int b)
    {
        return a + b;
    }

    然后将它编译成.so文件并放到系统中:

    $ gcc -O -c -fPIC -o hello.o hello.c

    $ gcc -shared -o libhello.so hello.o

    $ su

    # echo /usr/local/lib > /etc/ld.so.conf.d/local.conf

    # cp libhello.so /usr/local/lib

    # /sbin/ldconfig写段小程序来验证其正确性:
    /**
     * hellotest.c
     * To compile, use following commands:
     *   gcc -o hellotest -lhello hellotest.c
     */
    #include <stdio.h>
    int main()
    {
        int a = 3, b = 4;
        printf("%d + %d = %dn", a, b, hello_add(a,b));
        return 0;
    }

    编译并执行:

    $ gcc -o hellotest -lhello hellotest.c

    $ ./hellotest

    3 + 4 = 7OK,

    下面我们来制作PHP模块。首先确保你安装了 php-devel 包,没有的话请自行从安装光盘上找。然后下载php源代码。我使用的是php-5.2.9.tar.gz,解压缩。

    $ tar xzvf php-5.2.9.tar.gz

    $ cd php-5.2.9/ext然后通过下面的命令建立一个名为 test 的模块。

    $ ./ext_skel --extname=test执行该命令之后它会提示你应当用什么命令来编译模块,可惜那是将模块集成到php内部的编译方法。如果要编译成可动态加载的 php_test.so,方法要更为简单。

    $ cd test首先编辑 config.m4 文件,去掉第16行和第18行的注释(注释符号为 dnl 。)

    16:  PHP_ARG_ENABLE(test, whether to enable test support,
    17:  dnl Make sure that the comment is aligned:
    18:  [  --enable-test           Enable test support])然后执行 phpize ()程序,生成configure脚本:

 $ phpize然后打开 php_test.h,在 PHP_FUNCTION(confirm_test_compiled); 之下加入函数声明:

    PHP_FUNCTION(confirm_hello_compiled);   /* For testing, remove later. */
    PHP_FUNCTION(test_add);打开 hello.c,在 PHP_FE(confirm_test_compiled, NULL) 下方加入以下内容。
    zend_function_entry test_functions[] = {
        PHP_FE(confirm_test_compiled,  NULL)       /* For testing, remove later. */
        PHP_FE(test_add,   NULL)       /* For testing, remove later. */
        {NULL, NULL, NULL}  /* Must be the last line in test_functions[] */
    };

    然后在 test.c 的最末尾书写test_add函数的内容:

    PHP_FUNCTION(test_add)
    {
        long int a, b;
        long int result;
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
            return;
        }
        result = test_add(a, b);
        RETURN_LONG(result);
    }

    保存退出,编译并安装:

    $ ./configure --enable-jinzhesheng_module --with-apxs=/usr/local/apache/bin/apxs --with-php-config=/usr/local/php/bin/php-config$ make

    # cp modules/test.so /usr/lib/php/modules然后在 /www/web/ 下建立一个 test.php 文件,内容如下:

    <?php
        dl("test.so");
        echo test_add(1, 2);
    ?>

    然后在浏览器中打开test.php文件,如果显示3,则说明函数调用成功了。

四 : PHP实现通过Web执行C/C

一,简介

如果你对Unix/Linux有所了解的话,你应该知道他们大都自带了C和C++的编译器,分别是GCC和G++。Unix在程序安装及Make等许多地方使用到了这些编译器。利用一些控制台命令,C++和PHP, 我将向你介绍怎样生成一个完整的C++程序例子,他可以在用PHP程序来执行,并能获得相应的输出结果。我将先生成C++程序代码,并编译它,谈后讨论我们将如果通过使用PHP的函数passthru来执行这个程序。从某种意义上来说,这边文章给我们提供一种通过Web页面来访问一般程序的方法。

为了能更好的理解这篇文章,你应该有一台运行着apache和最新版本php的unix/Linux服务器。同时也应该掌握C++, unix控制台命令,当然一些PHP的编程经验也是必需的。

二,编写一个C++程序

例如,我们可以写一个能够通过命令行还接收参数的C++ 简单程序,并命名为Sampleapp.然后我们能够按照下面的方式给他传递三个不同的参数 :

Sampleapp ?参数一 ?参数二 ?参数三

这个程序的功能是能输出传递给他的参数的个数和每个参数的值,然后我们可以用PHP脚本程序来执行编译好的C++程序。

利用你习惯的文本编辑器,新建一个名为Sampleapp.cpp 的文件,再此文件中输入如下的代码:

#include
int main(int argc, char* argv[])
{
cout <<endl <<"You passed " <<argc-1 <<" arguement"
<<(argc-1 == 1 ? "" : "s") <<"." <<endl;

cout <<(argc-1 == 1 ? "This" : "These")
<<" arguement" <<(argc-1 == 1 ? "" : "s") <<" "
<<(argc-1 == 1 ? "is" : "are") <<": " <<endl <<endl;

for(int i = 1; i <argc; i++)
cout <<"[" <<i <<"] " <<argv[i] <<endl;

return 0;
}

这个C++程序包含的程序的入口点:main(),main()函数带了两个参数:argc(命令行传入参数的个数)和argv(一个包含了所传参数实际值的字符型指针数组)。这个两个参数能被C++编译器自动捕获。

cout <<endl <<"You passed " <<argc-1 <<" arguement"
<<(argc-1 == 1 ? "" : "s") <<"." <<endl; ;

这句话的意思是获得从执行命令行传入的参数的个数。Argv这个字符型指针数组是从0开始检索的,它至少包含一个实际的值(即本程序的路径和名称),这个值由C++编译器自动地附加上去。条件操作符”?”是用来判断命令行传入地参数是否多于一个。例如,如果命令行过传入两个参数,我们地程序将输出如下信息:

You passed 2 arguments.

cout <<(argc-1 == 1 ? "This" : "These")
<<" arguement" <<(argc-1 == 1 ? "" : "s") <<" "
<<(argc-1 == 1 ? "is" : "are") <<": " <<endl <<endl;

接下来,我们同样用条件操作符来输出另一句话。不过要记住,即使我们不从程序执行命令行传入任何参数,main函数地argv[]参数也包含一个值。同样地,如果我们从命令行传入两个参数给程序,程序将输出如下地信息:

These arguments are:

for(int i = 1; i <argc; i++)
cout <<"[" <<i <<"] " <<argv[i] <<endl;

最后,main函数逐一的输出命令行传入的每个参数,它用到了一个简单的for(; ; )循环语句,这个函数能根据参数的个数将参数值一个一个的输出。假如我们传给程序两个参数”first”和second”, for循环输出的结果如下:

[1] ?first
[2] ?second

以上是关于这个C++程序的简单说明,它的功能十分简单,就是将命令行传入的参数用cout函数显示在输出屏幕上。

接下来,我们将编译这个.cpp文件,如果你在windows平台下,需要telnet到所使用的server上。在这里,我们使用大多Unix机器上都提供的G++编译器来编译这个源文件。不过为了确信你的机器安装了G++,你可以输入如下命令:which g++。如果G++已经安装了,Unix shell将显示出G++所在的全路径。如果没有安装,它将提示你说”command couldn’t be found”. 你可以在这里下载到G++.

在源文件所在的目录输入如下G++命令:

g++ -c sampleapp.cpp.

通过这个命令,我们就将.cpp文件编译成了包含机器代码的目标文件。通过 ls ?a命令,你可以发现在本目录下出现了一个新文件sampleapp.o,这就是.cpp源文件被编译成机器码的结果。不过我们最终想要的是一个可执行文件,因为我们还要输入如下的G++命令:

g++ sampleapp.cpp ?o sampleapp

这样我们就获得了一个名为sampleapp的可执行文件。不过注意的是,Unix下的可执行文件跟Windows不一样,它没有任何后缀。

下面我们可以来检验一下程序执行的结果,如果如下命令:

sampleapp one -two /three

我们可以看到如下的执行结果:

You passed 3 arguments.
These arguments are:

[1] one
[2] ?two
[3] /three

现在,可执行的C++程序成生完毕,下面我们将生成一个能够通过 web浏览器来访问这个程序的PHP教本程序。

三,生成PHP脚本程序

为了能通过Internet来调用我们的C++程序,我们需要生成一个PHP脚本程序。这个PHP脚本程序将有一个Form表单,以便用户能输入可以传给程序Sampleapp的参数。PHP脚本的代码太长就不在这里全部列出了,需要的话可以通过下面的地址来下载它。(Php code)

if(@$submit)
{

}
else
{
}

首先,脚本程序检查看变量$submit是否有值,这个变量$submit的值是程序后面的Form表单提交后传递过来的,它缺省为空值。符号@的作用是当变量$submit的值不存在的时忽略相关的错误信息。

由于变量$submit缺省为空,所以一开始执行else{}中的代码,它在浏览器上简单的显示一个Form表单。Form的action属性设为变量$PHP_SELF,即表单提交后返回本页。同时Form表单包含了一个文本输入条,这是用来让用户输入要传递给C++程序的命令行参数。Form如下图所示:

一旦我们输入执行命令并提交表单,变量$submit(即按钮Go的名字)就获得一个值,这样PHP教本将执行if{}之间的代码。

if($args == "")
echo "else
{
echo "$command = "/htdocs/sampleapp " . escapeshellcmd($args);

passthru($command);
}

变量$args是自动产生的,它的值是Form表单中文本输入条传过来的值。如果没有输入任何信息,程序将简单的告诉用户没有输入任何值。

如果用户输入任何非空的信息,程序将把text域的值,即变量$args传给C++程序。下面这段代码就是执行C++的程序的执行命令:

$command = "/htdocs/sampleapp " . escapeshellcmd($args);

函数eacapeshellcmd是用来当做安全检查工具,以过滤调一些如”,”,””和””等的特殊字符。这可以防止一些用户企图输入某些字符来调用系统内部命令。

例如,如果你在Form表单的text域中输入”1 ?two /three”,那么变量$command的值就为: /htdocs/sampleapp 1 ?two /three

你能发现我们定义了程序sampleapp的全路径,在这个例子中,程序文件位于/htdocs目录下。你可以根据的自己程序所在的目录做相应的修改。

passthru($command);

最后,我们使用PHP的函数passthru来执行变量$command所包含的命令并且将原始的执行结果输出到浏览器上。在我的服务器上,返回结果的HTML页面如下:

w在本文即将结束之前,几个可能碰到的问题我想说一下。首先,当你执行sampleapp.php教本程序的时候,如果你没有看到程序的任何输出信息,或许是开了安全模式。如果这样,系统将不会允许PHP脚本来执行系统内部程序。关于如何关闭安全模式,请访问网页http://www.php.net/manual/en/features.safe-mode.php,上面有详细的介绍。其次,在一些Unix系统上,PHP函数passthru不能将内部程序的输出传递给浏览页面,如果发生这种情况,可以用system函数来代替passthru函数。

四,结论

从本的例子可以看出,Unix操作系统非常强大,并且PHP允许开发者通过脚本以独立的线程来执行系统内部程序。本文的所给的例子非常的简单,但是只要再多花一点功夫,你可以写一个能更新Mysql数据库的c++程序,运行其他系统命令的程序或者是操作系统文件/目录结构的程序。但是,不管怎样,你都应该确保你的系统安全,绝对不能让任何其他的脚本程序随意访问系统内部程序。

本文标题:php秒杀实现过程-17秒擒获Pwn2Own“独角兽”!360实现真正秒杀
本文地址: http://www.61k.com/1143575.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1