一网打尽!每个程序猿都该了解的黑客技术大汇(4)

所谓栈溢出攻击,则是通过一些手段输入到栈中的缓冲区中,冲破缓冲区原有的界限,将存储返回地址的位置覆盖为一个数值,使其指向攻击者提前布置的恶意代码位置,劫持了程序的执行流程。

防御手段:现代操作系统针对栈溢出攻击已经有非常成熟的应对方案,像Linux平台的Stack Canary,Windows平台的GS机制等等,程序员需要做的就是充分利用这些机制。

重点关注:C/C++工程师

整数溢出攻击

和栈溢出攻击一样,整数溢出攻击也是属于溢出类攻击,不一样的是溢出的目标不是栈中的缓冲区,而是一个整数。

我们知道,计算机数值以补码的方式表示和存储。在表示一个有符号数时,最高位是用来表示这是一个正数(0)还是一个负数(1),比如对于一个16位的short变量而言,+1和-1的表示方法如下:

+1: 0000 0000 0000 0001 -1: 1111 1111 1111 1111

一个16位的short变量表示的范围是-32768~32767,现在思考一个问题,假如一个short变量的值现在是32767:

32767: 0111 1111 1111 1111

如果现在对其执行+1操作,将变成:

1000 0000 0000 0000

而这正是-32768的补码形式!

试想一下,如果这个变量名字叫length作为strcpy参数,或是叫index作为数组的下标,整数的溢出将导致可怕的后果,轻则进程崩溃,服务宕机,重则远程代码执行,拿下控制权。

重点关注:所有程序员

空指针攻击

空指针一般出现在指针没有初始化,或者使用new进行对象创建/内存分配时失败了,而粗心的程序员并没有检查指针是否为空而进行访问导致的攻击。

大多数情况下,这将导致内存地址访问异常,程序会崩溃退出,造成拒绝服务的现象

而在一些特殊的情况下,部分操作系统允许分配内存起始地址为0的内存页面,而攻击者如果提前在该页面准备好攻击代码,则可能出现执行恶意代码的风险。

释放后使用攻击

释放后使用Use After Free意为访问一个已经释放后的内存块。较多的出现在针对浏览器的JavaScript引擎的攻击中。

正常情况下,一个释放后的对象我们是没法再访问的,但如果程序员粗心大意,在delete对象后,没有即时对指针设置为NULL,在后续又继续使用该指针访问对象(比如通过对象的虚函数表指针调用虚函数),将出现内存访问异常。

在上面的场景中,如果攻击者在delete对象后,马上又new一个同样内存大小的对象,在现代操作系统的堆内存管理算法中,会有很大概率将这个新的对象放置于刚刚被delete的对象的位置处。这个时候还通过原来对象的指针去访问,将出现鸠占鹊巢,出现可怕的后果。

养成好的编程习惯,对象delete后,指针及时置空。

重点关注:C/C++工程师

HOOK

HOOK原意钩子的意思,在计算机编程中时常用到,用来改变原有程序执行流程。

在那个互联网充斥着流氓软件的年代,流行着一种键盘记录器的木马,用于记录用户键盘的输入,从而盗取密码,这其中QQ曾经是重灾区。

而实现这一功能的技术就是用到了HOOK技术,钩到了键盘敲击的事件消息。

除了消息HOOK,用得更多的是程序执行流程层面的HOOK。恶意代码被注入目标程序后,在函数入口处添加跳转指令,导致执行到此处的线程转而执行攻击者的代码,实现修改参数、过滤参数的目的。

一网打尽!每个程序猿都该了解的黑客技术大汇

HOOK技术不仅为黑客使用,安全软件用的更多,安全软件需要守护整个系统的安全防线,通过HOOK技术在各处敏感API处设立检查,从而抵御非法调用攻击行为。

另外,软件补丁技术中也时常用到HOOK技术,软件厂商发现原来程序漏洞后,通过HOOK,修改既有程序的执行逻辑,从而达到修复漏洞的目的。

重点关注:C/C++工程师

权限提升

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzfzd.html