打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
黑客为什么可以做到无需知道源码的情况下找出系统漏洞?
题目可能不能表达完整我的意思,大体来说是:我作为一个比较普通的程序员,要读懂一个别人的源码已经很不易了,还要从中找出漏洞。比如你把windows的源码放我面前,我肯定看晕了,别说找漏洞了,何况windows还不开源。linux开源,我看的也很晕,只能一点点扣。还有web方面,不知道别人服务器的源码,怎么找出别人服务器的程序上的漏洞的呢。所以我觉得黑客或者说安全人员一定有和软件开发者不同的视角。
hackerdx007
提问者估计是一个刚学会编程的菜鸟程序员,看见大段代码头就昏。问题很好,解答很难。
首先,为什么windows不开源还有那么多人研究呢,甚至比开源的Linux研究人员多的多?因为全世界运行windows的机器最多,大部分windows用户没有经过严格培训,只会使用鼠标键盘,Linux用户都要使用命令行,没几个用户是新手,开源的Linux也使得漏洞可以用最快的速度被修补,因为世界上有很多人在维护Linux。windows不开源,只能由微软负责维护和补丁更新。世界上有大把的程序员,但微软公司负责开发操作系统的人不超过五万(算上离职的也不会超过十万人),写操作系统内核的核心开发人员不超过1000人,你连写操作系统代码都不会只会写应用程序根本理解不了操作系统是如何运转的,要想入门还是先多看看操作系统的书吧,至少要理解操作系统是如何运行的,推荐先看看Linux的内核代码,有一定基础后再看《windows核心揭秘》。
其次,windows操作系统是用C/C++写的,很多程序员都使用高级语言写程序,对C和C++这些“中间语言”不熟悉不了解,不知道哪些函数容易溢出,使用哪些函数更安全或者可以替代不安全的函数。系统漏洞的精髓在于缓冲区溢出,缓冲区溢出说白了就是利用冯诺伊曼架构的缺陷——数据和代码存储在同一个设备内存中,让计算机错误的把数据当作代码来执行。在windows数据结构中有堆栈和堆都可以被溢出,在NT5.0之前的系统中根本没有防范机制,XPSP2引入了安全堆栈,在编译器中还有/GS选项,用于防止堆栈溢出,使得堆栈溢出非常困难,但并不是不可能,堆溢出仍然可以。
当熟练掌握了缓冲区溢出就可以对windows进行分析了,方法主要是“黑盒”与“白盒”。白盒就是当微软发布补丁之后用虚拟机分析补丁前后的代码级差别,找出漏洞,但是这些漏洞都是微软补丁过的,利用价值不大;黑盒分析则是在完全没有源码的情况下靠分析工具和人的经验来寻找漏洞,人的经验起决定作用,你必须知道程序员比较容易在哪些地方犯错误,包括使用不安全函数、边界检查不完整、竞争条件、SEH结构化异常错误处理和VEH向量化异常错误处理等操作系统内部的知识。黑盒分析找到的漏洞一般没有补丁,又称0day漏洞,据说这种漏洞在地下黑市上价值上万美元(任意代码可执行漏洞值这个价,其他的信息泄露或者提升权限价值就比较低了)。
当你能够找到windows的0day漏洞,特别是影响巨大的任意代码可执行漏洞的时候,你已经是站在程序员金字塔塔尖的一小群人了,找到漏洞之后就需要编写一小段shellcode来利用漏洞,这段代码条件非常苛刻,也许只针对特定的windowsSP版本有效,也许针对所有windows系统有效。对所有windows有效的shellcode一定是可移植的,换句话说shellcode必须能够通用化。可以把shellcode想象成一个侦察兵,一个先头空降部队,如何在茫茫黑夜中侦查操作系统防线的位置、火力点的分布情况,从哪里开始执行负载并且不会陷入操作系统的泥沼中淹死(这足可以写一本书来描述)shellcode只是一枚导弹的制导系统,它负载的炸药可能是一个在地上砸个坑的铅球,也可能是毁灭一座城市的核武器。
这也是最体现黑客技术水平的地方,同一个漏洞有的人编写的shellcode能实现通用化(具体要看漏洞的位置以及形成原因),有的人编写的根本不能运行或者极大影响系统速度。一般来说编写shellcode都使用汇编语言,极少数情况下还需要使用二进制代码。
当你掌握以上技能后,就将修炼终极绝技了,那就是无比困难的、一旦掌握就必将天下无敌的绝技——硬件漏洞,就比如intel最近的“融毁”和“幽灵”。如果说操作系统是计算机的灵魂,那CPU就是计算机的心脏。从层级上来说,一般程序员编写的应用程序运行在3级,操作系统运行在0级(最新情况是操作系统运行在-1级,0级运行虚拟机,intel叫vt-x技术,可以极大减少切换层级引起的系统开销)而CPU核心运行在-3级,拥有远超windows的权限,这才是计算机的终极命门,硬件漏洞通用性也无与伦比,因为桌面CPU就intel和amd能生产,CPU微代码不更新的话漏洞会一直存在(老式计算机只有更换CPU,而老机器更换CPU几乎不可能,因为主板不支持,需要更换主板代价太大得不偿失;三年内新式计算机可以更新UEFI微代码,也就是微软和intel提供的补丁)这就是撞击地球后足以毁灭世界的小行星级别的武器了。要找到这种级别漏洞光靠个人已经不可能,光需要的特殊硬件就不是个人买得起的,一般要大公司或者国家才能找到这种级别的漏洞。
最后,用三个我最喜欢的小例子来结尾吧。
1、当windows弹出著名的“程序引用了0x00000000地址,即将关闭”的错误提示的时候,普通程序员会顺从的点击确定关闭对话框,然后思考究竟是什么地方出了问题;聪明一些的程序员会利用windows内核转储来寻找问题的答案,不一定能解决问题;顶尖黑客则会用softice或者其他工具重现这个问题,必须把它解决,没准能写出shellcode。
2、impossible和i'm'possible从字母排列上都是一样的,但意思却是相反的,这就是缓冲区溢出的精髓,只添加了两个标点。impossible是单词,属于数据的范畴,I'm'possible是句子,属于代码的范畴,混淆数据与代码的界限,让计算机把数据当成代码执行,只需要缓冲区溢出两个标点而已。在计算机的世界中,复杂的、毫无规律的垃圾数据突然间组成了一幅美丽的图画,随着锁“卡嗒”一声,安全的大门缓缓打开,苦心经营的安全防线瞬间崩溃。
3、在电影《黑客帝国》中,普通的程序安安静静的运行在虚拟机中,少数像尼奥这样不安分的程序突破了虚拟机的安全机制,进入到了真实操作系统矩阵中,这时候操作系统的SEH异常错误处理机制史密斯登场了;后来尼奥发现矩阵也不是真实的操作系统,只不过是更高一级的虚拟机罢了(虚拟机嵌套),尼奥可以在矩阵中使用操作系统的特权指令消灭追杀来的乌贼机器人就证明了这一点;最后史密斯叛变,病毒几乎感染了操作系统的所有进程,尼奥牺牲自己帮助操作系统定位了史密斯的位置(病毒的PID),经过一轮内存杀毒和系统重启后,操作系统又回到了正常的状态。
留白说  科技、科学记者
每天活跃在互联网上的应用成百上千万,包括PC端以及目前越来越主流的移动端,不仅有通过浏览器访问的,还有需要安装客户端的,不仅有与服务器强交互的,还有独立运行的本地软件。
而这其中,开源的(包括开放源码的)产品少之又少。但,这并不妨碍一个黑客找出其中的漏洞。换句话说,找漏洞并不需要源码。
当然了,在有源码的情况下,挖洞是一件难度系数指数下降的事情。虽然读懂一个大型软件源码耗时又耗力,但对于黑客来说,可以略去其中大半的代码来阅读,只关心可能造成危险的部分。就像一名建筑工程师看一份大楼的施工图,要看懂大楼的结构、建筑材料、水电线路等等各方各面,而对于《Prison Break》中的Michael Scofield可能只关心地下管道的分布。
那么,在没有源码的情况下,黑客怎么挖洞呢?这种情况,我们可以称之为黑盒。而挖洞,的确需要与程序编辑者持有完全相反的角度和看法。对于输入输出点,程序猿考虑的是正确的输入获得正确的输出,而黑客则考虑特殊的非法输入获得异常的有价值输出。那系统登录来说,程序猿考虑的是用户输入注册的用户名、口令能够在登录时与数据库中的数据匹配成功,而黑客则会尝试引起数据库查询异常的输入作为用户名、口令内容,希望应用返回更多数据库中的有效数据。
对于黑客来说,不知道源码情况下,只要有输入就可以了,不管是应用具有的功能页面,还是一个输入接口,通过一种叫做模糊测试的技术就可以开始你的挖洞之旅。模糊测试可以构造一系列正常和异常的输入值,根据应用的返回来判断脆弱点的存在。
在黑客的武器库中,模糊测试只是其中一个利器,像什么漏扫、逆向、脱壳、注入、暴破等等不一而足。
作为程序猿,在编写程序时不仅要从正向角度完成应用的功能,还需要从黑客角度逆向分析应用在处理异常输入时的反应,才能做出高安全的应用。
超级王登科 美食问答达人
黑盒确实是比较难从外部攻破的,但是这也是渗透过程中非常非常非常常见的现象,如果每个目标网站或者目标系统,你都能拿到源代码,那,做这个还有什么乐趣可言呢?
首先回答一下答主的描述中的疑问,读懂源码已经很不容易了,何况还要从中找出漏洞。我的观点是,题主和黑客的心态不同,题主的心态是以读懂,学习为主,就像是一个学者,在考据东西,黑客的心态则不一样,黑客的心态是攻击性的,他不需要明白所有函数的作用,不需要知道上下的连接,左右的影响,他就像一个猎狗,只在乎自己最关心的部分,从这个部分往外推演,就像是抽丝剥茧般,找到自己需要的内容。例如一套网站系统,涉及到注册,登录,用户管理,文章发布,商品更新,订单管理,数据统计,仓储销售,这是一个非常庞大繁杂的系统,要完全吃下来, 非常耗费精力,可是黑客会把注意力放在输入输出上面,去找可能提权的地方,这么做的效率是非常高的。
现在来讲,如何做黑盒渗透。
所有黑盒,即便你不知道内部如何,但是必有输入输出,如果没有输入输出,那么再厉害的黑客也拿它没办法,但是话又说回来,一个系统没有输入输出,那对任何人也毫无价值,所以说,一切系统,都是有可能被渗透的。
不同的输入,可能会获得不同的输出,这是一切攻击渗透的前提,这里面大有学问,例如一个网站,我输入正确的用户密码,就可以登录成功,我输入错误的用户密码,则会提示密码错误,这就是根据不同的输入给出的不同输出,通过构造输入内容,获得输出反馈,可以揣测系统的内部工作流程,甚至直接推断出具体代码
这不是一件容易的事,但也不是不可以做到
Python雁横
为什么黑客能够找到漏洞?
我是一个学Python的web开发的,在web这方面我比较了解,所以主要从这方面去讲解,其他的其实也很类似,但不一样,可以进行类比。
web方面其实不是需要知道源码的,当然,你能够知道的话,那可能就更方便了。首先,黑客会去试探你的服务器,如何试探呢?通过进行一些合法的请求,通过你返回的这些信息中,能够得出你的服务器类型,你是用什么语言来写的(当然,这个判断不一定准)。
就如一个黑盒子,黑客不断地根据输入和输出,来了解你的整个web(或者说是服务器或者网站)。
在网站方面,很多的漏洞都出在输入上,有输入的地方,就需要去防止黑客。这是为什么呢?举个例子,如果一个博客,它有一个评论功能,你评论完成之后就会返回到这个页面上(就是可以看到你的评论),假如,你现在输入的评论不是一个正常的评论,而是一段代码(js,h5,sql语句都有可能),再如果,你没有对这些东西进行过滤或者转义的话,那么你就会将一个可能带有不可预测性的代码加入到你的网站里面了。(很可能用户只要进入这个页面,那么他的信息就会暴露,然后进一步感染电脑。)
再说一下,用前端框架很容易出现漏洞,因为防黑客的必须是后端,前端是为了用户体验,减小服务器压力,如果由于前端将这些过滤的事情做了,而后端由于疏忽没有去做,那么黑客是完全可以绕过前端的检测,攻击后端(你的服务器。)
另一个很重要的就是sql注入,比如一个请求,你是直接用这些参数去数据库取数据,那么如果这些参数是一个sql语句,修改你的数据库权限(通常是通过一些其他的信息来获取数据库的类型,如查看报错信息等等),如果你进行了过滤,但是不周全的话,可以进行转码,然后你的数据库还是会执行这些漏洞。
我的回答差不多就结束了,想要获取更多关于黑客的好玩的东西,可以关注我哦~~~~
还有一点点需要提一下,就是如果获取到了你的服务器,数据库,代码等等,黑客通常会先查看一下已经出现的漏洞,进行穷举法(一般是用黑客软件进行)。
再对于软件这方面的,一个是,通过下载了恶意软件(通过获取了权限,然后就可以完全掌控你的计算机),一般是伪造相似的软件,其实你的应用软件越多,留下的后门的可能性就越大,每个软件都有一定的权限,但是如果这些权限被黑客利用的话,就是一场浩劫了。
怪咖玩家
针对Web方面
在网络渗透工程师眼里,你说的这种行为通常被称为“黑盒测试”,这也是大部分黑(script)客(kid)最常用的测试手段。
在这种情况下,黑客进行黑盒测试的首要任务就是收集信息,尽可能的收集web网站的DNS、程序结构、数据库信息等等,为之后的渗透测试奠定基础。
下一步便是使用一些专业的扫描器如awvs nessus等,进行一些高危漏洞的扫描,同时进行手工检测,找一些扫描器容易忽略的地方进行利用。
最后把这些信息综合总结来进行利用。
上面是2017年总结的Owasp Top 10,也就是近几年间最流行的高危漏洞。
在我看来,黑盒测试为首当测试,没有什么特别的问题的话,白盒测试便更能挖掘出藏在深处的漏洞。
大学生编程指南  头条科技原创作者
首先黑客没有传说中大家想象的那么神奇,因为即使再牛逼的黑客起码也是一名标准的程序员,现在大家对于黑客的印象很多都被带沟里去了。真正的黑客除了是程序员之外还具备极客思想,这是黑客区别于普通程序员的唯一标记,也是最明显的标记。
事实中很多人觉得黑客能够随意进入别人的服务器做自己想做的事情,顺便给自己弄点好处,估计大家心目中黑客的想象和现实中骇客标准更加的贴近。真正搞破坏的是骇客,不是黑客所为,黑客在一定层面上还能促进网络安全的进步,会给一些政府或者企业善意的提醒促进进一步提升自身的网络安全。
所以不要只看到黑客光鲜的一面,背后无数的日子对着电脑解决探索问题的时间才是黑客绝大部分精力所在。
从楼主的描述看还处于程序员的初级阶段,能够读懂大段的代码是一个程序员必备的标准,而且源码的读取不是挨着一点点的来,靠对整个框架有个理解然后再去考虑阅读代码,做事情先有指导思想,有了大方向然后推断哪方面有问题,然后找到对应模块代码进行修改调试,再牛逼的黑客也需要经历这个过程。
另外黑客算是软件领域的安全科目,需要具备一定的安全基础,常见的网络TCP/IP,汇编语言,C语言基础,以及常见的安全知识都要具备,不仅仅是熟悉的那回事了,不知道楼主从事的什么技术行业用的什么编程语言,如果距离很远感觉很神秘也属于很正常的心里反映,所话说隔行如隔山。
想做点事情还是需要一定的积累。要想人前显贵学会背后受罪。
一个有情怀的码农 教育问答达人
首先题主的感觉是对的,黑客确实比普通开发或者普通安全人员有着不同的视角。
普通测试人员一般对程序进行黑盒测试,也就是功能测试,数据驱动测试,或者规格说明测试。通过使用整个软件或某种软件功能来严格地测试, 而并没有通过检查程序的源代码或者很清楚地了解该软件的源代码程序具体是怎样设计的。测试人员通过输入他们的数据然后看输出的结果从而了解软件怎样工作。而一般的安全人员测试基本从白盒测试开始,也就是通过程序的源代码进行测试而不使用用户界面。这种类型的测试需要从代码句法发现内部代码在算法,溢出,路径,条件等等中的缺点或者错误,进而加以修正。对于黑客,他们挖洞的方式绝对不仅仅限于黑白盒测试,除了一些常规挖洞方式,比如sql注入、请求截获,参量,穷举ddos,xss漏洞等,黑客们还有一套他们自己编写的一套扫描漏洞的程序,他们挖洞的视角是全局视角,任何程序都不可能做的天衣无缝,黑客们总会在某个细微的地方找到漏洞。打个比方,普通测试用肉眼,而黑客们用的是显微镜。
另外,任何自称为黑客的人对各种底层技术研究得比较深入。
比如http请求的底层原理,要经历多少次握手多少次响应,每次携带什么类型的数据包,怎么才能截获数据包……平时我们见到的外挂程序很多都基于此,基本上都是截获篡改数据包。还有一方面,黑客的成长过程也会研究各种sdk的源码,特别是涉及程序安全的源码,然后有针对性编写一套套各种各样扫描漏洞的程序,以此帮助他们发现漏洞。
作为一个码农,接触的圈子里有不少研究安全的,当然他们还算不上黑客,仅仅是把别人的服务搞down机或者破解一些账号看看下程序后台到底有什么东西,以此作为可以吹牛或炫耀的谈资,没做什么伤天害理的事。
最后我想说的是,黑客和安全人员都是程序世界不可或缺的。黑客的攻,安全的防,一攻一防才推动着程序安全技术不断革新和发展,这种攻防模式才使得我们这些程序开发人员在编写代码时时刻保持警惕和审慎的态度,编写好每一行安全的代码。
Dofa说道
看了几个已经回答过的朋友的答案,实在是驴唇不对马嘴。问者问的是,不知道源码的情况下是怎么找到bug的,这里的bug应该不是局限在web,而是软件或者系统方面。
首先说明,我不是搞it的,但我相信我可以给问者一个较为满意的解释。
如果你对网络安全感兴趣,肯定知道以前的流光,灰鸽子,如果不知道,那可能你太年轻了。流光是当年国内非常流行的探测漏洞并加以利用的黑客软件,包括了web和系统,作者流光也是国内网络安全数一数二的人物,目前在做研究。这是题外话,我要说的是,仅仅依赖于别人的工具进行攻击或者渗透,个人觉得没什么技术含量的。
如果你感兴趣,我推荐metasploit。
话题回到问者的问题,寻找漏洞的确需要读懂作者的代码,假如读不懂的话,做一名出色的安全工作者至少在我看来功力还远远不够,至少还不入门。
问者疑惑那些大神是怎么做到的,这里要看你对程序的理解程度,其实一门语言和平台你足够了解的话,即使没有注释还是能读懂的,而且很容易,唯一的难点可能是算法的复杂。所以,要读懂代码,可以从库函数这种方式去入手分析整段代码,这是常用的办法。
再次,其实真正的安全人员必备的素质,不是仅仅读源代码,而是汇编,好了这里回到问题的关键,讲到汇编千万不要认为那是老掉牙的语言,那可错了,做信息安全,定会分析病毒代码,病毒源代码你不可能拿到的,那么唯一的办法就是虚拟机把病毒的机器码逆向翻译成汇编,专业名词叫逆向工程,craker,其实也是一样的技术。所以,问者问是怎么读懂源代码的,不是源代码,是逆向工程里的汇编代码。这是作为安全工作者必会的技术。
能够逆向,基本可以分析大部分的软件,甚至系统底层代码。当然,这里要会的技术还很多,比如解密技术,软件是加壳的,你必须破解才能得到纯正的代码。
再次,其实软件漏洞是有规律可循的,如今软件安全性测试,有基本的黑盒和白盒,黑盒技术中有一种fuzzing测试,意思就是对要测试的模块输入畸形数据,然后查找漏洞,这是寻找漏洞较为快的方法,当年ie漏洞就是用这种方法找到的,当然具体的技术原理我个人还在研究过程中。
那么说到白盒测试,就是读代码,代码分析,这里讲软件漏洞的几种常见类型,其实大部分的漏洞也是这几种形式,黑盒原理也是用的这几种,包括,栈溢出,这是最为常见的漏洞形式,堆溢出,这种难度有点大,整数溢出,数组越界,释放重引用,重释放,如果不明白,推荐一本大神的书,漏洞原理,自己去看。
如果以上弄明白了,可以看看国外的大神写的,捉虫日记,此书的作者就是读源码找漏洞的。
以上是软件漏洞的大体的寻找方法,至于web,常见的其实是注入,但如今基本找不到了,除非网站技术特别马虎,因为只要过滤严格,注入基本不太可能。或者是跨站,那也是因为标志符关闭不严。那么剩下的,就是基于软件漏洞的渗透,比如ftp协议,邮件协议,或者阅读器等等,一旦被攻破或者打开了带有恶意代码的文件,感染病毒,被植入后门,其实就等于把大门打开了,然后为所欲为。
社保工作者  巫溪县社会保险局稽核督查科副科长
WEB方面已经很多人回答过了,我就不再重复。我在来现在的工作岗位以前,因个人爱好从事过漏洞挖掘工作。
首先我们知道,任何程序,计算机在执行的时候都是二进制的,二进制可以直接翻译成汇编语言,因为汇编是对二进制的助记符,这个是没有任何难度的。
在没有源码的情况下,我们可以通过调试工具跟踪程序的执行,调试工具会把程序执行的每一步都翻译成汇编代码呈现给我们。常用的调试工具在ring3级有ollydbg,静态分析工具IDA等,这个层面主要是挖掘应用程序的漏洞,比如………网络游戏(我已经退出江湖很多年了,别问我怎么做,也没有保留源代码了)。
windows等操作程序静态分析可以在使用IDA将相关的dll文件等系统文件进行静态分析,动态跟踪就要在ring0级进行调试了,早期我们一般使用softice,现在都是windbg,双机联调或者虚拟机。
熟练的调试人员阅读这些汇编代码,很容易就能翻译成自己熟悉的任何一种高级语言代码,比如C语言,甚至易语言。通过反汇编,我们可以发现一部分简单的,低级的漏洞,通过动态跟踪可以修改相应的参数来验证漏洞,也可以发现新的漏洞。在熟练的技术,知识储备之外,更多的……发现漏洞还靠运气!
互联网稻草人
最简单明了的答案就是。所有电脑程序都需要通过编程语言来实现系统的构建。但所有编程语言都逃不了程序语法和运算逻辑等要点。简单举例asp,php语言等动态web语言。这些程序语言在俾发明者创造出的时候就已经存在一些语法或者逻辑上的问题。而黑客就是最熟悉这些程序语言的人群之一,所以他们会根据每个目标系统的特点,再通过已知的编程语言逻辑上存在的逻辑漏洞对系统进行测试。当然,编程语言的逻辑漏洞是可以通过规范的程序编写来避免错误。但现今的信息系统架构尤其复杂,已经不是以前的一两个静态页面那么简单了,所以很容易就会产生漏洞的。总结:有些系统漏洞是因人为的不规范导致的,也有些是因为系统工程庞大而出现的逻辑漏洞。而黑客就是通过寻找这些漏洞从而实现目的。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
微软警告Win XP用户:若不升级将遭“零日漏洞”攻击
微软警告XP用户:若不升级永遭zero day攻击
【CHIP安全】Heap Spray:高危漏洞的垫脚石
Windows、macOS和Linux正遭受重大安全漏洞影响
ActiveX
电脑及网络基础知识
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服