对没有标记为安全的activex控件进行初始化和脚本运行_RASP攻防 —— RASP安全应用与局限性浅析...

6c26ca34844e3de5c1ec9a0b8dbcf977.png

|【腾讯安全平台部数据安全团队】 qiye & baz

前言

随着Web应用攻击手段变得复杂,基于请求特征的防护手段,已经不能满足企业安全防护需求。在2012年的时候,Gartner引入了“Runtime application self-protection”一词,简称为RASP,属于一种新型应用安全保护技术,它将防护功能“ 注入”到应用程序中,与应用程序融为一体,使应用程序具备自我防护能力,当应用程序遭受到实际攻击伤害时,能实时检测和阻断安全攻击,而不需要进行人工干预。

腾讯洋葱反入侵团队早在很多年前就研究RASP的应用场景,2014年还在TSRC搞了一次基于rasp的webshell攻防挑战赛,详见(https://security.tencent.com/index.php/blog/msg/57);近几年从PHP逐步扩展到Java,Python,Nodejs等其他语言。RASP通过实时采集Web应用的高风险行为,通过特征规则、上下文语义分析及第三方安全产品数据关联分析等多种安全模型来提升检测准确率,相较于传统Web应用安全产品,RASP从海量的攻击中排除掉了大量的无效攻击,聚焦发现真实的已知和未知安全威胁。经过多年的实践我们发现RASP也存在一些缺陷和不足,本文以PHP RASP作为研究对象抛砖引玉,在此分享RASP的应用场景和问题。本文主要分三个部分:RASP架构原理简要介绍、RASP安全应用场景介绍 及 RASP对抗浅析。

注意:文中涉及的文章pdf ,代码,思维导图存放于https://github.com/qiyeboy/my_tsrc_paper仓库中,喜欢的朋友可以自取。

一、 RASP架构原理简要介绍

以PHP语言为例,PHP语言自身提供扩展机制,可以基于扩展机制开发RASP系统。

腾讯自研的TRASP架构示意图:

a8ca859826711bcc8318a1135a7e0b4a.png


TRASP 整个架构大致分为3个部分:1. 客户端模块;2. 云端数据分析模块; 3. 安全处置模块。

1、客户端模块;负责数据采集和规则匹配,数据采集可以配置策略采集需要的数据(如SQL执行/命令执行/代码执行/文件操作等),RASP可以根据需求配置数据采集策略,需要注意的是采集数据越多资源消耗也会随之增大;


2、云端数据分析模块;有些场景通过前端规则无法完全解决,需要上报数据到云端分析进行二次分析,包括使用机器学习算法,关联分析等;

3、安全处置模块;负责配置事件安全等级和处置策略,RASP串行在业务中,误报会影响业务,需要根据安全事件的等级和精准度配置阻断/异步告警/安全通知等不同的处置策略。

PHP RASP扩展原理和实现简要介绍:

PHP RASP作为PHP解释器的扩展,是一个动态库so文件,PHP语言中类似的动态库很多,比如:mysql.so,RASP和MYSQL扩展的加载方式和运行原理一样,集成在PHP解释器中。接下来从3个方面简单描述一下TRASP扩展模块的实现原理。

1. 预加载

任何一个PHP实例都会经过Module init、Request init、Request shutdown和Module shutdown四个过程。

Module init

在所有请求到达前发生,例如启动Apache服务器,PHP解释器随之启动,相关的各个模块(Redis、Mysql等)的MINIT方法被调用。仅被调用一次。在开发XXX扩展时,相应的XXX.c文件中将自动生成该方法:

416abaf5a5b79c5b4a291c1e00eb2cdd.png

Request init

每个请求到达时都被触发。SAPI层将控制权交由PHP层,PHP初始化本次请求执行脚本所需的环境变量,函数列表等,调用所有模块的RINIT函数。XXX.c中对应函数如下:

a6de597f6156046c82010e80dd098a9b.png

Request shutdown

每个请求结束,PHP就会自动清理程序,顺序调用各个模块的RSHUTDOWN方法,清除程序运行期间的符号表。典型的RSHUTDOWN方法如:

67e47db8508d99a71ffd116d45bde5aa.png

Module shutdown

所有请求处理完毕后,SAPI也关闭了(即服务器关闭),PHP调用各个模块的MSHUTDOWN方法释放内存。

05833f62c24820d2c049357df2acaf49.png

RASP预加载主要在Module init 阶段实现, 通过在初始化阶段预先加载RASP模块, 替换opcode handler与通过自定义函数替换全局函数表位置。

PHP把中间字节码称之为OPCODE,每个OPCODE对应ZEND底层的一个处理函数,ZEND引擎最终执行这个处理函数。

2. Hook Opcode 或 Hook 内部函数

RASP需要监控各个敏感函数的调用,在PHP中比较好的方式便是 Hook Opcode 和 Hook内部函数。


(1) 实现Hook Opcode 功能只需要改变 Hook Opcode 对应的处理函数即可,而 zend 预先就提供了一个现成的接口:zend_set_user_opcode_handler, 如:

9568a224dc4e4bb3336efffe1c6e376f.png

替换 Opcode handler 后便可以自定义函数调用前后的操作, 如获取参数、阻断攻击等, 还可以通过 ZEND_USER_OPCODE_DISPATCH 跳回至原来的Opcode执行,虽然PHP调用函数的方式多种多样, 但从Opcode角度分析, 主要还是分为以下几类, 以php7为例:

1a8d284cbb355d78b0fd1e45252b11ca.png

(2) 另一种实现Hook函数调用的方式就是Hook内部函数, Opcode最终还是会通过CG(function_table)获取所调用函数的handler执行, 那么我们通过修改CG(function_table)表对应函数的handler指向, 便可以指向我们实现的函数,在完成相应操作后继续调用原来的函数实现hook。

2d577d1589eff665dea523a0d06b619d.png

两种方式皆可实现Hook函数,有各自的优点。第一种,适合工程化,只需要对几种Opcode类型进行hook,后续Hook的敏感函数可以自行添加;第二种则是需要对敏感函数进行逐一替换,比较繁琐,但优点是替换发生在函数表内,故通过越过Opcode进行函数执行的手法也无法绕过检测,更加可靠。

3. 参数获取与分析

在完成对敏感函数调用行为的监控后,通过ZEND_CALL_NUM_ARGS和ZEND_CALL_ARG,我们可以获取到函数的参数个数和内容,便可根据函数的参数制定相应的策略。如文件类可以关注是否读取了敏感文件, 数据库操作类是否语法结构发生了变化等等。

二、 RASP 安全应用场景介绍

1. 基于规则的漏洞攻击检测

通过RASP实时采集Web应用的高风险行为,具体实现为hook漏洞相关的函数,如检测SQL注入(劫持mysqli_query等)、命令注入(system/exec等)、文件上传漏洞(move_uploaded_file等)、xss漏洞(echo/print等);拿到函数数据后对参数进行规则匹配判断是否存在漏洞攻击。举两个例子:
(1)文件上传漏洞,以move_uploaded_file为例,函数说明:move_uploaded_file ( string filename,stringdestination ) : bool,第一个参数为上传文件,如果上传了一个动态php脚本后缀文件即判断存在上传漏洞。


【ip xxx 安全漏洞告警】
TRASP 发现ip xxx存在上传漏洞,漏洞细节如下:
漏洞文件: /data/webroot/xxx/x.php(第201行)
上传的PHP动态脚本: /data/webroot/xxx/1.php


(2)SQL注入,可以发现下图正常的sql和恶意的注入sql有区别,比如使用了union select,可以基于此做安全策略;

da14b318887ea88dc009381a0ca12ef3.png

传统规则可能存在误报,也可以对sql语句做语义解析判断是否存在sql注入攻击,非本文重点不再过多介绍。

2. 基于污点追踪的漏洞检测

通过追踪外部可控制的输入变量(如GET,_POST,REQUEST,REQUEST,_COOKIE等)是否未经安全处理进入危险函数执行,危险函数包括各种可能导致漏洞的函数,如命令注入相关的system/exec,xss相关的echo/print。污点追踪原理借用了php变量结构体预留的一个标记位,业界知名的相关系统有鸟哥开发的Taint扩展,详情可参考:https://www.laruence.com/2012/02/14/2544.html, 本文不再做过多介绍。

3. IAST扫描联动

先简要介绍下IAST,IAST中文名是交互式应用安全测试,相较于传统的DAST和SAST扫描方式,漏洞检出率更高&误报率更低。IAST目前常见的实现方式有两种,一类是基于代理或网关等形式抓取业务CGI流量后做安全测试扫描,一类是在业务web容器插桩获取业务代码执行细节结合DAST扫描用例判断是否存在漏洞,比如DAST发起一个带有test_from_dongxi字符串的SQL注入测试请求,web容器内插桩劫持数据库相关函数,发现sql语句中有test_from_dongxi的字符串,从而联动发现安全漏洞;RASP可以用于插桩获取代码执行流程,相较于传统漏洞检测方法可以直接定位到有漏洞的代码文件和具体代码行号,业务修复起来更加便捷。

423b752a158b03db83be66df4af6c1a0.png

4. Webshell检测

Webshell文件是一个特殊的cgi文件,有文件操作、命令执行等管理功能,可以基于rasp采集的数据在云端做检测;检测方法包括 规则匹配(适用于一句话木马和混淆webshell有明显特征的样本)、行为统计分析(适用于大马);此外,RASP结合污点追踪也是一种检测方法,通过标记非信任的数据源,监测整个数据链路,此前写过一篇文章,详情可参考:https://security.tencent.com/index.php/blog/msg/152, 本文不再做过多介绍。

三、RASP 对抗浅析

在上文中,介绍了PHP RASP的安全应用场景和实现原理,写了很多RASP的优点,但俗话讲的好:没有绝对安全的系统,接下来分享一下RASP存在的不足。先看一下RASP在LINUX系统中的层级:

27baba646bd741f321f04bad771384c0.png

PHP RASP作为php解释器的扩展,运行在php解释器层面,也就是说在与PHP RASP同级或者在其层级之下的操作,它的监控基本上是失效的,这包括与PHP RASP同一级的其他扩展,PHP解释器之外的进程,以及通过glibc的操作,这很关键。


既然分析绕过手法,那就需要一个绕过的标准,由于命令风险很高,同时更加普遍,因此选择命令作为突破口:

通过PHP脚本任意执行命令,让RASP 无法监控到数据或者无法捕获到正确数据

接下来从9个方面来阐述绕过方法,文中部分知识都是公开的,只是用在了新的场景。

1.函数监控不全

php手册中的函数太多了,总有你想不到的,多翻翻PHP手册,比如rasp hook了以下常用的命令执行函数

6a10d0bee4fd058a2ad450292de7ef19.png

利用Windows中COM组件绕过:

e3f1b87def824754544cc99116295af5.png

2.函数参数混淆

RASP检测基于函数和参数做安全策略,可以对参数做变形绕过检测,举个例子: system 函数,用来执行命令,很多业务文件也用,比如运维管理后台。RASP不能只根据函数做报警,会带来大量误报,需要结合参数来做策略,system函数底层原理是执行 sh -c "函数参数",因此我们可以通过命令混淆的方式,成功将RASP动态检测转化为对函数参数的静态检测,这样操作空间就会变得很大。示例如下:

01949db74f0f9c9a7b8939453ff625c7.png

其实在存在命令注入漏洞的场景中,使用混淆的方式是有很大的机会绕过RASP的监控

3.loader型函数

什么叫loader型函数呢? 简单来说函数是正常的,但是通过改变参数来实现恶意行为,函数参数相当于payload。

比如 mail() 函数的第五个additional_parameters参数可用于设置命令行选项传递给配置为发送邮件时使用的程序。

mail 函数的底层原理是调用sendmail程序,当系统使用Exim来发送邮件时,sendmail 的 -be 参数支持运行扩展模式,可以 对指定字符串扩展格式进行解析。

默认情况下 sendmail时不支持 -be参数的,如何测试主机上的sendmail是否支持-be扩展呢? 使用sendmail执行whoami,如果成功则没有问题:

58bfc33f68142cfc1e6c7e6840e47fc4.png

借用github中使用mail 实现命令执行的开源代码:

dd6d64c4ebde8d27c0faee67982256fa.png

除了mail函数,还有imap_open 函数在ssh建立连接可利用t代替空格进行-o ProxyCommand参数命令拼接,从而调用系统shell执行命令。示例代码如下:

9c878d143beb88296f80e5eeb6c7aea2.png

4.LD_PRELOAD

LD_PRELOAD 是Linux中比较特殊的环境变量,它允许用户指定程序运行前优先加载的动态链接库。在php中,可使用putenv()函数设置LD_PRELOAD环境变量来加载指定的so文件,so文件中包含自定义函数进行劫持从而达到执行恶意命令的目的。

mail() 、 error_log()、ImageMagick() 是常用于劫持的触发函数,原因是在运行的时候能够启动子进程,这样才能重新加载我们所设置的环境变量,从而劫持子进程所调用的库函数。

以mail函数为例:mail函数在运行时,会启动子进程来调用系统的sendmail,sendmail引用了getegid() 函数。

那么我们可以通过重写 getegid() 函数编译为so文件,代码内部执行了whoami:

f79bafddf8d68b75be8f346617fef08c.png

在利用过程中,通过设置LD_PRELOAD环境变量引入自定义的so库。由于真正的恶意代码运行在php之外的进程,自然避过了RASP监控。

79db1d4e5f4f61e4a4fe8c19e9041e2a.png

5. htaccess和mod_cgi

在apache的WEB环境中,我们经常会使用.htaccess这个文件来确定某个目录下的URL重写规则,如果.htaccess文件被攻击者修改的话,攻击者就可以利用apache的mod_cgi模块,直接绕过PHP来执行系统命令。需要满足四个条件:

  1. apache环境
  2. mod_cgi为启用状态
  3. 允许.htaccess文件,即在httpd.conf中,AllowOverride选项为All,而不是none
  4. 有权限写.htaccess文件

举个例子:

.htaccess内容:

f177dd37e1e3b72cbf61e59ac1607872.png

shell.tt

7a1f3cd2c59fb4ba352a79990909203f.png

6. PHP-FPM

PHP-FPM是一个fastcgi协议解析器,默认监听在9000端口。php-fpm由于未授权访问的设计缺陷,它没有相应的访问验证,因此 可以自己构造fastcgi协议,与php-fpm进行通信,让它帮我们干一些"坏事",比如动态加载上传的恶意php扩展。


FastCGI协议由多个record组成,和HTTP协议类似,也有header和body ,但是和HTTP头不同,record的头固定8个字节,body是由头中的contentLength指定,其结构如下:

1ce91605366846002e5d4721685c9a4f.png

在传入的FastCGI协议数据包中,设置 type=4,就可以给php-fpm传递环境参数,指挥它工作。

通过FastCGI协议告诉php-fpm去加载一个我们自定义的扩展,这涉及到php-fpm的两个环境变量,PHP_VALUEPHP_ADMIN_VALUE。这两个环境变量就是用来设置PHP配置项的,PHP_VALUE可以设置模式为PHP_INI_USERPHP_INI_ALL的选项,PHP_ADMIN_VALUE可以设置所有选项。我们只要发送如下类似的请求就可以实现扩展的自动加载。

d22872c264dba3b1f409927af77c202a.png

推荐几个项目,可以方便大家更好的操作:

  1. python实现的fastcgi client:https://github.com/wuyunfeng/Python-FastCGI-Client
  2. php实现的fastcgi client:https://github.com/adoy/PHP-FastCGI-Client
  3. php扩展生成:https://github.com/qiyeboy/arbitrary-php-extension

7. C接口

FFI(Foreign Function Interface)是 PHP7.4 新加入的功能,即外部函数接口,允许从共享库中调用C代码,导致风险点扩大。调用glibc中的system:

75c5827a818febc174b9a39debddd35b.png

8. 已知漏洞

php有一些已知的释放重引用漏洞,比如 GC UAF、Json Serializer UAF 、Backtrace UAF等,具体的exp位于https://github.com/mm0r1/exploits/

通过第一部分对 RASP(PHP)原理的讲解,我们知道PHP函数的底层调用都要通过CG(function_table)获取所调用函数的handler。无论 RASP 是hook opcode 还是 hook function,本质上都没有从内存中删除所调用的函数,只是改变了走向,指向了我们自定义的函数。正因如此,我们可以通过上述漏洞,找到内存中对应的函数地址,将其封装为闭包实现调用,从而完成绕过 。以 system函数为例,绕过原理简单总结如下图所示:

ffc84699b81d2bcb185e9571ad078341.png

对于 正常的php 文件 system("whoami")而言,由于php rasp 将function_table 函数指向从原来的zif_system 内置函数 改为 自定义的fake_system监控函数,导致命令执行在RASP的控制之下。而通过上述漏洞的方式,可以在内存中直接找到 zif_system函数地址,找到地址后,通过伪造闭包对象,将对象中的函数handler指向该地址,实现对 zif_system函数的调用,从而绕过RASP监控。

9. GOT 表劫持

在linux系统中,procfs 文件系统是个特殊的存在,对应的是 /proc目录,php 可以通过/proc 目录读写自己所在进程的内存,将非敏感函数地址替换成glibc 中的system地址,从而执行命令,其涉及的技术叫做 GOT表劫持。

通过正常函数实现敏感行为绕过 RASP ,举个例子,如果能将open函数地址换成system地址,那么便可以将fopen打开文件的命令,最终变成glibc调用system执行命令。

适用条件:

  1. 内核版本>=2.98
  2. 基于www权限的php-fpm/php-cgi work进程必须有权限读写 /proc/self/目录。
  3. open_basedir=off(或者能绕过open_basedir读写 /lib/ 和/proc/)

针对适用条件的第2点简要说明一下:

  • apache+php 由于 apache调用setuid设置www权限工作进程,/proc/self/目录属于root用户,导致没有权限读写。
  • nginx+php,对于低版本的php -fpm www权限工作进程, /proc/self/目录属于www用户可以读写。经不完全测试,php<5.6 版本是可以使用GOT表劫持。

下面简单描述一下劫持GOT表的步骤,以system替换open函数为例:

  1. 读取/proc/self/maps 找到php与glibc在内存中的基地址
  2. 解析/proc/self/exe 找到php文件中open@plt的偏移,解析libc.so找到system函数的偏移地址
  3. 解析 /proc/self/mem 定位 open@plt 对应open@got的地址,以及libc.so中system 函数的内存地址
  4. 将system 函数的内存地址 写入到 open@got里
  5. 主动调用fopen("/bin/whoami") ,即相当于调用 system("/bin/whoami")

不在文中放exp源码了,具体源码在前文提到的git仓库中,大家可以根据实际环境进行调试修改,并不通用。

四、总结

单纯就RASP本身而言,RASP的优点在于能嵌入在应用程序内部,应用代码无感知,更了解应用程序上下文,方便定位漏洞信息,更少的误报和漏报,对各种绕过手法具有更强的防护能力;但缺点在于PHP RASP会对服务器的性能造成影响,推动部署落地相对困难。不过随着DevSecOps理念的推广,未来借助于云、容器等成熟的大规模基础设施和技术,通过优化完全有可能提供更优雅更易于接受和使用的部署方案,能够带来更快更精准更细致入微的安全检查及防护能力。关于DevSecOps理念与思考,大家可以参考我们团队之前的文章: “安全需要每个工程师的参与”-DevSecOps理念及思考 。

虽然依然有一些对抗手段,但是RASP 在Web安全领域依然是现阶段强有力的存在。但是安全没有银弹,不存在一劳永逸的系统和办法,在漏洞/入侵检测上我们需要扫描器,WAF,IDS,EDR等系统的配合共建防御体系,纵深防御才是长久之道,并且需要持续研究在对抗中不断提升和发展。

参考文献:

https://www.cnblogs.com/zw1sh/p/12632126.htmlhttps://zhuanlan.zhihu.com/p/75114351?from_voters_page=truehttps://www.cnblogs.com/tr1ple/p/11213732.htmlhttps://www.freebuf.com/articles/others-articles/232329.htmlhttps://x-c3ll.github.io/posts/UAF-PHP-disable_functions/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中堆和栈有什么区别?

堆和栈都是Java用来在RAM中存放数据的地方。 一、堆 (1)Java的堆是一个运行时数据区&#xff0c;类的对象从堆中分配空间。这些对象通过new等指令建立&#xff0c;通过垃圾回收器来销毁。 (2)堆的优势是可以动态地分配内存空间&#xff0c;需要多少内存空间不必事先告诉编译…

台式机dp接口_精品导购:你想要的商务台式机 都在这里了!

不少公司都会为员工配备办公电脑&#xff0c;而公司在采购这些电脑时&#xff0c;兴许可能对电脑性能、存储容量等都没有研究过&#xff0c;只是图了价格便宜便批量采购&#xff0c;这就导致电脑在使用一段时间后&#xff0c;会频繁出现死机、运行卡顿和硬盘容量不够等情况的发…

roc曲线怎么绘制_ROC曲线和PR曲线

在机器学习中&#xff0c;ROC曲线被广泛应用于二分类问题中来评估分类器的可信度&#xff0c;当处理一些高度不均衡的数据集时&#xff0c;PR曲线能表现出更多的信息。在二分类问题中&#xff0c;分类器将一个实例的分类标记为正例还是负例&#xff0c;这可以用一个混淆矩阵来表…

华三交换机路由器图标_弱电箱网口不够用,用华三8口千兆交换机搞定

如题&#xff0c;公司租的办公室刚装修完&#xff0c;安了弱电箱&#xff0c;无奈联通只给了一个2口的光猫&#xff0c;如何不自己花钱买光猫的前提下&#xff0c;分配三间屋子的五个有线成了问题。之前考虑过直接路由器内置在弱电箱里&#xff0c;不过电箱金属盒有屏蔽和弱电箱…

i2c hid 触摸板不能用_零基础学硬件(6):I2C总线的用处

I2C总线的用处&#xff0c;什么时候需要用I2C总线这东西太简单了,我还有点不想说..不就是一个start一个STOP一个ACK嘛,,简单得不能在简单.他可以根据器件地址进行通信..当年在学校时看了很多这资料..什么时候需要用I2C总线&#xff0c;你的器件是IIC的器件,我就得用IIC总线..什…

problem a: 简单的整数排序_python里的排序

本篇文章主要讲&#xff1a;自定义规则排序 多字段排序开讲之前&#xff0c;先讲一些简单sorted()或者sort()&#xff0c;两者返回值不同&#xff01;例如&#xff1a;sorted([5, 2, 3, 1, 4]) # 输出&#xff1a;[1, 2, 3, 4, 5]另一个呢a [5, 2, 3, 1, 4] a.sort() a # 输出…

c++ 多态 运行时多态和编译时多态_C++核心编程 第十一节 多态

前言&#xff1a;多态是C面向对象三大特性之一。多态&#xff0c;指的是一个类实例的相同方法在不同情形有不同表现形式。具有不同内部结构的对象可以共享外部接口。C多态就是用一个更通用的基类指针指向不同的子类实例&#xff0c;为了能调用正确的方法&#xff0c;我们需要用…

多线程操作时操作系统时间片_从零开始自制操作系统(15):内核多线程

1.多线程原理&#xff1a;&#xff08;1&#xff09;概述&#xff1a;多线程是指CPU可以在一段时间中并行执行多个程序&#xff0c;比如我们可以一边听音乐、一边写代码&#xff08;这两个程序可以“同时进行”&#xff0c;我们称之为多进程&#xff0c;而多进程实现的本质就是…

打开git界面_使用 Gitea 快速搭建私有 Git 版本控制服务

1. 前言分布式版本控制工具 Git 已经是现代软件源代码版本控制首选方案之一。公有 Git 服务提供商 国外知名如 GitHub 国内网络延迟高,Gitlab 涉嫌对中国的歧视不推荐。国内有 Gitee、Coding 生态还不错。但是一般公司的源代码除非开源项目是不会放在公有 Git 服务上的。所以我…

dev项目属性按钮是灰色_Spring Boot 中的项目属性配置

阅读本文约需要5分钟大家好&#xff0c;我是你们的导师&#xff0c;我每天都会在这里给大家分享一些干货内容(当然了&#xff0c;周末也要允许老师休息一下哈)。上次老师跟大家分享了Spring Boot 如何使用 SLF4J 进行日志记录&#xff0c;今天跟大家分享一下 Spring Boot 中的项…

diskgenius扩容c盘重启电脑卡住_电脑开机显示:reboot and select proper boot device怎么办?...

今天就碰到有一个知友问&#xff0c;自己电脑开机就提示&#xff1a;reboot and select proper boot device&#xff0c;整个人都懵了&#xff0c;不知道怎么办?其实对于电脑出现问题&#xff0c;大家不要着急&#xff0c;坚哥就来为大家分析下原因以及试着去解决。第一种原因…

大并发下程序出错_Python并发编程理论篇

前言其实关于Python的并发编程是比较难写的一章&#xff0c;因为涉及到的知识很复杂并且理论偏多&#xff0c;所以在这里我尽量的用一些非常简明的语言来尽可能的将它描述清楚&#xff0c;在学习之前首先要记住一个点&#xff1a; 并发编程永远的宗旨就是提高程序的运行效率&am…

月薪30K程序员花了一个小时,用c++做出经典扫雷游戏 !

上次发过一个俄罗斯方块的游戏源码&#xff0c;由于是通过Easy X实现的&#xff0c;但是很多和我一样的新手&#xff0c;一开始不知道Easy X是什么&#xff0c;到时源码拿过去之后&#xff0c;运行报错&#xff0c;我这次发的扫雷&#xff0c; 也是通过Easy X实现&#xff0c;…

用python写web网页_从零开始,使用python快速开发web站点(1) | 学步园

环境&#xff1a;ubuntu 12.04 python版本: 2.73 ok,首先&#xff0c;既然是从零开始&#xff0c;我们需要的是一台可以运行的python的计算机环境&#xff0c;并且假设你已经安装好了python, 然后&#xff0c;既然是快速开发&#xff0c;必不可少的需要用到框架&#xff0c;py…

修改so_货代、海运操作、船务操作还分不清?船公司SO文件看不懂?

货代是货物代理&#xff08;freight forwarding agent&#xff09;的简称&#xff0c;是指经营受他人委托&#xff0c;为其提供代办运输手续&#xff0c;代提、代发、代运货物服务的业务。货物代理&#xff0c;有些是中间商就是自己没有船或者飞机的或者船公司、航空公司&#…

一行代码蒸发64亿人民币!黑客盯上区块链漏洞!Python真的变态!

此前认为&#xff0c;区块链技术由于分布存储、加密算法等技术的应用&#xff0c;拥有了不可篡改、可追溯等被认为是“万无一失”的特性。然而&#xff0c;该特性主要针对存储在区块中的信息来说&#xff0c;以文中开头的案例为例&#xff0c;区块链技术保障了可以追溯到这64亿…

太吾绘卷第一世攻略_建平中学高二数学周练卷(2020.09)

试卷图片仅供学习交流使用&#xff0c;答案仅供参考【往期内容】高一是坎, 高二是坡, 高三是峰! 最全学习攻略新高一数学教材必修第一册第一章习题答案往年高中9月开学考月考数学试卷汇总2020上海高考复交综评录取率top202020北京大学强基计划数学试题2020上海16区零志愿、名额…

自动补足算法是什么_数据、算法岗的几点经验分享!

learners | 作者Datawhale | 来源目录有哪些好的秋招经验分享&#xff1f;机器学习中常用的最优化方法有哪些&#xff1f;想通过数据竞赛来提升实践能力&#xff0c;作为小白有什么入门经验&#xff1f;(今日问题)有哪些好的秋招经验分享&#xff1f;1李玲 - 携程算法工程师(…

我精心珍藏的Python代码技巧

01.****简洁的表达式 image 点评&#xff1a;Python因为简洁高效而出名&#xff0c;就是因为语法非常简单&#xff0c;而且内置了很多强大的数据结构&#xff1a; 比如我们可以大量用推导列表来生成很多简洁的代码 比如我们可以用if else组合&#xff0c;本来需要2-3行代码写…

python函数和类的区别_Python中类中的方法还有区别?

上一篇&#xff0c;我们讲到Python类中的属性是有区别的&#xff0c;爱思考的小伙伴们可能就会问了&#xff0c;Python中的方法是不是也有区别呢&#xff1f;是的&#xff0c;而且Python中的方法区别更大&#xff0c;让我们来看看吧~ Python类中的三种方法 Python中的方法可以分…